package models

import (
	"database/sql/driver"
	"encoding/json"
	"errors"
	"time"
)

// JSONMap is a custom type for JSONB columns that handles JSON serialization
type JSONMap map[string]interface{}

// Value implements driver.Valuer for database writes
func (j JSONMap) Value() (driver.Value, error) {
	if j == nil {
		return nil, nil
	}
	return json.Marshal(j)
}

// Scan implements sql.Scanner for database reads
func (j *JSONMap) Scan(value interface{}) error {
	if value == nil {
		*j = nil
		return nil
	}
	bytes, ok := value.([]byte)
	if !ok {
		return errors.New("audit_log: failed to scan JSONMap value")
	}
	return json.Unmarshal(bytes, j)
}

// AuditLog represents the audit_log table for tracking security-relevant events
type AuditLog struct {
	ID        uint      `gorm:"primaryKey" json:"id"`
	UserID    *uint     `gorm:"column:user_id" json:"user_id"`
	EventType string    `gorm:"column:event_type;size:50;not null" json:"event_type"`
	IPAddress string    `gorm:"column:ip_address;size:45" json:"ip_address"`
	UserAgent string    `gorm:"column:user_agent;type:text" json:"user_agent"`
	Details   JSONMap   `gorm:"column:details;type:jsonb" json:"details"`
	CreatedAt time.Time `gorm:"column:created_at;autoCreateTime" json:"created_at"`
}

// TableName returns the table name for GORM
func (AuditLog) TableName() string {
	return "audit_log"
}
