package console

import (
	"context"
	"strconv"
	"strings"

	"github.com/tidbcloud/dataflow-service-ng/app/internal/console_auditlog"
	"github.com/tidbcloud/dataflow-service-ng/app/repo/entity"
	dataflow "github.com/tidbcloud/dataflow-service-ng/idl/pbgen/proto/consoleapi"
	mgmt "github.com/tidbcloud/tidb-management-service/api/spec/tidb_mgmt_service/v1"
	"github.com/tidbcloud/tiinf/sdk/auditlog"
)

func sinkEndpointCreateDetails(endpoint *dataflow.SinkEndpoint, rErr error) auditlog.Details {
	details := auditlog.Details{
		auditlog.KeyError: rErr,
	}
	if endpoint == nil {
		return details
	}
	if endpoint.GetId() != 0 {
		details[auditlog.KeyPrivateEndpointForExternalServiceId] = strconv.FormatUint(endpoint.GetId(), 10)
	}
	if endpoint.GetEndpointName() != "" {
		details[auditlog.KeyEndpointName] = endpoint.GetEndpointName()
	}
	if endpoint.GetEndpointServiceName() != "" {
		details[auditlog.KeyEndpointService] = endpoint.GetEndpointServiceName()
	}
	if endpoint.GetRegion() != "" {
		details[auditlog.KeyRegion] = endpoint.GetRegion()
	}
	if len(endpoint.GetEndpointZones()) > 0 {
		details[auditlog.KeyEndpointZones] = strings.Join(endpoint.GetEndpointZones(), ",")
	}
	if endpoint.GetEndpointId() != "" {
		details[auditlog.KeyVpcEndpointId] = endpoint.GetEndpointId()
	}
	return details
}

func sinkEndpointDeleteDetails(endpoint *entity.BizSinkEndpoint, rErr error) auditlog.Details {
	details := auditlog.Details{
		auditlog.KeyError: rErr,
	}
	if endpoint == nil {
		return details
	}
	details[auditlog.KeyPrivateEndpointForExternalServiceId] = strconv.FormatUint(endpoint.ID.Uint64(), 10)
	if endpoint.Name != "" {
		details[auditlog.KeyEndpointName] = endpoint.Name
	}
	if endpoint.ServiceName != "" {
		details[auditlog.KeyEndpointService] = endpoint.ServiceName
	}
	if endpoint.Region != "" {
		details[auditlog.KeyRegion] = endpoint.Region
	}
	if len(endpoint.Zones) > 0 {
		details[auditlog.KeyEndpointZones] = strings.Join(endpoint.Zones, ",")
	}
	if endpoint.CloudEndpointID != "" {
		details[auditlog.KeyVpcEndpointId] = endpoint.CloudEndpointID
	}
	return details
}

func (m *sinkEndpointControllerImpl) recordAuditLogForCreateSinkEndpoint(
	ctx context.Context,
	cluster *mgmt.Cluster,
	endpoint *dataflow.SinkEndpoint,
	rErr error,
) {
	console_auditlog.SubmitAsync(
		ctx,
		auditlog.EventCreatePrivateEndpointForExternalService,
		cluster,
		sinkEndpointCreateDetails(endpoint, rErr),
		rErr == nil,
	)
}

func (m *sinkEndpointControllerImpl) recordAuditLogForDeleteSinkEndpoint(
	ctx context.Context,
	cluster *mgmt.Cluster,
	endpoint *entity.BizSinkEndpoint,
	rErr error,
) {
	console_auditlog.SubmitAsync(
		ctx,
		auditlog.EventDeletePrivateEndpointForExternalService,
		cluster,
		sinkEndpointDeleteDetails(endpoint, rErr),
		rErr == nil,
	)
}
