<?php
/**
 * Controlador Dashboard
 * Muestra estadísticas generales, gráficos y alertas
 */
class DashboardController
{
    private Letra $letraModel;
    private Empresa $empresaModel;

    public function __construct()
    {
        $this->letraModel   = new Letra();
        $this->empresaModel = new Empresa();
    }

    /**
     * Vista principal del Dashboard
     */
    public function index(): void
    {
        // Estadísticas generales
        $totalLetras      = $this->letraModel->countTotal();
        $letrasPendientes = $this->letraModel->countByEstado('pendiente');
        $letrasPagadas    = $this->letraModel->countByEstado('pagada');
        $letrasRenovadas  = $this->letraModel->countByEstado('renovada');
        $letrasVencidas   = $this->letraModel->countVencidas();
        $letrasPorVencer  = $this->letraModel->countPorVencer(8);
        $montoPendiente   = $this->letraModel->montoTotalPendiente();
        $montoPagado      = $this->letraModel->montoTotalByEstado('pagada');
        $totalEmpresas    = $this->empresaModel->countActivas();

        // Datos para gráficos
        $montosMensuales     = $this->letraModel->montosMensuales((int)date('Y'));
        $distribucionEstados = $this->letraModel->distribucionEstados();

        // Alertas de vencimiento
        $alertas   = $this->letraModel->getAlertasVencimiento();
        $excedidas = $this->letraModel->getLetrasExcedidas();

        // Empresas con letras pendientes (top 5)
        $empresasConLetras = $this->empresaModel->getWithLetrasPendientes();

        // Cargar vista
        $pageTitle   = 'Dashboard';
        $currentPage = 'dashboard';

        loadView('layout/header', compact('pageTitle', 'currentPage'));
        loadView('layout/sidebar', compact('currentPage'));
        loadView('dashboard/index', compact(
            'totalLetras', 'letrasPendientes', 'letrasPagadas', 'letrasRenovadas', 'letrasVencidas',
            'letrasPorVencer', 'montoPendiente', 'montoPagado', 'totalEmpresas',
            'montosMensuales', 'distribucionEstados',
            'alertas', 'excedidas', 'empresasConLetras'
        ));
        loadView('layout/footer', compact('currentPage', 'alertas', 'excedidas'));
    }

    /**
     * Endpoint JSON para obtener alertas (AJAX)
     */
    public function alertas(): void
    {
        header('Content-Type: application/json');
        
        $alertas   = $this->letraModel->getAlertasVencimiento();
        $excedidas = $this->letraModel->getLetrasExcedidas();

        echo json_encode([
            'alertas'   => $alertas,
            'excedidas' => $excedidas,
        ]);
        exit;
    }

    /**
     * Endpoint JSON para datos de gráficos (AJAX)
     */
    public function graficos(): void
    {
        header('Content-Type: application/json');

        $year = isset($_GET['year']) ? (int)$_GET['year'] : (int)date('Y');

        echo json_encode([
            'montos_mensuales'     => $this->letraModel->montosMensuales($year),
            'distribucion_estados' => $this->letraModel->distribucionEstados(),
        ]);
        exit;
    }

    /**
     * Endpoint JSON para obtener detalles de letras por tipo para las cards (AJAX)
     */
    public function detalleLetras(): void
    {
        header('Content-Type: application/json');
        
        $tipo = $_GET['tipo'] ?? '';
        $letras = [];
        $titulo = 'Detalle de Letras';

        switch ($tipo) {
            case 'pendientes':
                $letras = $this->letraModel->getAll('pendiente');
                $titulo = 'Letras Pendientes';
                break;
            case 'por_vencer':
                $letras = $this->letraModel->getAlertasVencimiento();
                $titulo = 'Letras Por Vencer (Próximos 8 días)';
                break;
            case 'vencidas':
                $db = Conexion::getConexion();
                $stmt = $db->query("SELECT l.*, e.razon_social FROM letras l INNER JOIN empresas e ON l.empresa_id = e.id WHERE l.estado = 'pendiente' AND l.fecha_vencimiento < CURDATE() ORDER BY l.fecha_vencimiento ASC");
                $letras = $stmt->fetchAll(PDO::FETCH_ASSOC);
                $titulo = 'Letras Vencidas';
                break;
        }

        echo json_encode([
            'titulo' => $titulo,
            'letras' => $letras
        ]);
        exit;
    }
}
