// Package schema defines the Ent schema for domain entities.
package schema

import (
	"time"

	"entgo.io/ent"
	"entgo.io/ent/schema/field"
	"entgo.io/ent/schema/index"
)

// AuditLog holds the schema definition for the AuditLog entity.
type AuditLog struct {
	ent.Schema
}

// Fields of the AuditLog.
func (AuditLog) Fields() []ent.Field {
	return []ent.Field{
		field.String("id").
			Unique().
			Immutable(),
		field.String("user_id").
			NotEmpty().
			Comment("ID of the user/actor performing the action"),
		field.String("action").
			NotEmpty().
			Comment("Action performed (e.g., user.create, user.update)"),
		field.String("resource").
			Optional().
			Comment("Resource type (e.g., user, role)"),
		field.String("resource_id").
			Optional().
			Comment("ID of the target resource"),
		field.String("ip_address").
			Optional().
			Comment("IP address of the client"),
		field.String("user_agent").
			Optional().
			Comment("User agent of the client"),
		field.JSON("metadata", map[string]interface{}{}).
			Optional().
			Comment("Additional metadata as JSON"),
		field.Time("timestamp").
			Default(time.Now).
			Immutable(),
	}
}

// Indexes of the AuditLog.
func (AuditLog) Indexes() []ent.Index {
	return []ent.Index{
		index.Fields("user_id"),
		index.Fields("resource_id"),
		index.Fields("timestamp"),
		index.Fields("action"),
		index.Fields("resource"),
	}
}
