package testclient

import (
	"fmt"
	"net/http"

	v1 "github.com/AlchemyTelcoSolutions/callisto-so-bff/api/v1"
	"github.com/AlchemyTelcoSolutions/callisto-so-bff/integration_tests/fakes"
	"github.com/AlchemyTelcoSolutions/callisto-so-bff/internal/domain/model"
)

// PostCreateSaleOrder is a integration test function for CreateFromCart
func (c Client) PostCreateSaleOrder(message string) (*v1.PostSaleOrdersRestResponse, error) {
	w := newCustomResponseWriter()
	req := newRequestBuilder(http.MethodPost)
	req, err := req.withJson(fmt.Sprintf(fakes.ApiRequestFromCart, message))
	if err != nil {
		return nil, err
	}
	r := req.getRequest()
	c.client.CreateFromCart(w, r)
	o, err := InterceptBody(w, v1.PostSaleOrdersRestResponse{})
	return o, err
}

// PatchCreateSaleOrderFromAuction is a integration test function for CreateFromAcution
func (c Client) PatchCreateSaleOrderFromAuction(bidID string) (*v1.PutBidAwardWinnerResponse, error) {
	w := newCustomResponseWriter()
	req := newRequestBuilder(http.MethodPut)
	req, err := req.withJson(fakes.ApiRequestFromAuction)
	if err != nil {
		return nil, err
	}
	r := req.getRequest()
	c.client.CreateFromAuction(w, r, bidID)
	o, err := InterceptBody(w, v1.PutBidAwardWinnerResponse{})
	return o, err
}

// GetSOSummary is an integration test for GetSOSummary
func (c Client) GetSOSummary(apiCase string) (*v1.Response, error) {
	w := newCustomResponseWriter()
	var req *requestBuilder

	switch apiCase {
	case fakes.SuccessProxy:
		req = newRequestBuilderWithUrl(http.MethodGet, "/v1/sale-orders/summary/proxy/success")
	case fakes.ErrorUnauthorized:
		req = newRequestBuilderWithUrl(http.MethodGet, "/v1/sale-orders/summary/proxy/unauthorized")
	case fakes.APIFailed:
		req = newRequestBuilderWithUrl(http.MethodGet, "/v1/sale-orders/summary/proxy/failed")
	default:
		req = newRequestBuilder(http.MethodGet)
	}

	r := req.getRequest()

	result := model.SaleOrderSummaryResponse{
		Status: model.SOSummaryStatusResponse{
			Details: []model.SOSummaryDetailResponse{},
			Groups:  model.SOSummaryGroupResponse{},
		},
	}

	resp := v1.Response{
		Success: true,
		Result:  result,
	}

	if apiCase == fakes.ErrorUnauthorized {
		resp.Success = false
	}

	c.client.GetSOSummary(w, r)

	o, err := InterceptBody(w, resp)

	return o, err
}

func (c Client) ExportASNToFile(orderReference v1.OrderReference, params v1.ExportASNToFileParams) (*model.ProxyResponse, error) {
	w := newCustomResponseWriter()
	req := newRequestBuilder(http.MethodGet)
	r := req.getRequest()
	c.client.ExportASNToFile(w, r, orderReference, params)

	return &model.ProxyResponse{
		StatusCode: w.statusCode,
		Header: map[string]string{
			"Content-Disposition": w.header.Get("Content-Disposition"),
			"Content-Type":        w.header.Get("Content-Type"),
		},
		BodyBytes: w.body,
	}, nil
}
