<?php

namespace App\Livewire\Documentos;

use App\Models\DocumentoCaso;
use App\Models\Proceso;
use Livewire\Component;
use Livewire\WithFileUploads;
use Illuminate\Support\Facades\Storage;

class DocumentoManager extends Component
{
    use WithFileUploads;

    public Proceso $proceso;

    // Upload
    public bool $showUploadModal = false;
    public $archivos = [];
    public string $tipo_documento = 'otro';
    public string $notas = '';

    // Preview
    public bool $showPreviewModal = false;
    public ?DocumentoCaso $previewDoc = null;

    // Delete
    public bool $showDeleteModal = false;
    public ?int $deletingId = null;

    public function mount(Proceso $proceso)
    {
        $this->proceso = $proceso;
    }

    public function abrirUpload()
    {
        $this->reset(['archivos', 'tipo_documento', 'notas']);
        $this->tipo_documento = 'otro';
        $this->showUploadModal = true;
    }

    public function subirDocumentos()
    {
        $this->validate([
            'archivos' => 'required|array|min:1',
            'archivos.*' => 'file|max:20480|mimes:pdf,doc,docx,xls,xlsx,jpg,jpeg,png,gif,txt,csv',
            'tipo_documento' => 'required',
        ]);

        $radicado = $this->proceso->radicado_interno;
        $clienteNombre = $this->proceso->cliente->nombre ?? 'sin-cliente';
        $year = $this->proceso->fecha_ingreso->year;
        $basePath = "expedientes/{$clienteNombre}/{$year}/{$radicado}";

        // Subcarpeta por tipo
        $subcarpeta = match($this->tipo_documento) {
            'demanda', 'poder' => 'demanda',
            'oficio', 'impulso', 'notificacion' => 'oficios',
            'memorial', 'subsanacion' => 'memoriales',
            'sentencia', 'liquidacion', 'titulo_judicial' => 'sentencias',
            'acta_reparto' => 'actuaciones',
            default => 'otros',
        };

        $subidos = 0;
        foreach ($this->archivos as $archivo) {
            $consecutivo = DocumentoCaso::siguienteConsecutivo($this->proceso->id);
            $extension = $archivo->getClientOriginalExtension();
            $nombreOriginal = $archivo->getClientOriginalName();
            $nombreArchivo = str_pad($consecutivo, 3, '0', STR_PAD_LEFT) . "_{$this->tipo_documento}.{$extension}";

            $path = $archivo->storeAs(
                "{$basePath}/{$subcarpeta}",
                $nombreArchivo,
                'public'
            );

            DocumentoCaso::create([
                'proceso_id' => $this->proceso->id,
                'user_id' => auth()->id(),
                'consecutivo' => $consecutivo,
                'tipo_documento' => $this->tipo_documento,
                'nombre_archivo' => $nombreArchivo,
                'nombre_original' => $nombreOriginal,
                'archivo_path' => $path,
                'mime_type' => $archivo->getMimeType(),
                'tamano_bytes' => $archivo->getSize(),
                'notas' => $this->notas ?: null,
            ]);

            // Registrar en bitácora
            $this->proceso->actuaciones()->create([
                'user_id' => auth()->id(),
                'tipo' => 'otro',
                'titulo' => "Documento subido: #{$consecutivo} — {$nombreOriginal}",
                'fecha_actuacion' => now()->toDateString(),
                'archivo_path' => $path,
                'es_automatica' => true,
            ]);

            $subidos++;
        }

        $this->showUploadModal = false;
        $this->reset(['archivos', 'tipo_documento', 'notas']);
        session()->flash('doc_message', "{$subidos} documento(s) subido(s) correctamente.");
    }

    public function preview($id)
    {
        $this->previewDoc = DocumentoCaso::findOrFail($id);
        $this->showPreviewModal = true;
    }

    public function confirmDelete($id)
    {
        $this->deletingId = $id;
        $this->showDeleteModal = true;
    }

    public function delete()
    {
        $doc = DocumentoCaso::findOrFail($this->deletingId);

        // Eliminar archivo físico
        if (Storage::disk('public')->exists($doc->archivo_path)) {
            Storage::disk('public')->delete($doc->archivo_path);
        }

        $doc->delete();
        $this->showDeleteModal = false;
        $this->deletingId = null;
        session()->flash('doc_message', 'Documento eliminado.');
    }

    public function render()
    {
        $documentos = DocumentoCaso::where('proceso_id', $this->proceso->id)
            ->with('usuario')
            ->orderBy('consecutivo')
            ->get();

        return view('livewire.documentos.documento-manager', [
            'documentos' => $documentos,
            'tiposDocumento' => DocumentoCaso::TIPOS,
        ]);
    }
}
