<?php
namespace App\Livewire\Admin;

use App\Enums\EstadoSolicitud;
use App\Models\{SolicitudCapitalSemilla, Desembolso};
use Livewire\Component;
use Livewire\WithPagination;

class Dashboard extends Component
{
    use WithPagination;

    public array  $stats          = [];
    public string $filtroEstado   = '';
    public string $filtroBusqueda = '';

    public function mount(): void { $this->cargarStats(); }

    public function cargarStats(): void
    {
        $this->stats = [
            'total'            => SolicitudCapitalSemilla::count(),
            'radicadas'        => SolicitudCapitalSemilla::enEstado(EstadoSolicitud::RADICADA)->count(),
            'en_revision'      => SolicitudCapitalSemilla::enEstado(EstadoSolicitud::EN_REVISION)->count(),
            'aprobadas'        => SolicitudCapitalSemilla::enEstado(EstadoSolicitud::APROBADA)->count(),
            'rechazadas'       => SolicitudCapitalSemilla::enEstado(EstadoSolicitud::RECHAZADA)->count(),
            'en_ejecucion'     => SolicitudCapitalSemilla::enEstado(EstadoSolicitud::EN_EJECUCION)->count(),
            'en_condonacion'   => SolicitudCapitalSemilla::enEstado(EstadoSolicitud::EN_CONDONACION)->count(),
            'condonadas'       => SolicitudCapitalSemilla::enEstado(EstadoSolicitud::CONDONADA)->count(),
            'monto_total'      => SolicitudCapitalSemilla::activas()->sum('monto_solicitado'),
            'monto_desembolsado' => Desembolso::sum('monto'),
        ];
    }

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

    public function aprobarParaJunta(int $solicitudId): void
    {
        $solicitud = SolicitudCapitalSemilla::findOrFail($solicitudId);
        $solicitud->cambiarEstado(EstadoSolicitud::EN_CONDONACION, 'Presentado a Junta Directiva.');
        $this->cargarStats();
    }

    public function render()
    {
        $solicitudes = SolicitudCapitalSemilla::with(['asociado', 'evaluacion'])
            ->when($this->filtroEstado, fn($q) => $q->where('estado', $this->filtroEstado))
            ->when($this->filtroBusqueda, fn($q) => $q->where(function ($sub) {
                $sub->where('radicado', 'like', "%{$this->filtroBusqueda}%")
                    ->orWhereHas('asociado', fn($u) => $u->where('name', 'like', "%{$this->filtroBusqueda}%"));
            }))
            ->orderByDesc('created_at')
            ->paginate(20);

        return view('admin.dashboard', [
            'solicitudes' => $solicitudes,
            'estados'     => EstadoSolicitud::cases(),
        ])->layout('layouts.fempha');
    }
}
