package integration_test

import (
	"testing"

	v1 "github.com/AlchemyTelcoSolutions/callisto-so-bff/api/v1"
	"github.com/AlchemyTelcoSolutions/callisto-so-bff/integration_tests/expect"
	"github.com/AlchemyTelcoSolutions/callisto-so-bff/integration_tests/fakes"
	suiteclient "github.com/AlchemyTelcoSolutions/callisto-so-bff/integration_tests/suite-client"
	"github.com/stretchr/testify/suite"
)

type saleOrderCreateSuite struct {
	suite.Suite
	ClientGenerator *suiteclient.ClientGenerator
}

func (s *saleOrderCreateSuite) TestSaleOrderCreateFromCart() {
	t := s.T()

	tests := []struct {
		name    string
		caseAPI string
		assert  func(t *testing.T, resp *v1.PostSaleOrdersRestResponse)
	}{
		{
			name:    "POST_SALE_ORDER_HAPPY_PATH",
			caseAPI: fakes.Success,
			assert: func(t *testing.T, resp *v1.PostSaleOrdersRestResponse) {
				expect.ValidSaleOrdersResponse(t, *resp, v1.PostSaleOrdersRestResponse{Success: true})
			},
		},
		{
			name:    "POST_SALE_NO_BFF_API_SUSCCESS_RESPONSE",
			caseAPI: fakes.NoBFFResponse,
			assert: func(t *testing.T, resp *v1.PostSaleOrdersRestResponse) {
				expect.ValidSaleOrdersResponse(t, *resp, v1.PostSaleOrdersRestResponse{Success: true})
			},
		},
		{
			name:    "POST_CREATE_UNAUTHORIZED",
			caseAPI: fakes.ErrorUnauthorized,
			assert: func(t *testing.T, resp *v1.PostSaleOrdersRestResponse) {
				expect.BadRequestError(t, *resp, v1.PostSaleOrdersRestResponse{
					Success: false,
					Error: &map[string]interface{}{
						"code":    float64(401),
						"message": "Unauthorized",
					},
				})
			},
		},
		{
			name:    "POST_CREATE_INVALID_BFF",
			caseAPI: fakes.InvalidBFF,
			assert: func(t *testing.T, resp *v1.PostSaleOrdersRestResponse) {
				expect.ValidSaleOrdersResponse(t, *resp, v1.PostSaleOrdersRestResponse{Success: true})
			},
		},
		{
			name:    "POST_CREATE_BFF_NO_ORDERS",
			caseAPI: fakes.BFFNoOrders,
			assert: func(t *testing.T, resp *v1.PostSaleOrdersRestResponse) {
				expect.ValidSaleOrdersResponse(t, *resp, v1.PostSaleOrdersRestResponse{Success: true})
			},
		},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			cli := s.ClientGenerator.NewClient(t)
			resp := cli.SaleOrderCreate(test.caseAPI)
			test.assert(t, resp)
		})
	}
}

func (s *saleOrderCreateSuite) TestSaleOrderCreateFromAuction() {
	t := s.T()

	tests := []struct {
		name    string
		caseAPI string
		assert  func(t *testing.T, resp *v1.PutBidAwardWinnerResponse)
	}{
		{
			name:    "PUT_AWARD_AUCTION_CREATE_SALE_ORDER_HAPPY_PATH",
			caseAPI: fakes.Success,
			assert: func(t *testing.T, resp *v1.PutBidAwardWinnerResponse) {
				expect.ValidSaleOrdersResponse(t, *resp, v1.PutBidAwardWinnerResponse{Success: true})
			},
		},
		{
			name:    "PUT_AWARD_AUCTION_CREATE_NO_BFF_API_SUSCCESS_RESPONSE",
			caseAPI: fakes.NoBFFResponse,
			assert: func(t *testing.T, resp *v1.PutBidAwardWinnerResponse) {
				expect.ValidSaleOrdersResponse(t, *resp, v1.PutBidAwardWinnerResponse{Success: true})
			},
		},
		{
			name:    "PUT_AWARD_AUCTION_UNAUTHORIZED",
			caseAPI: fakes.ErrorUnauthorized,
			assert: func(t *testing.T, resp *v1.PutBidAwardWinnerResponse) {
				expect.BadRequestError(t, *resp, v1.PutBidAwardWinnerResponse{
					Success: false,
					Error: &map[string]interface{}{
						"code":    float64(401),
						"message": "Unauthorized",
					},
				})
			},
		},
		{
			name:    "PUT_AWARD_AUCTION_CREATE_INVALID_BFF",
			caseAPI: fakes.InvalidBFF,
			assert: func(t *testing.T, resp *v1.PutBidAwardWinnerResponse) {
				expect.ValidSaleOrdersResponse(t, *resp, v1.PutBidAwardWinnerResponse{Success: true})
			},
		},
		{
			name:    "PUT_AWARD_AUCTION_BFF_NO_ORDERS",
			caseAPI: fakes.BFFNoOrders,
			assert: func(t *testing.T, resp *v1.PutBidAwardWinnerResponse) {
				expect.ValidSaleOrdersResponse(t, *resp, v1.PutBidAwardWinnerResponse{Success: true})
			},
		},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			cli := s.ClientGenerator.NewClient(t)
			resp := cli.SaleOrderCreateFromAuction(test.caseAPI)
			test.assert(t, resp)
		})
	}
}
