package console_auditlog

import (
	"context"
	"strconv"

	"github.com/tidbcloud/pkgv2/bizerr"
	"github.com/tidbcloud/pkgv2/log"
	"github.com/tidbcloud/serverless-service/internal/config"
	"github.com/tidbcloud/tiinf/sdk/auditlog"
	"go.uber.org/zap"
)

func Submit(
	ctx context.Context,
	event auditlog.EventType,
	orgID, projectID uint64,
	clusterID string,
	details auditlog.Details,
	err error,
) {
	if !config.Global().ServerConfig.EnableAuditLog {
		return
	}
	logger := log.WithContextL(ctx)
	clusterIDUint64, e := strconv.ParseUint(clusterID, 10, 64)
	if e != nil {
		logger.Error("parse clusterID failed when submit audit log", zap.Error(e))
	}
	setError(details, err)
	eventBuilder := auditlog.NewEvent(ctx, event).
		SetResult(err == nil).
		SetOrgID(orgID).
		SetDetails(details.Build())
	if projectID != 0 {
		eventBuilder.SetProjectID(projectID)
	}
	if clusterIDUint64 != 0 {
		eventBuilder.SetClusterID(clusterIDUint64)
	}
	if e := eventBuilder.Submit(); e != nil {
		logger.Error("submit audit log failed", zap.Error(e))
	}
}

func SubmitWithStringIDs(
	ctx context.Context,
	event auditlog.EventType,
	orgID, projectID, clusterID string,
	details auditlog.Details,
	err error,
) {
	o, e1 := strconv.ParseUint(orgID, 10, 64)
	if e1 != nil {
		log.WithContextL(ctx).Error("parse orgID failed when submit audit log", zap.Error(e1))
		return
	}
	var p uint64
	if projectID != "" {
		var e2 error
		p, e2 = strconv.ParseUint(projectID, 10, 64)
		if e2 != nil {
			log.WithContextL(ctx).Error("parse projectID failed when submit audit log", zap.Error(e2))
			return
		}
	}
	Submit(ctx, event, o, p, clusterID, details, err)
}

func setError(details auditlog.Details, err error) {
	if err == nil {
		return
	}
	if be, ok := err.(bizerr.BizError); ok {
		details[auditlog.KeyError] = be.ErrMsg()
		return
	}
	details[auditlog.KeyError] = err.Error()
}
