<?php
/**
 * Controlador de Reportes
 * Generación de reportes de letras con filtros y exportación
 */
class ReporteController
{
    private Reporte $reporteModel;
    private Empresa $empresaModel;
    private Letra $letraModel;

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

    /**
     * Vista principal de reportes con filtros
     */
    public function index(): void
    {
        $empresas = $this->empresaModel->getAll();

        // Valores por defecto: semana actual
        $fechaDesde = $_GET['fecha_desde'] ?? date('Y-m-d', strtotime('monday this week'));
        $fechaHasta = $_GET['fecha_hasta'] ?? date('Y-m-d', strtotime('sunday this week'));
        // Support multiple empresa IDs (comma-separated in URL)
        $empresaIdRaw = $_GET['empresa_id'] ?? '';
        $empresaIds = [];
        if (!empty($empresaIdRaw)) {
            $empresaIds = array_map('intval', array_filter(explode(',', $empresaIdRaw)));
        }
        $empresaId = $empresaIdRaw; // Keep raw for view

        // Generar reporte si hay filtros
        $reporte = null;
        $totales = null;
        if (isset($_GET['fecha_desde'])) {
            $reporte = $this->reporteModel->getReporteLetras($fechaDesde, $fechaHasta, $empresaIds);
            $totales = $this->reporteModel->getTotalesReporte($fechaDesde, $fechaHasta, $empresaIds);
        }

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

        $pageTitle   = 'Reporte de Letras';
        $currentPage = 'reportes';

        loadView('layout/header', compact('pageTitle', 'currentPage'));
        loadView('layout/sidebar', compact('currentPage'));
        loadView('reportes/index', compact('empresas', 'fechaDesde', 'fechaHasta', 'empresaId', 'reporte', 'totales'));
        loadView('layout/footer', compact('currentPage', 'alertas', 'excedidas'));
    }

    /**
     * Generar reporte (redirect con parámetros)
     */
    public function generar(): void
    {
        $fechaDesde = $_POST['fecha_desde'] ?? date('Y-m-d');
        $fechaHasta = $_POST['fecha_hasta'] ?? date('Y-m-d');
        
        // Handle multiple empresa IDs from multi-select
        $empresaIds = $_POST['empresa_id'] ?? [];
        $empresaIdStr = implode(',', array_map('intval', array_filter($empresaIds)));

        redirect("?c=reportes&fecha_desde={$fechaDesde}&fecha_hasta={$fechaHasta}&empresa_id={$empresaIdStr}");
    }

    /**
     * Exportar reporte a Excel (CSV)
     */
    public function exportarexcel(): void
    {
        $fechaDesde = $_GET['fecha_desde'] ?? date('Y-m-d');
        $fechaHasta = $_GET['fecha_hasta'] ?? date('Y-m-d');
        $empresaIdRaw = $_GET['empresa_id'] ?? '';
        $empresaIds = !empty($empresaIdRaw) ? array_map('intval', array_filter(explode(',', $empresaIdRaw))) : [];

        $reporte = $this->reporteModel->getReporteLetras($fechaDesde, $fechaHasta, $empresaIds);
        $totales = $this->reporteModel->getTotalesReporte($fechaDesde, $fechaHasta, $empresaIds);

        // Headers para descarga Excel (CSV con BOM para UTF-8 en Excel)
        $filename = 'reporte_letras_' . $fechaDesde . '_a_' . $fechaHasta . '.csv';
        header('Content-Type: text/csv; charset=utf-8');
        header('Content-Disposition: attachment; filename="' . $filename . '"');
        header('Cache-Control: max-age=0');

        $output = fopen('php://output', 'w');

        // BOM UTF-8
        fprintf($output, chr(0xEF) . chr(0xBB) . chr(0xBF));

        // Encabezado del reporte
        fputcsv($output, ['JW DIESEL S.A.C.'], ';');
        fputcsv($output, ['JR. LIBERTAD 489 - CHIMBOTE'], ';');
        fputcsv($output, ['REPORTE DE LETRAS - Ordenado por Fecha de Vencimiento'], ';');
        fputcsv($output, ["Desde el {$fechaDesde} hasta el {$fechaHasta}"], ';');
        fputcsv($output, ['Fecha de impresion: ' . date('d/m/Y H:i:s')], ';');
        fputcsv($output, [], ';');

        // Cabeceras de columna
        fputcsv($output, [
            'Id', 'N', 'G', '#Documento', 'Fec E.', 'Fec I.',
            'Fecha Vec', 'Fecha Pag (+8)', 'Total', 'Moneda',
            'Obs.', 'Dias', 'Banco', 'Estado', '# Unico Ref', 'Empresa'
        ], ';');

        // Datos agrupados por empresa
        foreach ($reporte as $empresaNombre => $grupo) {
            // Separador de empresa
            fputcsv($output, [$empresaNombre], ';');

            foreach ($grupo['letras'] as $letra) {
                fputcsv($output, [
                    $letra['id'],
                    $letra['n'],
                    $letra['g'],
                    $letra['documento'],
                    $letra['fec_emision'],
                    $letra['fec_ingreso'],
                    $letra['fecha_vec_formato'],
                    $letra['fecha_pag_formato'],
                    number_format((float)$letra['total'], 2, '.', ''),
                    $letra['moneda'],
                    $letra['obs'] ?? '',
                    $letra['dias_restantes'],
                    $letra['banco'] ?? '',
                    $letra['estado_letra'],
                    $letra['referencia_unica'] ?? '',
                    $letra['razon_social'],
                ], ';');
            }

            // Total de grupo
            fputcsv($output, [
                '', '', '', '', '', '', '', 'Total de Grupo ----->',
                'US$ ' . number_format($grupo['total_dolares'], 2),
                '', '', '', '', '', '', ''
            ], ';');
            fputcsv($output, [], ';');
        }

        // Totales generales
        fputcsv($output, [], ';');
        fputcsv($output, ['Montos a pagar'], ';');
        fputcsv($output, ['Total Letras Dolares:', number_format((float)$totales['total_dolares'], 2)], ';');
        fputcsv($output, ['Total Letras Soles:', number_format((float)$totales['total_soles'], 2)], ';');
        fputcsv($output, ['N° Letras a pagar:', $totales['letras_pendientes']], ';');

        fclose($output);
        exit;
    }

    /**
     * Vista de impresión para PDF (window.print)
     */
    public function imprimirpdf(): void
    {
        $fechaDesde = $_GET['fecha_desde'] ?? date('Y-m-d');
        $fechaHasta = $_GET['fecha_hasta'] ?? date('Y-m-d');
        $empresaIdRaw = $_GET['empresa_id'] ?? '';
        $empresaIds = !empty($empresaIdRaw) ? array_map('intval', array_filter(explode(',', $empresaIdRaw))) : [];

        $reporte = $this->reporteModel->getReporteLetras($fechaDesde, $fechaHasta, $empresaIds);
        $totales = $this->reporteModel->getTotalesReporte($fechaDesde, $fechaHasta, $empresaIds);

        // Vista simplificada para impresión
        loadView('reportes/print', compact('reporte', 'totales', 'fechaDesde', 'fechaHasta'));
    }
}
