package vpc

import (
	"context"

	globalcommonv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/common/v1"
	globaldedicatedv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/dedicated/v1"
	tidbmgmtservicev1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_mgmt_service/v1"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
	"github.com/tidbcloud/tidb-management-service/utilities/grpc/metadata"
)

func (s *serverImpl) AddSecondaryCidr(
	ctx context.Context,
	req *tidbmgmtservicev1.AddSecondaryCidrRequest,
) (*globaldedicatedv1.Vpc, error) {
	if req.GetVpcId() == "" {
		return nil, bizerr.New(bizerr.ErrCodeParams, "vpc_id is required")
	}

	if req.GetSecondaryCidr() == "" {
		return nil, bizerr.New(bizerr.ErrCodeParams, "secondary_cidr is required")
	}

	// check provider and region
	if req.GetCloudProviderName() == globalcommonv1.CloudProvider_NAME_UNSPECIFIED {
		return nil, bizerr.New(bizerr.ErrCodeParams, "cloud_provider_name is required")
	}

	if req.GetRegionName() == globalcommonv1.Region_NAME_UNSPECIFIED {
		return nil, bizerr.New(bizerr.ErrCodeParams, "region_name is required")
	}
	if req.GetProjectId() == 0 || req.GetOrganizationId() == 0 {
		return nil, bizerr.New(bizerr.ErrCodeParams, "project_id or organization_id is required")
	}

	addSecondaryCidrReq := &globaldedicatedv1.AddSecondaryCidrRequest{
		ProjectId:         req.GetProjectId(),
		OrganizationId:    req.GetOrganizationId(),
		SecondaryCidr:     req.GetSecondaryCidr(),
		CloudProviderName: req.GetCloudProviderName().String(),
		RegionName:        req.GetRegionName().String(),
		VpcId:             req.GetVpcId(),
		ValidateOnly:      req.GetValidateOnly(),
	}
	// gen request meta and append to outgoing meta
	ctx = metadata.AppendToOutgoingMeta(ctx, &metadata.RequestMeta{
		OrgID:            req.OrganizationId,
		DefaultProjectID: req.ProjectId,
		ValidProjectList: []uint64{req.ProjectId},
		UserID:           "0",
	})

	resp, err := s.dedicatedCli.AddSecondaryCidr(ctx, addSecondaryCidrReq)
	if err != nil {
		return nil, err
	}

	return resp, nil
}

func (s *serverImpl) ListVpcs(
	ctx context.Context,
	req *tidbmgmtservicev1.ListVpcsRequest,
) (*tidbmgmtservicev1.ListVpcsResponse, error) {
	if req.GetProjectId() == 0 || req.GetOrganizationId() == 0 {
		return nil, bizerr.New(bizerr.ErrCodeParams, "project_id or organization_id is required")
	}

	resp, err := s.dedicatedCli.ListVpcs(ctx, &globaldedicatedv1.ListVpcsRequest{
		ProjectId:        req.GetProjectId(),
		OrganizationId:   req.GetOrganizationId(),
		CloudProviderIds: req.GetCloudProviderIds(),
		RegionIds:        req.GetRegionIds(),
	})
	if err != nil {
		return nil, err
	}

	return &tidbmgmtservicev1.ListVpcsResponse{
		Vpcs: resp.Vpcs,
	}, nil
}
