package cmek

import (
	"context"

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

func (s *customerManagedEncryptionKeyServiceImpl) Get(
	ctx context.Context,
	req *globaldedicatedv1.GetCustomerManagedEncryptionKeyRequest,
) (*entity.CustomerManagedEncryptionKey, bizerr.BizError) {
	ctx, span := Tracer.Start(ctx, "Domain.GetCmek")
	defer span.End()

	cmekEntity, err := s.cmekRepo.Get(ctx, req.CustomerManagedEncryptionKeyId)
	if err != nil {
		if err.ErrCode() == bizerr.ErrCodeRecordNotFound {
			return nil, bizerr.New(
				bizerr.ErrCodeRecordNotFound,
				"cmek %d not found",
				req.CustomerManagedEncryptionKeyId,
			)
		}
		return nil, bizerr.New(bizerr.ErrCodeDB, "%s", err.Error())
	}
	return cmekEntity, nil
}

func (s *customerManagedEncryptionKeyServiceImpl) List(
	ctx context.Context,
	req *globaldedicatedv1.ListCustomerManagedEncryptionKeysRequest,
) ([]*entity.CustomerManagedEncryptionKey, bizerr.BizError) {
	ctx, span := Tracer.Start(ctx, "Domain.ListCmeks")
	defer span.End()

	filter := &cmek.Filter{
		CloudProviderNames: req.CloudProviderIds,
		RegionNames:        req.RegionIds,
		ProjectIds:         req.ProjectIds,
	}

	if req.OrganizationId != 0 {
		filter.OrganizationIds = []uint64{req.OrganizationId}
	}

	cmeks, err := s.cmekRepo.Query(ctx, filter)
	if err != nil {
		return nil, bizerr.New(bizerr.ErrCodeDB, "%s", err.Error())
	}

	return cmeks, nil
}
