// Package audit defines the platform-owned audit facade.
package audit

import (
	"errors"
	"time"
)

var (
	ErrInvalidInput              = errors.New("audit input invalid")
	ErrUnavailable               = errors.New("audit backend unavailable")
	ErrAuditActionUnavailable    = errors.New("audit action unavailable")
	ErrAuditActionInactive       = errors.New("audit action inactive")
	ErrAuditActionTargetMismatch = errors.New("audit action target mismatch")
)

const (
	ActorRoleUser           = "user"
	ActorRoleAdmin          = "admin"
	ActorRoleServiceAccount = "service_account"
	ActorRoleSystem         = "system"

	ResultSuccess = "success"
	ResultFailure = "failure"

	SortOccurredAtDesc = "occurred_at_desc"
	SortOccurredAtAsc  = "occurred_at_asc"
	SortActionAsc      = "action_asc"
	SortActionDesc     = "action_desc"
	SortResultAsc      = "result_asc"
	SortResultDesc     = "result_desc"
	SortTargetAsc      = "target_asc"
	SortTargetDesc     = "target_desc"

	ActionMatchExact  = "exact"
	ActionMatchPrefix = "prefix"

	QueryModeGeneric  = "generic"
	QueryModeV3Access = "v3_access"
)

type AppendInput struct {
	OrgID                 *string
	ActorUserID           *string
	ActorServiceAccountID *string
	ActorRole             string
	Action                string
	TargetType            string
	TargetID              *string
	Result                string
	CorrelationID         string
	Metadata              map[string]any
}

type Event struct {
	ID                    string
	OrgID                 *string
	ActorUserID           *string
	ActorServiceAccountID *string
	ActorRole             string
	Action                string
	TargetType            string
	TargetID              *string
	Result                string
	CorrelationID         string
	Metadata              map[string]any
	OccurredAt            time.Time
	Presentation          map[string]any
}

type Query struct {
	ActorUserID   *string
	OrgID         *string
	ProjectID     *string
	ActorRole     []string
	Action        []string
	ActionMatch   string
	TargetType    *string
	TargetID      *string
	Result        *string
	CorrelationID *string
	From          *time.Time
	To            *time.Time
	Sort          string
	Cursor        string
	PageSize      int
	MaxPageSize   int
	Mode          string
}

type Page struct {
	Items      []Event
	NextCursor *string
	PageSize   int
}

type ExportFormat string

const (
	ExportFormatJSON ExportFormat = "json"
	ExportFormatCSV  ExportFormat = "csv"
)
