<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

/**
 * M-02 — Registro de auditoría del sistema.
 *
 * Almacena quién hizo qué, cuándo y sobre qué entidad.
 * Se usa a través del trait Auditable en los controladores.
 *
 * Ejemplos de acciones registradas:
 *  - "solicitud_creada", "solicitud_eliminada"
 *  - "ticket_asignado", "ticket_redirigido"
 *  - "ticket_ejecutado", "ticket_conformado", "ticket_cerrado"
 *  - "usuario_creado", "usuario_actualizado"
 */
class AuditLog extends Model
{
    protected $table = 'audit_logs';

    protected $fillable = [
        'user_id',
        'accion',
        'entidad_tipo',
        'entidad_id',
        'datos_anteriores',
        'datos_nuevos',
        'ip_address',
        'user_agent',
    ];

    protected $casts = [
        'datos_anteriores' => 'array',
        'datos_nuevos'     => 'array',
    ];

    // ── Relaciones ───────────────────────────────────────────────────────

    public function usuario()
    {
        return $this->belongsTo(User::class, 'user_id');
    }

    // ── Métodos estáticos de conveniencia ─────────────────────────────────

    /**
     * Registrar una acción de auditoría.
     *
     * @param string      $accion         Identificador de la acción (ej: 'solicitud_creada')
     * @param Model|null  $entidad        Modelo afectado (Solicitud, User, etc.)
     * @param array       $datosAnteriores Estado previo (opcional, para updates/deletes)
     * @param array       $datosNuevos    Estado nuevo (opcional)
     */
    public static function registrar(
        string $accion,
        ?Model $entidad = null,
        array $datosAnteriores = [],
        array $datosNuevos = []
    ): self {
        return self::create([
            'user_id'          => auth()->id(),
            'accion'           => $accion,
            'entidad_tipo'     => $entidad ? get_class($entidad) : null,
            'entidad_id'       => $entidad?->getKey(),
            'datos_anteriores' => !empty($datosAnteriores) ? $datosAnteriores : null,
            'datos_nuevos'     => !empty($datosNuevos) ? $datosNuevos : null,
            'ip_address'       => request()->ip(),
            'user_agent'       => substr(request()->userAgent() ?? '', 0, 500),
        ]);
    }
}
