<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Spatie\Activitylog\Traits\LogsActivity;
use Spatie\Activitylog\LogOptions;
use Illuminate\Support\Facades\Storage;

class DocumentoCaso extends Model
{
    use HasFactory, LogsActivity;

    protected $table = 'documentos_caso';

    protected $fillable = [
        'proceso_id',
        'user_id',
        'consecutivo',
        'tipo_documento',
        'nombre_archivo',
        'nombre_original',
        'archivo_path',
        'mime_type',
        'tamano_bytes',
        'version',
        'notas',
    ];

    const TIPOS = [
        'demanda' => '📄 Demanda',
        'poder' => '📋 Poder',
        'pagare' => '💳 Pagaré',
        'garantia' => '🔒 Garantía',
        'memorial' => '📝 Memorial',
        'oficio' => '📨 Oficio',
        'subsanacion' => '🔧 Subsanación',
        'acta_reparto' => '📑 Acta de Reparto',
        'sentencia' => '⚖️ Sentencia',
        'liquidacion' => '💰 Liquidación',
        'impulso' => '⚡ Impulso',
        'notificacion' => '🔔 Notificación',
        'titulo_judicial' => '🏛️ Título Judicial',
        'otro' => '📌 Otro',
    ];

    public function proceso()
    {
        return $this->belongsTo(Proceso::class);
    }

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

    public function getTipoLabelAttribute(): string
    {
        return self::TIPOS[$this->tipo_documento] ?? $this->tipo_documento;
    }

    public function getConsecutivoFormateadoAttribute(): string
    {
        return str_pad($this->consecutivo, 3, '0', STR_PAD_LEFT);
    }

    public function getTamanoHumanoAttribute(): string
    {
        $bytes = $this->tamano_bytes;
        if ($bytes >= 1048576) return round($bytes / 1048576, 1) . ' MB';
        if ($bytes >= 1024) return round($bytes / 1024, 1) . ' KB';
        return $bytes . ' B';
    }

    public function getEsPdfAttribute(): bool
    {
        return in_array($this->mime_type, ['application/pdf']);
    }

    public function getEsImagenAttribute(): bool
    {
        return str_starts_with($this->mime_type ?? '', 'image/');
    }

    public function getUrlAttribute(): string
    {
        return asset('storage/' . $this->archivo_path);
    }

    public static function siguienteConsecutivo(int $procesoId): int
    {
        $max = static::where('proceso_id', $procesoId)->max('consecutivo');
        return ($max ?? 0) + 1;
    }

    public function getActivitylogOptions(): LogOptions
    {
        return LogOptions::defaults()
            ->logOnly(['tipo_documento', 'nombre_original', 'consecutivo'])
            ->logOnlyDirty()
            ->setDescriptionForEvent(fn(string $eventName) => "Documento #{$this->consecutivo}: {$eventName}");
    }
}
