package privatelink

import (
	"context"

	"go.opentelemetry.io/otel"

	globalcommonv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/common/v1"
	globalserverlessv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/serverless/v1"
	regionalserverlessv1 "github.com/tidbcloud/tidb-management-service/api/spec/regional/serverless/v1"
	"github.com/tidbcloud/tidb-management-service/serverless-global-service/domain/adapter"
)

var Tracer = otel.Tracer("DomainService.PrivateLinkConnection")

type Service interface {
	CreateAWSVpcEndpoint(
		ctx context.Context,
		req *globalserverlessv1.CreateAWSVpcEndpointRequest,
		projectId uint64,
		clusterId string,
		region *globalcommonv1.Region,
	) (*globalserverlessv1.CreateAWSVpcEndpointResponse, error)
	DescribeAWSVpcEndpoint(
		ctx context.Context,
		req *globalserverlessv1.DescribeAWSVpcEndpointRequest,
		projectId uint64,
		clusterId string,
		region *globalcommonv1.Region,
	) (*globalserverlessv1.DescribeAWSVpcEndpointResponse, error)
	DeleteAWSVpcEndpoint(
		ctx context.Context,
		req *globalserverlessv1.DeleteAWSVpcEndpointRequest,
		projectId uint64,
		clusterId string,
		region *globalcommonv1.Region,
	) error

	CreateAliCloudVpcEndpoint(
		ctx context.Context,
		req *globalserverlessv1.CreateAliCloudVpcEndpointRequest,
		projectId uint64,
		clusterId string,
		region *globalcommonv1.Region,
	) (*globalserverlessv1.CreateAliCloudVpcEndpointResponse, error)
	DescribeAliCloudVpcEndpoint(
		ctx context.Context,
		req *globalserverlessv1.DescribeAliCloudVpcEndpointRequest,
		projectId uint64,
		clusterId string,
		region *globalcommonv1.Region,
	) (*globalserverlessv1.DescribeAliCloudVpcEndpointResponse, error)
	DeleteAliCloudVpcEndpoint(
		ctx context.Context,
		req *globalserverlessv1.DeleteAliCloudVpcEndpointRequest,
		projectId uint64,
		clusterId string,
		region *globalcommonv1.Region,
	) error

	GetZoneIds(
		ctx context.Context,
		req *globalserverlessv1.GetZoneIdsRequest,
		projectId uint64,
		clusterId string,
		region *globalcommonv1.Region,
	) (*globalserverlessv1.GetZoneIdsResponse, error)
	ListAliCloudVpcEndpointZones(
		ctx context.Context,
		req *globalserverlessv1.ListAliCloudVpcEndpointZonesRequest,
		projectId uint64,
		clusterId string,
		region *globalcommonv1.Region,
	) (*globalserverlessv1.ListAliCloudVpcEndpointZonesResponse, error)
	RemoveAliCloudZoneFromVpcEndpoint(
		ctx context.Context,
		req *globalserverlessv1.RemoveAliCloudZoneFromVpcEndpointRequest,
		projectId uint64,
		clusterId string,
		region *globalcommonv1.Region,
	) error
	CreateAliCloudDNSRecord(
		ctx context.Context,
		req *globalserverlessv1.CreateAliCloudDNSRecordRequest,
		region *globalcommonv1.Region,
	) (*globalserverlessv1.CreateAliCloudDNSRecordResponse, error)
	DeleteAliCloudDNSRecord(
		ctx context.Context,
		req *globalserverlessv1.DeleteAliCloudDNSRecordRequest,
		region *globalcommonv1.Region,
	) error
	CreateAWSRoute53Records(
		ctx context.Context,
		req *globalserverlessv1.CreateAWSRoute53RecordsRequest,
		region *globalcommonv1.Region,
	) (*globalserverlessv1.CreateAWSRoute53RecordsResponse, error)
	DeleteAWSRoute53Records(
		ctx context.Context,
		req *globalserverlessv1.DeleteAWSRoute53RecordsRequest,
		region *globalcommonv1.Region,
	) (*globalserverlessv1.DeleteAWSRoute53RecordsResponse, error)
	GetAWSRoute53Change(
		ctx context.Context,
		req *globalserverlessv1.GetAWSRoute53ChangeRequest,
		region *globalcommonv1.Region,
	) (*globalserverlessv1.GetAWSRoute53ChangeResponse, error)
	CreateAWSRoute53PrivateHostedZone(
		ctx context.Context,
		req *globalserverlessv1.CreateAWSRoute53PrivateHostedZoneRequest,
		projectId uint64,
		clusterId string,
		region *globalcommonv1.Region,
	) (*globalserverlessv1.CreateAWSRoute53PrivateHostedZoneResponse, error)
	DeleteAWSRoute53PrivateHostedZone(
		ctx context.Context,
		req *globalserverlessv1.DeleteAWSRoute53PrivateHostedZoneRequest,
		projectId uint64,
		clusterId string,
		region *globalcommonv1.Region,
	) (*globalserverlessv1.DeleteAWSRoute53PrivateHostedZoneResponse, error)
	CreateAliCloudDNSPrivateHostedZone(
		ctx context.Context,
		req *globalserverlessv1.CreateAliCloudDNSPrivateHostedZoneRequest,
		projectId uint64,
		clusterId string,
		region *globalcommonv1.Region,
	) (*globalserverlessv1.CreateAliCloudDNSPrivateHostedZoneResponse, error)
	DeleteAliCloudDNSPrivateHostedZone(
		ctx context.Context,
		req *globalserverlessv1.DeleteAliCloudDNSPrivateHostedZoneRequest,
		projectId uint64,
		clusterId string,
		region *globalcommonv1.Region,
	) (*globalserverlessv1.DeleteAliCloudDNSPrivateHostedZoneResponse, error)
	AttachVpcToAliCloudDNSPrivateHostedZone(
		ctx context.Context,
		req *globalserverlessv1.AttachVpcToAliCloudDNSPrivateHostedZoneRequest,
		projectId uint64,
		clusterId string,
		region *globalcommonv1.Region,
	) (*globalserverlessv1.AttachVpcToAliCloudDNSPrivateHostedZoneResponse, error)
	DetachVpcFromAliCloudDNSPrivateHostedZone(
		ctx context.Context,
		req *globalserverlessv1.DetachVpcFromAliCloudDNSPrivateHostedZoneRequest,
		projectId uint64,
		clusterId string,
		region *globalcommonv1.Region,
	) (*globalserverlessv1.DetachVpcFromAliCloudDNSPrivateHostedZoneResponse, error)
	CreateMSKVPCConnection(
		ctx context.Context,
		req *globalserverlessv1.CreateMSKVPCConnectionRequest,
		projectId uint64,
		clusterId string,
		region *globalcommonv1.Region,
	) (*globalserverlessv1.CreateMSKVPCConnectionResponse, error)
	DeleteMSKVPCConnection(
		ctx context.Context,
		req *globalserverlessv1.DeleteMSKVPCConnectionRequest,
		projectId uint64,
		clusterId string,
		region *globalcommonv1.Region,
	) (*globalserverlessv1.DeleteMSKVPCConnectionResponse, error)
	GetMSKVPCConnection(
		ctx context.Context,
		req *globalserverlessv1.GetMSKVPCConnectionRequest,
		projectId uint64,
		clusterId string,
		region *globalcommonv1.Region,
	) (*globalserverlessv1.GetMSKVPCConnectionResponse, error)
}

type plcServiceImpl struct {
	regionalSvc adapter.RegionalService
}

func NewPrivateLinkConnectionService(regionalSvc adapter.RegionalService) Service {
	return &plcServiceImpl{
		regionalSvc: regionalSvc,
	}
}

func (s *plcServiceImpl) CreateAWSVpcEndpoint(
	ctx context.Context,
	req *globalserverlessv1.CreateAWSVpcEndpointRequest,
	projectId uint64,
	clusterId string,
	region *globalcommonv1.Region,
) (*globalserverlessv1.CreateAWSVpcEndpointResponse, error) {
	ctx, span := Tracer.Start(ctx, "Domain.CreateAWSVpcEndpoint")
	defer span.End()

	res, err := s.regionalSvc.CreateAWSVpcEndpoint(ctx, region,
		&regionalserverlessv1.CreateAWSVpcEndpointRequest{
			EndpointServiceName:   req.GetEndpointServiceName(),
			EndpointServiceRegion: req.GetEndpointServiceRegion(),
			ProjectId:             projectId,
			ClusterId:             clusterId,
		})
	if err != nil {
		return nil, err
	}
	return &globalserverlessv1.CreateAWSVpcEndpointResponse{
		Endpoint: res.Endpoint,
	}, nil
}

func (s *plcServiceImpl) DescribeAWSVpcEndpoint(
	ctx context.Context,
	req *globalserverlessv1.DescribeAWSVpcEndpointRequest,
	projectId uint64,
	clusterId string,
	region *globalcommonv1.Region,
) (*globalserverlessv1.DescribeAWSVpcEndpointResponse, error) {
	ctx, span := Tracer.Start(ctx, "Domain.DescribeAWSVpcEndpoint")
	defer span.End()

	res, err := s.regionalSvc.DescribeAWSVpcEndpoint(ctx, region,
		&regionalserverlessv1.DescribeAWSVpcEndpointRequest{
			EndpointId: req.GetEndpointId(),
			ProjectId:  projectId,
			ClusterId:  clusterId,
		})
	if err != nil {
		return nil, err
	}
	return &globalserverlessv1.DescribeAWSVpcEndpointResponse{
		Endpoint: res.Endpoint,
	}, nil
}

func (s *plcServiceImpl) DeleteAWSVpcEndpoint(
	ctx context.Context,
	req *globalserverlessv1.DeleteAWSVpcEndpointRequest,
	projectId uint64,
	clusterId string,
	region *globalcommonv1.Region,
) error {
	ctx, span := Tracer.Start(ctx, "Domain.DeleteAWSVpcEndpoint")
	defer span.End()

	_, err := s.regionalSvc.DeleteAWSVpcEndpoint(ctx, region,
		&regionalserverlessv1.DeleteAWSVpcEndpointRequest{
			EndpointId: req.GetEndpointId(),
			ProjectId:  projectId,
			ClusterId:  clusterId,
		})
	return err
}

func (s *plcServiceImpl) CreateAliCloudVpcEndpoint(
	ctx context.Context,
	req *globalserverlessv1.CreateAliCloudVpcEndpointRequest,
	projectId uint64,
	clusterId string,
	region *globalcommonv1.Region,
) (*globalserverlessv1.CreateAliCloudVpcEndpointResponse, error) {
	ctx, span := Tracer.Start(ctx, "Domain.CreateAliCloudVpcEndpoint")
	defer span.End()

	res, err := s.regionalSvc.CreateAliCloudVpcEndpoint(ctx, region,
		&regionalserverlessv1.CreateAliCloudVpcEndpointRequest{
			EndpointServiceName: req.GetEndpointServiceName(),
			ProjectId:           projectId,
			ClusterId:           clusterId,
		})
	if err != nil {
		return nil, err
	}
	return &globalserverlessv1.CreateAliCloudVpcEndpointResponse{
		Endpoint: res.Endpoint,
	}, nil
}

func (s *plcServiceImpl) DescribeAliCloudVpcEndpoint(
	ctx context.Context,
	req *globalserverlessv1.DescribeAliCloudVpcEndpointRequest,
	projectId uint64,
	clusterId string,
	region *globalcommonv1.Region,
) (*globalserverlessv1.DescribeAliCloudVpcEndpointResponse, error) {
	ctx, span := Tracer.Start(ctx, "Domain.DescribeAliCloudVpcEndpoint")
	defer span.End()

	res, err := s.regionalSvc.DescribeAliCloudVpcEndpoint(ctx, region,
		&regionalserverlessv1.DescribeAliCloudVpcEndpointRequest{
			EndpointId: req.GetEndpointId(),
			ProjectId:  projectId,
			ClusterId:  clusterId,
		})
	if err != nil {
		return nil, err
	}
	return &globalserverlessv1.DescribeAliCloudVpcEndpointResponse{
		Endpoint: res.Endpoint,
	}, nil
}

func (s *plcServiceImpl) DeleteAliCloudVpcEndpoint(
	ctx context.Context,
	req *globalserverlessv1.DeleteAliCloudVpcEndpointRequest,
	projectId uint64,
	clusterId string,
	region *globalcommonv1.Region,
) error {
	ctx, span := Tracer.Start(ctx, "Domain.DeleteAliCloudVpcEndpoint")
	defer span.End()

	_, err := s.regionalSvc.DeleteAliCloudVpcEndpoint(ctx, region,
		&regionalserverlessv1.DeleteAliCloudVpcEndpointRequest{
			EndpointId: req.GetEndpointId(),
			ProjectId:  projectId,
			ClusterId:  clusterId,
		})
	return err
}

func (s *plcServiceImpl) GetZoneIds(
	ctx context.Context,
	req *globalserverlessv1.GetZoneIdsRequest,
	projectId uint64,
	clusterId string,
	region *globalcommonv1.Region,
) (*globalserverlessv1.GetZoneIdsResponse, error) {
	ctx, span := Tracer.Start(ctx, "Domain.GetZoneIds")
	defer span.End()

	res, err := s.regionalSvc.GetZoneIds(ctx, region,
		&regionalserverlessv1.GetZoneIdsRequest{
			ProjectId:  projectId,
			ClusterId:  clusterId,
			Kubernetes: req.GetKubernetes(),
		})
	if err != nil {
		return nil, err
	}
	return &globalserverlessv1.GetZoneIdsResponse{
		ZoneIds:   res.ZoneIds,
		AccountId: res.AccountId,
	}, nil
}

func (s *plcServiceImpl) ListAliCloudVpcEndpointZones(
	ctx context.Context,
	req *globalserverlessv1.ListAliCloudVpcEndpointZonesRequest,
	projectId uint64,
	clusterId string,
	region *globalcommonv1.Region,
) (*globalserverlessv1.ListAliCloudVpcEndpointZonesResponse, error) {
	ctx, span := Tracer.Start(ctx, "Domain.ListAliCloudVpcEndpointZones")
	defer span.End()

	res, err := s.regionalSvc.ListAliCloudVpcEndpointZones(ctx, region,
		&regionalserverlessv1.ListAliCloudVpcEndpointZonesRequest{
			EndpointId: req.GetEndpointId(),
			ProjectId:  projectId,
			ClusterId:  clusterId,
		})
	if err != nil {
		return nil, err
	}
	return &globalserverlessv1.ListAliCloudVpcEndpointZonesResponse{
		Zones: res.Zones,
	}, nil
}

func (s *plcServiceImpl) RemoveAliCloudZoneFromVpcEndpoint(
	ctx context.Context,
	req *globalserverlessv1.RemoveAliCloudZoneFromVpcEndpointRequest,
	projectId uint64,
	clusterId string,
	region *globalcommonv1.Region,
) error {
	ctx, span := Tracer.Start(ctx, "Domain.RemoveAliCloudZoneFromVpcEndpoint")
	defer span.End()

	_, err := s.regionalSvc.RemoveAliCloudZoneFromVpcEndpoint(ctx, region,
		&regionalserverlessv1.RemoveAliCloudZoneFromVpcEndpointRequest{
			EndpointId: req.GetEndpointId(),
			ZoneId:     req.GetZoneId(),
			ProjectId:  projectId,
			ClusterId:  clusterId,
		})
	return err
}

func (s *plcServiceImpl) CreateAliCloudDNSRecord(
	ctx context.Context,
	req *globalserverlessv1.CreateAliCloudDNSRecordRequest,
	region *globalcommonv1.Region,
) (*globalserverlessv1.CreateAliCloudDNSRecordResponse, error) {
	ctx, span := Tracer.Start(ctx, "Domain.CreateAliCloudDNSRecord")
	defer span.End()

	res, err := s.regionalSvc.CreateAliCloudDNSRecord(ctx, region,
		&regionalserverlessv1.CreateAliCloudDNSRecordRequest{
			Record:         req.GetRecord(),
			Value:          req.GetValue(),
			HostedZoneName: req.GetHostedZoneName(),
			HostedZoneId:   req.GetHostedZoneId(),
		})
	if err != nil {
		return nil, err
	}
	return &globalserverlessv1.CreateAliCloudDNSRecordResponse{
		RecordId: res.RecordId,
	}, nil
}

func (s *plcServiceImpl) DeleteAliCloudDNSRecord(
	ctx context.Context,
	req *globalserverlessv1.DeleteAliCloudDNSRecordRequest,
	region *globalcommonv1.Region,
) error {
	ctx, span := Tracer.Start(ctx, "Domain.DeleteAliCloudDNSRecord")
	defer span.End()

	_, err := s.regionalSvc.DeleteAliCloudDNSRecord(ctx, region,
		&regionalserverlessv1.DeleteAliCloudDNSRecordRequest{
			RecordId: req.GetRecordId(),
		})
	return err
}

func (s *plcServiceImpl) CreateAWSRoute53Records(
	ctx context.Context,
	req *globalserverlessv1.CreateAWSRoute53RecordsRequest,
	region *globalcommonv1.Region,
) (*globalserverlessv1.CreateAWSRoute53RecordsResponse, error) {
	ctx, span := Tracer.Start(ctx, "Domain.CreateAWSRoute53Records")
	defer span.End()

	res, err := s.regionalSvc.CreateAWSRoute53Records(ctx, region,
		&regionalserverlessv1.CreateAWSRoute53RecordsRequest{
			Records:        req.GetRecords(),
			HostedZoneName: req.GetHostedZoneName(),
			HostedZoneId:   req.GetHostedZoneId(),
		})
	if err != nil {
		return nil, err
	}
	return &globalserverlessv1.CreateAWSRoute53RecordsResponse{
		ChangeId: res.ChangeId,
	}, nil
}

func (s *plcServiceImpl) DeleteAWSRoute53Records(
	ctx context.Context,
	req *globalserverlessv1.DeleteAWSRoute53RecordsRequest,
	region *globalcommonv1.Region,
) (*globalserverlessv1.DeleteAWSRoute53RecordsResponse, error) {
	ctx, span := Tracer.Start(ctx, "Domain.DeleteAWSRoute53Records")
	defer span.End()

	res, err := s.regionalSvc.DeleteAWSRoute53Records(ctx, region,
		&regionalserverlessv1.DeleteAWSRoute53RecordsRequest{
			Records:        req.GetRecords(),
			HostedZoneName: req.GetHostedZoneName(),
			HostedZoneId:   req.GetHostedZoneId(),
		})
	if err != nil {
		return nil, err
	}
	return &globalserverlessv1.DeleteAWSRoute53RecordsResponse{
		ChangeId: res.ChangeId,
	}, nil
}

func (s *plcServiceImpl) GetAWSRoute53Change(
	ctx context.Context,
	req *globalserverlessv1.GetAWSRoute53ChangeRequest,
	region *globalcommonv1.Region,
) (*globalserverlessv1.GetAWSRoute53ChangeResponse, error) {
	ctx, span := Tracer.Start(ctx, "Domain.GetAWSRoute53Change")
	defer span.End()

	res, err := s.regionalSvc.GetAWSRoute53Change(ctx, region,
		&regionalserverlessv1.GetAWSRoute53ChangeRequest{
			ChangeId: req.GetChangeId(),
		})
	if err != nil {
		return nil, err
	}
	return &globalserverlessv1.GetAWSRoute53ChangeResponse{
		ChangeId: res.ChangeId,
		State:    res.State,
	}, nil
}

func (s *plcServiceImpl) CreateAWSRoute53PrivateHostedZone(
	ctx context.Context,
	req *globalserverlessv1.CreateAWSRoute53PrivateHostedZoneRequest,
	projectId uint64,
	clusterId string,
	region *globalcommonv1.Region,
) (*globalserverlessv1.CreateAWSRoute53PrivateHostedZoneResponse, error) {
	ctx, span := Tracer.Start(ctx, "Domain.CreateAWSRoute53PrivateHostedZone")
	defer span.End()

	res, err := s.regionalSvc.CreateAWSRoute53PrivateHostedZone(ctx, region,
		&regionalserverlessv1.CreateAWSRoute53PrivateHostedZoneRequest{
			HostedZoneName: req.GetHostedZoneName(),
			ProjectId:      projectId,
			ClusterId:      clusterId,
		})
	if err != nil {
		return nil, err
	}
	return &globalserverlessv1.CreateAWSRoute53PrivateHostedZoneResponse{
		HostedZoneId: res.HostedZoneId,
	}, nil
}

func (s *plcServiceImpl) DeleteAWSRoute53PrivateHostedZone(
	ctx context.Context,
	req *globalserverlessv1.DeleteAWSRoute53PrivateHostedZoneRequest,
	projectId uint64,
	clusterId string,
	region *globalcommonv1.Region,
) (*globalserverlessv1.DeleteAWSRoute53PrivateHostedZoneResponse, error) {
	ctx, span := Tracer.Start(ctx, "Domain.DeleteAWSRoute53PrivateHostedZone")
	defer span.End()

	_, err := s.regionalSvc.DeleteAWSRoute53PrivateHostedZone(ctx, region,
		&regionalserverlessv1.DeleteAWSRoute53PrivateHostedZoneRequest{
			HostedZoneId: req.GetHostedZoneId(),
			ProjectId:    projectId,
			ClusterId:    clusterId,
		})
	if err != nil {
		return nil, err
	}
	return &globalserverlessv1.DeleteAWSRoute53PrivateHostedZoneResponse{}, nil
}

func (s *plcServiceImpl) CreateAliCloudDNSPrivateHostedZone(
	ctx context.Context,
	req *globalserverlessv1.CreateAliCloudDNSPrivateHostedZoneRequest,
	projectId uint64,
	clusterId string,
	region *globalcommonv1.Region,
) (*globalserverlessv1.CreateAliCloudDNSPrivateHostedZoneResponse, error) {
	ctx, span := Tracer.Start(ctx, "Domain.CreateAliCloudDNSPrivateHostedZone")
	defer span.End()

	res, err := s.regionalSvc.CreateAliCloudDNSPrivateHostedZone(ctx, region,
		&regionalserverlessv1.CreateAliCloudDNSPrivateHostedZoneRequest{
			HostedZoneName: req.GetHostedZoneName(),
			ProjectId:      projectId,
			ClusterId:      clusterId,
		})
	if err != nil {
		return nil, err
	}
	return &globalserverlessv1.CreateAliCloudDNSPrivateHostedZoneResponse{
		HostedZoneId: res.HostedZoneId,
	}, nil
}

func (s *plcServiceImpl) DeleteAliCloudDNSPrivateHostedZone(
	ctx context.Context,
	req *globalserverlessv1.DeleteAliCloudDNSPrivateHostedZoneRequest,
	projectId uint64,
	clusterId string,
	region *globalcommonv1.Region,
) (*globalserverlessv1.DeleteAliCloudDNSPrivateHostedZoneResponse, error) {
	ctx, span := Tracer.Start(ctx, "Domain.DeleteAliCloudDNSPrivateHostedZone")
	defer span.End()

	_, err := s.regionalSvc.DeleteAliCloudDNSPrivateHostedZone(ctx, region,
		&regionalserverlessv1.DeleteAliCloudDNSPrivateHostedZoneRequest{
			HostedZoneId: req.GetHostedZoneId(),
			ProjectId:    projectId,
			ClusterId:    clusterId,
		})
	if err != nil {
		return nil, err
	}
	return &globalserverlessv1.DeleteAliCloudDNSPrivateHostedZoneResponse{}, nil
}

func (s *plcServiceImpl) AttachVpcToAliCloudDNSPrivateHostedZone(
	ctx context.Context,
	req *globalserverlessv1.AttachVpcToAliCloudDNSPrivateHostedZoneRequest,
	projectId uint64,
	clusterId string,
	region *globalcommonv1.Region,
) (*globalserverlessv1.AttachVpcToAliCloudDNSPrivateHostedZoneResponse, error) {
	ctx, span := Tracer.Start(ctx, "Domain.AttachVpcToAliCloudDNSPrivateHostedZone")
	defer span.End()

	_, err := s.regionalSvc.AttachVpcToAliCloudDNSPrivateHostedZone(ctx, region,
		&regionalserverlessv1.AttachVpcToAliCloudDNSPrivateHostedZoneRequest{
			HostedZoneId: req.GetHostedZoneId(),
			ProjectId:    projectId,
			ClusterId:    clusterId,
		})
	if err != nil {
		return nil, err
	}
	return &globalserverlessv1.AttachVpcToAliCloudDNSPrivateHostedZoneResponse{}, nil
}

func (s *plcServiceImpl) DetachVpcFromAliCloudDNSPrivateHostedZone(
	ctx context.Context,
	req *globalserverlessv1.DetachVpcFromAliCloudDNSPrivateHostedZoneRequest,
	projectId uint64,
	clusterId string,
	region *globalcommonv1.Region,
) (*globalserverlessv1.DetachVpcFromAliCloudDNSPrivateHostedZoneResponse, error) {
	ctx, span := Tracer.Start(ctx, "Domain.DetachVpcFromAliCloudDNSPrivateHostedZone")
	defer span.End()

	_, err := s.regionalSvc.DetachVpcFromAliCloudDNSPrivateHostedZone(ctx, region,
		&regionalserverlessv1.DetachVpcFromAliCloudDNSPrivateHostedZoneRequest{
			HostedZoneId: req.GetHostedZoneId(),
			ProjectId:    projectId,
			ClusterId:    clusterId,
		})
	if err != nil {
		return nil, err
	}
	return &globalserverlessv1.DetachVpcFromAliCloudDNSPrivateHostedZoneResponse{}, nil
}

func (s *plcServiceImpl) CreateMSKVPCConnection(
	ctx context.Context,
	req *globalserverlessv1.CreateMSKVPCConnectionRequest,
	projectId uint64,
	clusterId string,
	region *globalcommonv1.Region,
) (*globalserverlessv1.CreateMSKVPCConnectionResponse, error) {
	ctx, span := Tracer.Start(ctx, "Domain.CreateMSKVPCConnection")
	defer span.End()

	res, err := s.regionalSvc.CreateMSKVPCConnection(ctx, region,
		&regionalserverlessv1.CreateMSKVPCConnectionRequest{
			MskArn:     req.GetMskArn(),
			ProjectId:  projectId,
			ClusterId:  clusterId,
			Kubernetes: req.GetKubernetes(),
		})
	if err != nil {
		return nil, err
	}
	return &globalserverlessv1.CreateMSKVPCConnectionResponse{
		MskVpcConnection: res.MskVpcConnection,
	}, nil
}

func (s *plcServiceImpl) DeleteMSKVPCConnection(
	ctx context.Context,
	req *globalserverlessv1.DeleteMSKVPCConnectionRequest,
	projectId uint64,
	clusterId string,
	region *globalcommonv1.Region,
) (*globalserverlessv1.DeleteMSKVPCConnectionResponse, error) {
	ctx, span := Tracer.Start(ctx, "Domain.DeleteMSKVPCConnection")
	defer span.End()

	_, err := s.regionalSvc.DeleteMSKVPCConnection(ctx, region,
		&regionalserverlessv1.DeleteMSKVPCConnectionRequest{
			MskVpcConnectionArn: req.GetMskVpcConnectionArn(),
			ProjectId:           projectId,
			ClusterId:           clusterId,
			Kubernetes:          req.GetKubernetes(),
		})
	if err != nil {
		return nil, err
	}
	return &globalserverlessv1.DeleteMSKVPCConnectionResponse{}, nil
}

func (s *plcServiceImpl) GetMSKVPCConnection(
	ctx context.Context,
	req *globalserverlessv1.GetMSKVPCConnectionRequest,
	projectId uint64,
	clusterId string,
	region *globalcommonv1.Region,
) (*globalserverlessv1.GetMSKVPCConnectionResponse, error) {
	ctx, span := Tracer.Start(ctx, "Domain.GetMSKVPCConnection")
	defer span.End()

	res, err := s.regionalSvc.GetMSKVPCConnection(ctx, region,
		&regionalserverlessv1.GetMSKVPCConnectionRequest{
			MskVpcConnectionArn: req.GetMskVpcConnectionArn(),
			ProjectId:           projectId,
			ClusterId:           clusterId,
			Kubernetes:          req.GetKubernetes(),
		})
	if err != nil {
		return nil, err
	}
	return &globalserverlessv1.GetMSKVPCConnectionResponse{
		MskVpcConnection: res.MskVpcConnection,
	}, nil
}
