package mgmtportal

import (
	"context"

	"go.uber.org/dig"

	"github.com/go-logr/logr"
	"github.com/tidbcloud/devops/pkg/infra/clients/coresvccli"
	"github.com/tidbcloud/devops/pkg/infra/config"
	"github.com/tidbcloud/devops/pkg/service"
	"github.com/tidbcloud/devops/pkg/service/configcenter/repo"
	"github.com/tidbcloud/pkgv2/db"
	mgmtv1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_mgmt_service/v1"
)

var _ MgmtPortalService = &svc{}

type ServiceParam struct {
	dig.In

	Conf       *config.RootConfig
	Logger     logr.Logger
	DBProvider db.TransProvider
	CorSvcCli  *coresvccli.CoreSvcCli
}

type ServiceResult struct {
	dig.Out

	API     MgmtPortalServiceAPI
	Service service.Service `group:"service"`
}

type svc struct {
	*service.BaseService

	dbp        db.TransProvider
	cfgctrRepo repo.ConfigCenterRepo
	coreSvcCli *coresvccli.CoreSvcCli
}

func NewService(p ServiceParam) (ServiceResult, error) {
	base := service.NewBaseService("MgmtPortalService")
	s := &svc{
		BaseService: base,
		dbp:         p.DBProvider,
		cfgctrRepo:  repo.NewConfigCenterReop(p.DBProvider),
		coreSvcCli:  p.CorSvcCli,
	}
	return ServiceResult{API: s, Service: s}, nil
}

func (s *svc) ListSpus(ctx context.Context, param *mgmtv1.ListSpusRequest) (*mgmtv1.ListSpusResponse, error) {
	resp, err := s.coreSvcCli.Mgmt.SpuSku.ListSpus(ctx, param)
	if err != nil {
		return nil, err
	}
	return resp, nil
}

func (s *svc) CreateSpu(ctx context.Context, param *mgmtv1.CreateSpuRequest) (*mgmtv1.Spu, error) {
	resp, err := s.coreSvcCli.Mgmt.SpuSku.CreateSpu(ctx, param)
	if err != nil {
		return nil, err
	}
	return resp, nil
}

func (s *svc) ListComputeMus(ctx context.Context, param *mgmtv1.ListComputeMusRequest) (*mgmtv1.ListComputeMusResponse, error) {
	resp, err := s.coreSvcCli.Mgmt.SpuSku.ListComputeMus(ctx, param)
	if err != nil {
		return nil, err
	}
	return resp, nil
}
func (s *svc) ListStorageMus(ctx context.Context, param *mgmtv1.ListStorageMusRequest) (*mgmtv1.ListStorageMusResponse, error) {
	resp, err := s.coreSvcCli.Mgmt.SpuSku.ListStorageMus(ctx, param)
	if err != nil {
		return nil, err
	}
	return resp, nil
}

func (s *svc) ListSkus(ctx context.Context, param *mgmtv1.ListSkusRequest) (*mgmtv1.ListSkusResponse, error) {
	resp, err := s.coreSvcCli.Mgmt.SpuSku.ListSkus(ctx, param)
	if err != nil {
		return nil, err
	}
	return resp, nil
}

func (s *svc) CreateSku(ctx context.Context, param *mgmtv1.CreateSkuRequest) (*mgmtv1.Sku, error) {
	resp, err := s.coreSvcCli.Mgmt.SpuSku.CreateSku(ctx, param)
	if err != nil {
		return nil, err
	}
	return resp, nil
}

func (s *svc) PatchSpu(ctx context.Context) error {
	return nil
}
func (s *svc) PatchSku(ctx context.Context) error {
	return nil
}
