<?php

namespace App\Livewire\Audiencias;

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

use function Illuminate\Foundation\hotAsset;

class ProcesosAbiertos extends Component
{
    use WithPagination, WithoutUrlPagination; 
    protected $paginationTheme = 'bootstrap';
    
    public $filtroEstado;
    public $filtroFecha;
    public $filtroProceso;
    public $filtroDepartamento;
    public $filtroTipoAudiencia;
    public $filtroJuzgado;
    public $juzgados;

    public $tiposAudiencia;
    public $estadosAudiencia;
    public $estadoNombre;

    public $sortField = 'fecha_audiencia';
    public $sortDirection = 'asc';
    
    public $perPage = 10;

    public function mount()
    {
        $this->estadosAudiencia = Parametro::where('tipo', 'ESTADO_AUDIENCIA')->get();
        $this->filtroDepartamento = null;
        $this->tiposAudiencia = Parametro::where('tipo', 'TIPO_AUDIENCIA')->get();
        $this->juzgados = Proceso::distinct('juzgado')->get(['juzgado']);
        
    }

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

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

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

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

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

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

    public function limpiarFiltros()
    {
        $this->reset(['filtroEstado', 'filtroFecha', 'filtroProceso', 'filtroDepartamento', 'filtroTipoAudiencia', 'filtroJuzgado']);
        $this->dispatch('limpiar-selects');
        $this->resetPage();
    }

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

    public function getTipoAudienciaNombreProperty()
    {
        return $this->filtroTipoAudiencia ? Parametro::find($this->filtroTipoAudiencia)->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.audiencias.procesos-abiertos', [
            'audiencias' => $this->queryAudiencias()->paginate($this->perPage),'departamentos' => $departamentos
        ]);
    }

    private function queryAudiencias()
    {
        return Audiencia::with(['abogado', 'proceso'])
            ->when($this->filtroEstado, fn($q) =>
                $q->where('estado_id', $this->filtroEstado)
            )->when($this->filtroFecha, function ($q) {
                $q->where('fecha_audiencia', $this->filtroFecha);
            })->when($this->filtroDepartamento, fn($q) =>
                $q->where('departamento', $this->filtroDepartamento)
            )->when($this->filtroTipoAudiencia, fn($q) =>
                $q->where('tipo_audiencia_id', $this->filtroTipoAudiencia)
            )->when($this->filtroProceso, fn($q) =>
                $q->whereHas('proceso', function ($query) {
                    $query->where('codigo_proceso', 'like', '%' . $this->filtroProceso . '%');
                })
            )->when($this->filtroJuzgado, fn($q) =>
                $q->where('juzgado', $this->filtroJuzgado)
            )->whereHas('proceso', function ($query) {
                $query->where('estado', true);
            })
            ->orderBy($this->sortField, $this->sortDirection);
        
    }

    public function exportarExcel()
    {
        $audiencias = $this->queryAudiencias()->get();
        //dd($audiencias);
        return Excel::download(
            new AudienciasPAExport($audiencias),
            'audiencias_procesos_judiciales_abiertos'.date('Ymd').'.xlsx'
        );
    }
    
    public function exportPdf()
    {
        $audiencias = $this->queryAudiencias()->get();
        $hoy=now();
        $titulo='Reporte de Audiencias de Procesos Abiertos';
        $pdf = SnappyPdf::loadView('audiencias.reportes.pdf.procesos-abiertos', compact('audiencias','hoy'))
            ->setOption('header-html', view('audiencias.reportes.pdf._header', compact('titulo')))
            ->setOption('footer-html', view('audiencias.reportes.pdf._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-audiencias-procesos-abiertos-' . now()->format('Y-m-d-His') . '.pdf');
    }
}
