<?php

namespace App\Livewire\Procesos;

use App\Exports\ProcesosJudicialesExport;
use App\Models\Parametro;
use App\Models\ParCiudad;
use App\Models\Proceso;
use Barryvdh\Snappy\Facades\SnappyPdf;
use Livewire\Component;
use Livewire\WithoutUrlPagination;
use Livewire\WithPagination;
use Maatwebsite\Excel\Facades\Excel;

class Index extends Component
{
    use WithPagination, WithoutUrlPagination; 
    protected $paginationTheme = 'bootstrap';
    // Propiedades para filtros
    public $search = '';
    public $searchDepartamento = '';
    public $searchTipoDelito = '';
    public $searchTipoProceso = '';
    public $departamento_id = '';
    public $tipo_delito_id = '';
    public $tipo_proceso_id = '';
    public $perPage = 10;
    // public $departamentos;
    public $tiposDelito;
    public $tiposProceso;
    public $abogados;

    // Propiedades para ordenamiento
    public $sortField = 'fecha_inicio';
    public $sortDirection = 'desc';

    public function mount()
    {
        // $this->departamentos = ParCiudad::distinct()->orderBy('cod_depto')->get(['cod_depto','depto_nombre']);
        $this->tiposDelito = Parametro::where('tipo', 'TIPO_DELITO')->orderBy('nombre')->get();
        $this->tiposProceso = Parametro::where('tipo', 'TIPO_PROCESO')->orderBy('nombre')->get();
        $this->tipo_delito_id = request()->get('tipo_delito_id');
        $this->tipo_proceso_id = request()->get('tipo_proceso_id');
        $this->departamento_id = request()->get('departamento_id');
        $this->abogados = \App\Models\User::role('Abogado')->orderBy('name')->get();
    }

    public function updatingSearch()
    {
        $this->resetPage();
    }

    public function updatingDepartamentoId()
    {
        $this->resetPage();
    }

    public function updatingTipoDelitoId()
    {
        $this->resetPage();
    }

    public function updatingTipoProcesoId()
    {
        $this->resetPage();
    }

    public function limpiarFiltros()
    {
        $this->reset(['search', 'departamento_id', 'tipo_delito_id','tipo_proceso_id']);
        $this->dispatch('limpiar-selects');
        $this->resetPage();
    }

    public function getTipoDelitoNombreProperty()
    {
        return $this->tipo_delito_id ? Parametro::find($this->tipo_delito_id)->nombre : '';
    }

    public function getTipoProcesoNombreProperty()
    {
        return $this->tipo_proceso_id ? Parametro::find($this->tipo_proceso_id)->nombre : '';
    }

    public function getDepartamentoNombreProperty()
    {
        return $this->departamento_id ? ParCiudad::where('cod_depto',$this->departamento_id)->first()->depto_nombre : '';
    }

    public function sortBy($field)
    {
        if ($this->sortField === $field) {
            $this->sortDirection = $this->sortDirection === 'asc' ? 'desc' : 'asc';
        } else {
            $this->sortField = $field;
            $this->sortDirection = 'asc';
        }
    }

    public function render()
    {
        $departamentos = ParCiudad::distinct()->orderBy('cod_depto')->get(['cod_depto','depto_nombre']);
        return view('livewire.procesos.index', [
            'procesos' => $this->queryProcesos()->paginate($this->perPage),'departamentos' => $departamentos
        ]);
    }

    private function queryProcesos()
    {
        return Proceso::query()
            ->with([
                'ciudad',
                'tipo_delito',
                'tipo_proceso',
                'seguimientos.estado'
            ])
            ->when($this->search, function ($q) {
                $q->where('codigo_proceso', 'like', "%{$this->search}%")
                    ->orWhere('numero_nurej', 'like', "%{$this->search}%")
                    ->orWhere('descripcion_proceso', 'like', "%{$this->search}%");
            })
            ->when($this->tipo_delito_id, fn ($q) =>
                $q->where('tipo_delito_id', $this->tipo_delito_id)
            )
            ->when($this->tipo_proceso_id, fn ($q) =>
                $q->where('tipo_proceso_id', $this->tipo_proceso_id)
            )
            ->when($this->departamento_id, fn ($q) =>
                $q->whereHas('ciudad', fn ($c) =>
                    $c->where('cod_depto', $this->departamento_id)
                )
            )->where('estado', true)
            ->orderBy($this->sortField, $this->sortDirection);
    }

    public function exportarExcel()
    {
        $procesos = $this->queryProcesos()->get();
        //dd($procesos);
        return Excel::download(
            new ProcesosJudicialesExport($procesos),
            'procesos_judiciales'.date('Ymd').'.xlsx'
        );
    }

    public function exportPdf()
    {
        $procesos = $this->queryProcesos()->get();
        $titulo='Reporte de Procesos Judiciales Abiertos';
        $pdf = SnappyPdf::loadView('procesos.reportes.abiertos-pdf', compact('procesos'))
            ->setOption('header-html', view('procesos.reportes._header', compact('titulo')))
            ->setOption('footer-html', view('procesos.reportes._footer'))
            ->setOption('margin-top', '2cm')
            ->setOption('margin-bottom', '1.5cm')
            ->setOrientation('Landscape')
            ->setOption('enable-local-file-access', true);
    
        return response()->streamDownload(function() use ($pdf) {
            echo $pdf->output();
        }, 'reporte-procesos-abiertos-' . now()->format('Y-m-d-His') . '.pdf');
    }
}