// Package legacyimpl provides an implementation based on the deprecated legacy plugin. Refer to [guide](https://docs.google.com/document/d/1Oj6EunMmd1kxS4t49D3LNp3K6KgwsbEGxR-KUd1yr_E/edit?tab=t.0#heading=h.7tkrubc8pdw7).
// deprecated: This package is deprecated and will be removed in the future. Use the new implementation instead.
package legacyimpl

import (
	"context"

	"go.opentelemetry.io/otel"

	globaldedicatedv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/dedicated/v1"
	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/adapter/account"
	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/adapter/clusterproxy"
	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/adapter/regionserver"
	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/adapter/remoteencryptor"
	clusterrepo "github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/repository/cluster"
	regionrepo "github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/repository/region"
	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/service/auditlog"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

var (
	tracer           = otel.Tracer("domain.auditlog.legacyimpl")
	LegacyMinVersion = "v5.4.0"
)

type Service interface {
	GetAuditLogConfig(ctx context.Context, clusterID uint64) (*globaldedicatedv1.AuditLogConfig, bizerr.BizError)
	UpdateAuditLogConfig(
		ctx context.Context,
		config *globaldedicatedv1.AuditLogConfig,
	) (*globaldedicatedv1.AuditLogConfig, bizerr.BizError)
	PrecheckAuditLogConfig(
		ctx context.Context,
		config *globaldedicatedv1.AuditLogConfig,
	) (*globaldedicatedv1.PrecheckAuditLogConfigResponse, bizerr.BizError)

	ListAuditLogFilterRules(
		ctx context.Context,
		clusterID uint64,
	) ([]*globaldedicatedv1.AuditLogFilterRule, bizerr.BizError)
	CreateAuditLogFilterRule(
		ctx context.Context,
		clusterID uint64,
		rule *globaldedicatedv1.AuditLogFilterRule,
	) (*globaldedicatedv1.AuditLogFilterRule, bizerr.BizError)
	DeleteAuditLogFilterRule(
		ctx context.Context,
		request *globaldedicatedv1.DeleteAuditLogFilterRuleRequest,
	) bizerr.BizError
}

type service struct {
	clusterRepo          clusterrepo.Repo
	regionRepo           regionrepo.Repo
	regionServerCli      regionserver.Client
	accountCli           account.Client
	clusterProxyProvider clusterproxy.Provider
	encryptor            remoteencryptor.Client

	v2Impl auditlog.Service
}

func NewService(
	clusterRepo clusterrepo.Repo,
	regionRepo regionrepo.Repo,
	regionServerCli regionserver.Client,
	accountCli account.Client,
	clusterProxyProvider clusterproxy.Provider,
	encryptor remoteencryptor.Client,
	v2Impl auditlog.Service,
) Service {
	return &service{
		clusterRepo:          clusterRepo,
		regionRepo:           regionRepo,
		regionServerCli:      regionServerCli,
		accountCli:           accountCli,
		clusterProxyProvider: clusterProxyProvider,
		encryptor:            encryptor,
		v2Impl:               v2Impl,
	}
}
