package vpc

import (
	"context"

	regionaldedicatedv1 "github.com/tidbcloud/infra-provider/api/tidbcloud/regional-server/v1"

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

func (s *serviceImpl) DeleteVpc(ctx context.Context, req *globaldedicatedv1.DeleteVpcRequest) bizerr.BizError {
	ctx, span := tracer.Start(ctx, "Domain.DeleteVpc")
	defer span.End()

	// check project id and organization id
	if req.ProjectId == 0 && req.OrganizationId == 0 {
		return bizerr.New(bizerr.ErrCodeParams, "project id or organization id is required")
	}

	orgId := req.OrganizationId
	if req.ProjectId != 0 {
		project, err := s.accountCli.GetProject(ctx, req.ProjectId)
		if err != nil {
			return err
		}
		if req.OrganizationId != 0 && project.TenantID != req.OrganizationId {
			return bizerr.New(bizerr.ErrCodeParams, "organization id not match")
		}
		orgId = project.TenantID
	}

	if req.VpcId == "" {
		return bizerr.New(bizerr.ErrCodeParams, "vpc_id is required")
	}

	region, err := s.regionRepo.SelectRegionById(ctx, req.RegionId, orgId)
	if err != nil {
		return err
	}

	if region.State != globalcommonv1.Region_ACTIVE {
		return bizerr.New(bizerr.ErrCodePermission, "region is not active")
	}

	if region.CloudProviderId != req.CloudProviderId {
		return bizerr.New(bizerr.ErrCodeParams, "cloud provider id not match")
	}

	err = s.regionServerCli.DeleteVpc(ctx, region, &regionaldedicatedv1.DeleteVpcRequest{VpcId: req.VpcId})
	if err != nil {
		return err
	}
	return nil
}
