package vpc

import (
	"context"

	"github.com/tidbcloud/pkgv2/db"

	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/adapter/account"
	cidrrepo "github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/repository/cidr"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

type DeleteCidrSvc interface {
	Execute(ctx context.Context, projectID, cidrID uint64) bizerr.BizError
}

type deleteCidrSvc struct {
	cidrRepo    cidrrepo.Repo
	accountCli  account.Client
	helper      Helper
	transaction db.Transactioner
}

func NewDeleteCidrSvc(
	cidrRepo cidrrepo.Repo,
	accountCli account.Client,
	helper Helper,
	transaction db.Transactioner,
) DeleteCidrSvc {
	return &deleteCidrSvc{
		cidrRepo:    cidrRepo,
		accountCli:  accountCli,
		helper:      helper,
		transaction: transaction,
	}
}

func (svc *deleteCidrSvc) Execute(ctx context.Context, projectID, cidrID uint64) bizerr.BizError {
	ctx, span := tracer.Start(ctx, "Domain.DeleteCidrSvc")
	defer span.End()

	err := svc.transaction.Transaction(ctx, func(ctx context.Context) error {
		cidrEntity, err := svc.cidrRepo.Load(ctx, projectID, cidrID)
		if err != nil {
			return err
		}

		project, err := svc.accountCli.GetProject(ctx, cidrEntity.ProjectID)
		if err != nil {
			return err
		}

		err = svc.helper.CheckCidrState(ctx, cidrEntity, project)
		if err != nil {
			return err
		}

		err = svc.cidrRepo.Delete(ctx, cidrID)
		if err != nil {
			return err
		}

		return nil
	})
	if err != nil {
		return bizerr.WrapError(err, "failed to delete cidr")
	}

	return nil
}
