package privatelinkservicemigration

import (
	"context"

	"google.golang.org/protobuf/types/known/emptypb"

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

func NewServer(
	privatelinkservicemigrationSvc privatelinkservicemigration.Service,
) globaldedicatedv1.PrivateLinkServiceMigrationServiceServer {
	return &server{
		privatelinkservicemigrationSvc: privatelinkservicemigrationSvc,
	}
}

type server struct {
	privatelinkservicemigrationSvc privatelinkservicemigration.Service
}

func (s *server) CreatePrivateLinkServiceMigration(
	ctx context.Context,
	req *globaldedicatedv1.CreatePrivateLinkServiceMigrationRequest,
) (*globaldedicatedv1.PrivateLinkServiceMigration, error) {
	migration, err := s.privatelinkservicemigrationSvc.Create(ctx, req)
	if err != nil {
		return nil, bizerr.WrapError(err, "failed to create private link service migration")
	}
	return migration, nil
}

func (s *server) GetPrivateLinkServiceMigration(
	ctx context.Context,
	req *globaldedicatedv1.GetPrivateLinkServiceMigrationRequest,
) (*globaldedicatedv1.PrivateLinkServiceMigration, error) {
	migration, err := s.privatelinkservicemigrationSvc.Get(ctx, req)
	if err != nil {
		return nil, bizerr.WrapError(err, "failed to get private link service migration")
	}
	return migration, nil
}

func (s *server) ListPrivateLinkServiceMigrations(
	ctx context.Context,
	req *globaldedicatedv1.ListPrivateLinkServiceMigrationsRequest,
) (*globaldedicatedv1.ListPrivateLinkServiceMigrationsResponse, error) {
	migrations, err := s.privatelinkservicemigrationSvc.List(ctx, req)
	if err != nil {
		return nil, bizerr.WrapError(err, "failed to list private link service migrations")
	}
	resp := &globaldedicatedv1.ListPrivateLinkServiceMigrationsResponse{
		Migrations: migrations,
	}
	return resp, nil
}

func (s *server) CancelPrivateLinkServiceMigration(
	ctx context.Context,
	req *globaldedicatedv1.CancelPrivateLinkServiceMigrationRequest,
) (*emptypb.Empty, error) {
	err := s.privatelinkservicemigrationSvc.Cancel(ctx, req)
	if err != nil {
		return nil, bizerr.WrapError(err, "failed to cancel private link service migration")
	}
	return &emptypb.Empty{}, nil
}
