package mdm

import (
	"context"

	mdmpb "github.com/UpmeshLTD/urus-aio/shipment/external/mdm/pb"

	"github.com/UpmeshLTD/urus-aio/shipment/config"
	"github.com/UpmeshLTD/urus-aio/shipment/log"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
)

type Service interface {
	GetCountryByID(ctx context.Context, request *mdmpb.GetCountryByIDRequest) (*mdmpb.GetCountryResponse, error)
	GetCountryByCode(ctx context.Context, request *mdmpb.GetCountryByCodeRequest) (*mdmpb.GetCountryResponse, error)
}

type serviceImpl struct {
	cc     *grpc.ClientConn
	client mdmpb.MdmServiceClient
	logger log.Logger
}

func NewService(cfg config.Config, logger log.Logger) (Service, error) {
	address := cfg.GetGRPCConfig().MdmAddress
	cc, err := grpc.Dial(
		address,
		grpc.WithTransportCredentials(insecure.NewCredentials()))

	if err != nil {
		logger.Errorw("initializing MDM client failed", "address", address, "error", err)
		return nil, err
	}

	client := mdmpb.NewMdmServiceClient(cc)

	return &serviceImpl{
		cc:     cc,
		client: client,
		logger: logger,
	}, nil
}

func (s *serviceImpl) GetCountryByID(ctx context.Context, request *mdmpb.GetCountryByIDRequest) (*mdmpb.GetCountryResponse, error) {
	return s.client.GetCountryByID(ctx, request)
}

func (s *serviceImpl) GetCountryByCode(ctx context.Context, request *mdmpb.GetCountryByCodeRequest) (*mdmpb.GetCountryResponse, error) {
	return s.client.GetCountryByCode(ctx, request)
}
