package service

import (
	"context"
	"github.com/UpmeshLTD/urus-aio/shipment/config"
	"github.com/UpmeshLTD/urus-aio/shipment/domain/address"
	"github.com/UpmeshLTD/urus-aio/shipment/domain/business_profile"
	"github.com/UpmeshLTD/urus-aio/shipment/domain/courier"
	"github.com/UpmeshLTD/urus-aio/shipment/domain/delivery_plan"
	"github.com/UpmeshLTD/urus-aio/shipment/domain/flash_express_pickup"
	"github.com/UpmeshLTD/urus-aio/shipment/domain/pickup_point"
	"github.com/UpmeshLTD/urus-aio/shipment/domain/publisher"
	"github.com/UpmeshLTD/urus-aio/shipment/domain/shipment"
	"github.com/UpmeshLTD/urus-aio/shipment/domain/shipment_status_log"
	"github.com/UpmeshLTD/urus-aio/shipment/domain/webhook"
	"github.com/UpmeshLTD/urus-aio/shipment/external/mdm"
	"github.com/UpmeshLTD/urus-aio/shipment/external/paid_order"
	"github.com/UpmeshLTD/urus-aio/shipment/external/pdf"
	"github.com/UpmeshLTD/urus-aio/shipment/external/shipment/factory"
	"github.com/UpmeshLTD/urus-aio/shipment/log"
	"github.com/gin-gonic/gin"
)

//go:generate mockery --name=Service --case=snake
type Service interface {
	iHealthCheck
	iAddress
	iCourier
	iPickupPoint
	iShipment
	iSellerCourier
	iWebhook
	iDeliveryPlan
	iBusinessProfile

	// GRPC
	iGRPC
}

type serviceImpl struct {
	config                   config.Config
	logger                   log.Logger
	addressDomain            address.Service
	courierDomain            courier.Service
	pickupPointDomain        pickup_point.Service
	shipmentDomain           shipment.Service
	shipmentStatusLogDomain  shipment_status_log.Service
	flashExpressPickupDomain flash_express_pickup.Service
	externalShipmentFactory  factory.IExternalShipmentFactory
	webhookDomain            webhook.Service
	deliveryPlanDomain       delivery_plan.Service
	businessProfileDomain    business_profile.Service
	mdmClient                mdm.Service
	pdfClient                pdf.Service
	paidOrderClient          paid_order.Service
	publisherDomain          publisher.Service
}

func NewService(
	config config.Config,
	logger log.Logger,
	addressDomain address.Service,
	courierDomain courier.Service,
	pickupPointDomain pickup_point.Service,
	shipmentDomain shipment.Service,
	shipmentStatusLogDomain shipment_status_log.Service,
	flashExpressPickupDomain flash_express_pickup.Service,
	webhookDomain webhook.Service,
	externalShipmentFactory factory.IExternalShipmentFactory,
	deliveryPlanDomain delivery_plan.Service,
	businessProfileDomain business_profile.Service,
	mdmClient mdm.Service,
	pdfClient pdf.Service,
	paidOrderClient paid_order.Service,
	publisherDomain publisher.Service,
) Service {
	return &serviceImpl{
		config:                   config,
		logger:                   logger,
		addressDomain:            addressDomain,
		courierDomain:            courierDomain,
		pickupPointDomain:        pickupPointDomain,
		shipmentDomain:           shipmentDomain,
		shipmentStatusLogDomain:  shipmentStatusLogDomain,
		flashExpressPickupDomain: flashExpressPickupDomain,
		externalShipmentFactory:  externalShipmentFactory,
		webhookDomain:            webhookDomain,
		deliveryPlanDomain:       deliveryPlanDomain,
		businessProfileDomain:    businessProfileDomain,
		mdmClient:                mdmClient,
		pdfClient:                pdfClient,
		paidOrderClient:          paidOrderClient,
		publisherDomain:          publisherDomain,
	}
}

func getCtx(c *gin.Context) context.Context {
	return c.Request.Context()
}
