package auditlog

import (
	"context"
	"strconv"

	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) UpdateAuditLogSettingViaAgent(
	ctx context.Context,
	cluster *entity.Cluster,
	region *entity.Region,
	tidbgroup *entity.TidbGroup,
	setting *globalngv1.AuditLogSetting,
) bizerr.BizError {
	cred, err := svccommon.BuildClusterAgentCredentials(ctx, svc.regionalServerCli, svc.encryptor, cluster, region, tidbgroup)
	if err != nil {
		return err
	}

	return svc.regionalServerCli.UpdateAuditLogSettingViaAgent(
		ctx,
		region,
		strconv.FormatUint(cluster.ClusterId, 10),
		cred.SharedPoolID,
		&regionalserver.UpdateAuditLogSettingViaAgentRequest{
			EncryptedUsername: cred.EncryptedUsername,
			EncryptedPassword: cred.EncryptedPassword,
			Enabled:           setting.GetEnabled(),
			Unredacted:        setting.GetUnredacted(),
			Format:            setting.GetFormat(),
			MaxSizeMib:        setting.GetMaxSizeMib(),
			MaxAgeSecond:      setting.GetMaxAgeSecond(),
		},
	)
}

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

	return svc.regionalServerCli.CreateAuditLogFilterRuleViaAgent(
		ctx,
		region,
		strconv.FormatUint(cluster.ClusterId, 10),
		cred.SharedPoolID,
		&regionalserver.CreateAuditLogFilterRuleViaAgentRequest{
			EncryptedUsername: cred.EncryptedUsername,
			EncryptedPassword: cred.EncryptedPassword,
			UserExpr:          rule.GetUserExpr(),
			DisplayName:       rule.GetDisplayName(),
			EventTypes:        rule.GetEventTypes(),
			Tables:            rule.GetTables(),
			StatusCodes:       rule.GetStatusCodes(),
			Disabled:          rule.GetDisabled(),
		},
	)
}

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

	return svc.regionalServerCli.DeleteAuditLogFilterRuleViaAgent(
		ctx,
		region,
		strconv.FormatUint(cluster.ClusterId, 10),
		cred.SharedPoolID,
		&regionalserver.DeleteAuditLogFilterRuleViaAgentRequest{
			EncryptedUsername: cred.EncryptedUsername,
			EncryptedPassword: cred.EncryptedPassword,
			UserExpr:          userExpr,
		},
	)
}

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

	return svc.regionalServerCli.UpdateAuditLogFilterRuleViaAgent(
		ctx,
		region,
		strconv.FormatUint(cluster.ClusterId, 10),
		cred.SharedPoolID,
		&regionalserver.UpdateAuditLogFilterRuleViaAgentRequest{
			EncryptedUsername: cred.EncryptedUsername,
			EncryptedPassword: cred.EncryptedPassword,
			UserExpr:          rule.GetUserExpr(),
			DisplayName:       rule.GetDisplayName(),
			EventTypes:        rule.GetEventTypes(),
			Tables:            rule.GetTables(),
			StatusCodes:       rule.GetStatusCodes(),
			Disabled:          rule.GetDisabled(),
		},
	)
}
