package audit

import (
	"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session"
	crypto "git.frostfs.info/TrueCloudLab/frostfs-crypto"
	"git.frostfs.info/TrueCloudLab/frostfs-node/internal/logs"
	"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/logger"
	"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
	"go.uber.org/zap"
)

type Request interface {
	GetVerificationHeader() *session.RequestVerificationHeader
}

type Target interface {
	String() string
}

func LogRequest(log *logger.Logger, operation string, req Request, target Target, status bool) {
	LogRequestWithKey(log, operation, req.GetVerificationHeader().GetBodySignature().GetKey(), target, status)
}

func LogRequestWithKey(log *logger.Logger, operation string, key []byte, target Target, status bool) {
	object, subject := NotDefined, NotDefined

	publicKey := crypto.UnmarshalPublicKey(key)
	if publicKey != nil {
		subject = ((*keys.PublicKey)(publicKey)).StringCompressed()
	}

	if target != nil {
		object = target.String()
	}

	log.Info(logs.AuditEventLogRecord,
		zap.String("operation", operation),
		zap.String("object", object),
		zap.String("subject", subject),
		zap.Bool("success", status))
}