package project

import (
	"context"
	"fmt"

	"github.com/go-logr/logr"
	"go.uber.org/dig"

	"github.com/tidbcloud/devops/pkg/infra/clients/coresvccli"
	"github.com/tidbcloud/devops/pkg/infra/config"
	"github.com/tidbcloud/devops/pkg/service"
	globalcommonv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/common/v1"
	dedicatedv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/dedicated/v1"
	mgmtv1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_mgmt_service/v1"
)

var _ ProjectService = &svc{}

type ServiceParam struct {
	dig.In

	Conf      *config.RootConfig
	Logger    logr.Logger
	CorSvcCli *coresvccli.CoreSvcCli
}

type ServiceResult struct {
	dig.Out

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

type svc struct {
	*service.BaseService

	coreSvcCli *coresvccli.CoreSvcCli
}

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

func (s *svc) ListVPCs(ctx context.Context, param *ListVPCsRequest) (*mgmtv1.ListVpcsResponse, error) {
	providerName := getProvider(param.Provider)

	req := &mgmtv1.ListVpcsRequest{
		OrganizationId: param.OrgID,
		ProjectId:      param.ProjectID,
		CloudProviderIds: []globalcommonv1.CloudProvider_Name{
			providerName,
		},
	}
	var region globalcommonv1.Region_Name
	if param.Provider == "aws" && len(param.Region) > 0 {
		region = globalcommonv1.Region_AWS_US_WEST_2
		req.RegionIds = []globalcommonv1.Region_Name{
			region,
		}
	}
	fmt.Println("get list req", req)
	resp, err := s.coreSvcCli.Mgmt.Vpc.ListVpcs(ctx, req)
	if err != nil {
		return nil, err
	}
	return resp, nil
}

func (s *svc) AddSecondaryCidr(ctx context.Context, param *mgmtv1.AddSecondaryCidrRequest) (*dedicatedv1.Vpc, error) {
	vpc, err := s.coreSvcCli.Mgmt.Vpc.AddSecondaryCidr(ctx, param)
	if err != nil {
		return nil, err
	}
	return vpc, nil
}

func getProvider(provider string) globalcommonv1.CloudProvider_Name {
	fmt.Println("get provider", provider)
	providerName := globalcommonv1.CloudProvider_NAME_UNSPECIFIED
	switch provider {
	case "aws":
		providerName = globalcommonv1.CloudProvider_AWS
	case "gcp":
		providerName = globalcommonv1.CloudProvider_GCP
	case "azure":
		providerName = globalcommonv1.CloudProvider_AZURE
	case "alicloud":
		providerName = globalcommonv1.CloudProvider_ALICLOUD
	}
	return providerName
}
