<?php
namespace App\Livewire\Admin;

use App\Enums\EstadoSolicitud;
use App\Models\{SolicitudCapitalSemilla, Desembolso, User};
use Livewire\Component;
use Livewire\WithPagination;
use Illuminate\Support\Facades\Hash;

class Dashboard extends Component
{
    use WithPagination;

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

    // Formulario nuevo usuario
    public string $nuevoNombre    = '';
    public string $nuevoEmail     = '';
    public string $nuevoPassword  = '';
    public string $nuevoRol       = '';

    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 crearUsuario(): void
    {
        $this->validate([
            'nuevoNombre'   => 'required|string|min:3|max:100',
            'nuevoEmail'    => 'required|email|unique:users,email',
            'nuevoPassword' => 'required|string|min:8',
            'nuevoRol'      => 'required|in:asociado,evaluador,junta,admin',
        ]);

        $user = User::create([
            'name'              => $this->nuevoNombre,
            'email'             => $this->nuevoEmail,
            'password'          => Hash::make($this->nuevoPassword),
            'email_verified_at' => now(),
            'estado'            => 'activo',
        ]);

        $user->assignRole($this->nuevoRol);

        session()->flash('usuario_creado', "Usuario {$this->nuevoNombre} creado con rol {$this->nuevoRol}.");

        $this->reset(['nuevoNombre', 'nuevoEmail', 'nuevoPassword', 'nuevoRol']);
    }

    public function toggleEstadoUsuario(int $userId): void
    {
        $user = User::findOrFail($userId);
        $user->update([
            'estado' => ($user->estado ?? 'activo') === 'activo' ? 'inactivo' : 'activo',
        ]);
    }

    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);

        $usuarios = User::with('roles')->orderBy('name')->get();

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