package logredactionpolicy

import (
	"context"
	"strconv"

	"github.com/samber/lo"

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/adapter/regionalserver"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/entity"
	svccommon "github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/service/common"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

func (svc *service) UpdateLogRedactionPolicyViaAgent(
	ctx context.Context,
	cluster *entity.Cluster,
	region *entity.Region,
	tidbgroup *entity.TidbGroup,
	redactLog bool,
) bizerr.BizError {
	cred, err := svccommon.BuildClusterAgentCredentials(ctx, svc.regionalServerCli, svc.encryptor, cluster, region, tidbgroup)
	if err != nil {
		return err
	}

	return svc.regionalServerCli.UpdateLogRedactionPolicyViaAgent(
		ctx,
		region,
		strconv.FormatUint(cluster.ClusterId, 10),
		cred.SharedPoolID,
		&regionalserver.UpdateLogRedactionPolicyViaAgentRequest{
			EncryptedUsername: cred.EncryptedUsername,
			EncryptedPassword: cred.EncryptedPassword,
			RedactLog:         redactLog,
		},
	)
}

func (svc *service) GetLogRedactionPolicyViaAgent(
	ctx context.Context,
	cluster *entity.Cluster,
	region *entity.Region,
	tidbgroup *entity.TidbGroup,
) (*globalngv1.LogRedactionPolicy, bizerr.BizError) {
	cred, err := svccommon.BuildClusterAgentCredentials(ctx, svc.regionalServerCli, svc.encryptor, cluster, region, tidbgroup)
	if err != nil {
		return nil, err
	}

	resp, err := svc.regionalServerCli.GetLogRedactionPolicyViaAgent(
		ctx,
		region,
		strconv.FormatUint(cluster.ClusterId, 10),
		cred.SharedPoolID,
		&regionalserver.GetLogRedactionPolicyViaAgentRequest{
			EncryptedUsername: cred.EncryptedUsername,
			EncryptedPassword: cred.EncryptedPassword,
		},
	)
	if err != nil {
		return nil, err
	}
	return &globalngv1.LogRedactionPolicy{
		ClusterId: cluster.ClusterId,
		RedactLog: lo.ToPtr(resp.RedactLog),
	}, nil
}
