package auditlog

import (
	"context"

	"google.golang.org/protobuf/types/known/emptypb"

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	auditlogsvc "github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/service/auditlog"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/service/cluster"
)

func NewServer(
	auditlogSvc auditlogsvc.Service,
	clusterSvc cluster.Service,
) globalngv1.DatabaseAuditLogServiceServer {
	return &server{
		auditlogSvc: auditlogSvc,
		clusterSvc:  clusterSvc,
	}
}

type server struct {
	auditlogSvc auditlogsvc.Service
	clusterSvc  cluster.Service
}

func (s *server) GetAuditLogSetting(
	ctx context.Context,
	req *globalngv1.GetAuditLogSettingRequest,
) (*globalngv1.AuditLogSetting, error) {
	config, err := s.auditlogSvc.GetAuditLogSetting(ctx, req.GetClusterId())
	if err != nil {
		return nil, err
	}
	return config, nil
}

func (s *server) UpdateAuditLogSetting(
	ctx context.Context,
	req *globalngv1.UpdateAuditLogSettingRequest,
) (*globalngv1.AuditLogSetting, error) {
	config, err := s.auditlogSvc.UpdateAuditLogSetting(ctx, req.GetAuditLogSetting(), req.GetValidateOnly())
	if err != nil {
		return nil, err
	}
	return config, nil
}

func (s *server) ListAuditLogFilterRules(
	ctx context.Context,
	req *globalngv1.ListAuditLogFilterRulesRequest,
) (*globalngv1.ListAuditLogFilterRulesResponse, error) {
	filterRules, err := s.auditlogSvc.ListAuditLogFilterRules(ctx, req)
	if err != nil {
		return nil, err
	}
	return &globalngv1.ListAuditLogFilterRulesResponse{
		AuditLogFilterRules: filterRules,
	}, nil
}

func (s *server) CreateAuditLogFilterRule(
	ctx context.Context,
	req *globalngv1.CreateAuditLogFilterRuleRequest,
) (*globalngv1.AuditLogFilterRule, error) {
	rule, err := s.auditlogSvc.CreateAuditLogFilterRule(ctx, req.GetAuditLogFilterRule(), req.GetValidateOnly())
	if err != nil {
		return nil, err
	}
	return rule, nil
}

func (s *server) DeleteAuditLogFilterRule(
	ctx context.Context,
	req *globalngv1.DeleteAuditLogFilterRuleRequest,
) (*emptypb.Empty, error) {
	if err := s.auditlogSvc.DeleteAuditLogFilterRule(ctx, req); err != nil {
		return nil, err
	}
	return &emptypb.Empty{}, nil
}

func (s *server) UpdateAuditLogFilterRule(
	ctx context.Context,
	req *globalngv1.UpdateAuditLogFilterRuleRequest,
) (*globalngv1.AuditLogFilterRule, error) {
	rule, err := s.auditlogSvc.UpdateAuditLogFilterRule(ctx, req.GetAuditLogFilterRule(), req.GetValidateOnly())
	if err != nil {
		return nil, err
	}
	return rule, nil
}
