package converter

import (
	"encoding/json"

	"github.com/AlchemyTelcoSolutions/callisto-so-bff/internal/domain/model"
	SOProto "github.com/AlchemyTelcoSolutions/proto/gen/go/callisto/so/v1"
	"github.com/jinzhu/copier"
	"google.golang.org/protobuf/encoding/protojson"
)

func ToStructFromCallistoApiClientUpdate(soCreate *model.CallistoApiResponse) (*model.UpdateBffResponse, error) {
	jsonBytes, err := json.Marshal(soCreate.SOData)
	if err != nil {
		return nil, err
	}
	updateBFF := &model.UpdateBffResponse{}
	err = json.Unmarshal(jsonBytes, updateBFF)
	if err != nil {
		return nil, err
	}
	return updateBFF, nil
}

// ToProtoFromCallistoApiClientCreate convert the callisto api response into a proto CreateSaleOrderRequest
func ToProtoFromCallistoApiClientCreate(soCreate *model.CallistoApiResponse) (*SOProto.CreateSaleOrderRequest, error) {
	jsonBytes, err := json.Marshal(soCreate.SOData)
	if err != nil {
		return nil, err
	}
	proto := &SOProto.CreateSaleOrderRequest{}
	err = protojson.Unmarshal(jsonBytes, proto)
	if err != nil {
		return nil, err
	}
	return proto, nil
}

// FromProtoToSummaryResponse convert proto summary response itu SO Summary response
func FromProtoToSummaryResponse(proto *SOProto.GetSummaryResponse) (*model.SaleOrderSummaryResponse, error) {
	result := model.SOSummaryStatusResponse{
		Details: make([]model.SOSummaryDetailResponse, 0),
	}

	// copying grpc response to result
	err := copier.Copy(&result, proto)
	if err != nil {
		return nil, err
	}

	return &model.SaleOrderSummaryResponse{Status: result}, nil
}

func ToProtoGetAsnData(shipmentID uint64) *SOProto.GetAsnDataRequest {
	proto := &SOProto.GetAsnDataRequest{
		ShipmentId: uint64(shipmentID),
	}
	return proto
}

func ToProtoGetShipments(orderReference string) *SOProto.GetShipmentsRequest {
	proto := &SOProto.GetShipmentsRequest{
		OrderRef: orderReference,
	}
	return proto
}
