<?php
// Configurar para debugging
error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/../debug.log');

// Establecer tiempo límite
set_time_limit(60);

session_start();
require_once __DIR__ . '/../config/db_auto.php';
require_once __DIR__ . '/system_logger.php';

$logger = SystemLogger::getInstance();

// Log de debugging
error_log("🚀 Iniciando reporte: " . json_encode($_GET));

// Verificar autenticación y permisos
if (!isset($_SESSION['user_id'])) {
    error_log("❌ Error: Usuario no autenticado");
    $logger->warning('Intento de acceso no autorizado a reportes', 'IP: ' . ($_SERVER['REMOTE_ADDR'] ?? 'N/A'));
    header('Content-Type: application/json; charset=utf-8');
    http_response_code(401);
    echo json_encode(['success' => false, 'error' => 'No autorizado']);
    exit;
}

$rol = strtolower($_SESSION['rol'] ?? '');
if (!in_array($rol, ['administrador', 'digitador', 'convivencia', 'inspector'])) {
    error_log("❌ Error: Sin permisos. Rol: " . $rol);
    $logger->warning('Acceso denegado a reportes', "Usuario sin permisos suficientes. Rol: $rol");
    header('Content-Type: application/json; charset=utf-8');
    http_response_code(403);
    echo json_encode(['success' => false, 'error' => 'Sin permisos para generar reportes']);
    exit;
}

// Obtener parámetros según el método HTTP
$data = [];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Manejar datos JSON POST
    $json_input = file_get_contents('php://input');
    $post_data = json_decode($json_input, true);

    if ($post_data) {
        $tipo = $post_data['tipo_reporte'] ?? '';
        $filtros = $post_data['filtros'] ?? [];
        $anio = $filtros['anio'] ?? '';
        $tipo_ensenanza = $filtros['tipo_ensenanza_id'] ?? '';
        $grado_id = $filtros['grado_id'] ?? '';
        $formato = 'json'; // POST siempre es para respuesta JSON

        error_log("📊 POST Data recibido: " . json_encode($post_data));
    } else {
        error_log("❌ Error: JSON POST inválido");
        header('Content-Type: application/json; charset=utf-8');
        echo json_encode(['success' => false, 'error' => 'Datos POST inválidos']);
        exit;
    }
} else {
    // Manejar parámetros GET (para exportar Excel)
    $tipo = $_GET['tipo'] ?? '';
    $anio = $_GET['anio'] ?? '';
    $tipo_ensenanza = $_GET['tipo_ensenanza_id'] ?? '';
    $grado_id = $_GET['grado_id'] ?? '';
    $formato = ($tipo === 'consolidado') ? 'excel' : 'html';
}

error_log("📊 Parámetros procesados: tipo=$tipo, anio=$anio, tipo_ensenanza=$tipo_ensenanza, grado_id=$grado_id, formato=$formato");

// Validar parámetros básicos
if (empty($tipo) || empty($anio)) {
    error_log("❌ Error: Parámetros insuficientes");
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode(['success' => false, 'error' => 'Parámetros insuficientes']);
    exit;
}

try {
    error_log("🔍 Generando consulta para tipo: $tipo");

    // Generar consulta base según el tipo de reporte
    $consulta = generarConsultaReporte($tipo, $anio, $tipo_ensenanza, $grado_id);

    if (!$consulta) {
        error_log("❌ Error: Tipo de reporte no válido: $tipo");
        header('Content-Type: application/json; charset=utf-8');
        echo json_encode(['success' => false, 'error' => 'Tipo de reporte no válido']);
        exit;
    }

    error_log("📝 Ejecutando consulta SQL");

    // Ejecutar consulta
    $stmt = $pdo->prepare($consulta['sql']);
    $stmt->execute($consulta['params']);
    $resultados = $stmt->fetchAll(PDO::FETCH_ASSOC);

    error_log("✅ Consulta ejecutada. Registros encontrados: " . count($resultados));

    // Procesar resultados según el tipo
    $resultados = procesarResultados($resultados, $tipo);

    if ($formato === 'excel' && $tipo === 'consolidado') {
        error_log("📋 Generando Excel para tipo: $tipo");

        // Log de exportación Excel
        $logger->data('Exportación Excel', "Reporte: $tipo, Registros: " . count($resultados) . ", Año: $anio, Tipo enseñanza: $tipo_ensenanza");

        generarExcel($resultados, $tipo, $anio, $tipo_ensenanza, $grado_id);
    } else {
        // Para los reportes que se muestran en pantalla, generamos el HTML
        // y lo envolvemos en una respuesta JSON que el frontend espera.
        error_log("📤 Generando respuesta JSON con contenido HTML");
        header('Content-Type: application/json; charset=utf-8');

        $html_content = generarHTML($resultados, $tipo);

        // Log de generación de reporte
        $logger->info('Reporte generado', "Tipo: $tipo, Registros: " . count($resultados) . ", Año: $anio, Tipo enseñanza: $tipo_ensenanza");
        echo json_encode([
            'success' => true,
            'html' => $html_content,
            'total_registros' => count($resultados)
        ]);
    }
} catch (Exception $e) {
    error_log("❌ Error en generar_reporte.php: " . $e->getMessage());
    error_log("📍 Stack trace: " . $e->getTraceAsString());

    // Log de error
    $logger->error('Error en generación de reporte', "Tipo: $tipo, Error: " . $e->getMessage());

    header('Content-Type: application/json; charset=utf-8');
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'error' => 'Error interno del servidor: ' . $e->getMessage(),
        'tipo' => $tipo ?? 'desconocido'
    ]);
} catch (Throwable $e) {
    error_log("❌ Error fatal en generar_reporte.php: " . $e->getMessage());

    header('Content-Type: application/json; charset=utf-8');
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'error' => 'Error fatal del servidor',
        'message' => $e->getMessage()
    ]);
}

// ... [resto de las funciones permanecen igual]

function generarConsultaReporte($tipo, $anio, $tipo_ensenanza, $grado_id)
{
    $base_sql = "
        SELECT DISTINCT
            a.run,
            CONCAT(a.nombre, ' ', a.ap_paterno, ' ', a.ap_materno) as nombre_completo,
            g.nombre as grado_nombre,
            a.id as alumno_id
    ";

    $base_from = "
        FROM alumnos a
        INNER JOIN matriculas m ON a.id = m.alumno_id
        INNER JOIN grados g ON m.grado_id = g.id
    ";

    $base_where = "
        WHERE m.anio = ? 
        AND g.tipo_ensenanza_id = ?
        AND m.estado = 'activa'
    ";

    $params = [$anio, $tipo_ensenanza];

    if (!empty($grado_id)) {
        $base_where .= " AND g.id = ?";
        $params[] = $grado_id;
    }

    switch ($tipo) {
        case 'religion':
            $sql = $base_sql . ", 
                COALESCE(sa.opta_religion, 0) as opta_religion,
                sa.religion
                " . $base_from . "
                LEFT JOIN social_alumno sa ON a.id = sa.alumno_id
                " . $base_where;
            break;

        case 'transporte':
            $sql = $base_sql . ", 
                COALESCE(sa.transporte, 0) as transporte,
                sa.sector
                " . $base_from . "
                LEFT JOIN social_alumno sa ON a.id = sa.alumno_id
                " . $base_where;
            break;

        case 'sector':
            $sql = $base_sql . ", 
                sa.sector
                " . $base_from . "
                LEFT JOIN social_alumno sa ON a.id = sa.alumno_id
                " . $base_where . "
                AND sa.sector IS NOT NULL 
                AND sa.sector != ''";
            break;

        case 'junaeb':
            $sql = $base_sql . ", 
                COALESCE(sa.junaeb, 0) as junaeb
                " . $base_from . "
                LEFT JOIN social_alumno sa ON a.id = sa.alumno_id
                " . $base_where . "
                AND sa.junaeb = 1";
            break;

        case 'uso_imagen':
            $sql = $base_sql . ", 
                COALESCE(sa.uso_imagen, 0) as uso_imagen
                " . $base_from . "
                LEFT JOIN social_alumno sa ON a.id = sa.alumno_id
                " . $base_where;
            break;

        case 'enfermedad':
            $sql = $base_sql . ", 
                sal.enfermedad_cuidado
                " . $base_from . "
                LEFT JOIN salud_alumno sal ON a.id = sal.alumno_id
                " . $base_where . "
                AND sal.enfermedad_cuidado IS NOT NULL 
                AND sal.enfermedad_cuidado != ''";
            break;

        case 'medicamento':
            $sql = $base_sql . ", 
                sal.medicamento_uso_diario
                " . $base_from . "
                LEFT JOIN salud_alumno sal ON a.id = sal.alumno_id
                " . $base_where . "
                AND sal.medicamento_uso_diario IS NOT NULL 
                AND sal.medicamento_uso_diario != ''";
            break;

        case 'observaciones_salud':
            $sql = $base_sql . ", 
                sal.observaciones
                " . $base_from . "
                LEFT JOIN salud_alumno sal ON a.id = sal.alumno_id
                " . $base_where . "
                AND sal.observaciones IS NOT NULL 
                AND sal.observaciones != ''";
            break;

        case 'consolidado':
            $sql = $base_sql . ", 
                a.fecha_nac,
                COALESCE(sa.opta_religion, 0) as opta_religion,
                sa.religion,
                COALESCE(sa.transporte, 0) as transporte,
                sa.sector,
                COALESCE(sa.junaeb, 0) as junaeb,
                COALESCE(sa.uso_imagen, 0) as uso_imagen,
                sal.enfermedad_cuidado,
                sal.medicamento_uso_diario,
                sal.observaciones
                " . $base_from . "
                LEFT JOIN social_alumno sa ON a.id = sa.alumno_id
                LEFT JOIN salud_alumno sal ON a.id = sal.alumno_id
                " . $base_where;
            break;

        default:
            return null;
    }

    $sql .= " ORDER BY g.nombre, a.ap_paterno, a.ap_materno, a.nombre";

    return ['sql' => $sql, 'params' => $params];
}

function procesarResultados($resultados, $tipo)
{
    foreach ($resultados as &$fila) {
        // Procesar campos booleanos
        if (isset($fila['opta_religion'])) {
            $fila['opta_religion_texto'] = $fila['opta_religion'] == 1 ? 'SÍ' : 'NO';
        }
        if (isset($fila['transporte'])) {
            $fila['transporte_texto'] = $fila['transporte'] == 1 ? 'SÍ' : 'NO';
        }
        if (isset($fila['junaeb'])) {
            $fila['junaeb_texto'] = $fila['junaeb'] == 1 ? 'SÍ' : 'NO';
        }
        if (isset($fila['uso_imagen'])) {
            $fila['uso_imagen_texto'] = $fila['uso_imagen'] == 1 ? 'SÍ' : 'NO';
        }

        // Procesar fecha de nacimiento y edad
        if (!empty($fila['fecha_nac']) && $fila['fecha_nac'] !== null) {
            $dt = new DateTime($fila['fecha_nac']);
            $fila['fecha_nac_fmt'] = $dt->format('d/m/Y');
            $fila['edad'] = $dt->diff(new DateTime())->y;
        } else {
            $fila['fecha_nac_fmt'] = '-';
            $fila['edad'] = '-';
        }

        // Limpiar valores nulos
        foreach ($fila as $key => $value) {
            if ($value === null || $value === '') {
                $fila[$key] = '-';
            }
        }
    }

    return $resultados;
}

function generarHTML($datos, $tipo)
{
    if (empty($datos)) {
        return '<div class="alert alert-warning">No se encontraron resultados para este reporte.</div>';
    }

    $encabezados = obtenerEncabezadosExcel($tipo);
    $html = '<div class="card shadow-sm"><div class="card-body table-responsive">';
    $html .= '<table class="table table-striped table-hover">';
    $html .= '<thead><tr>';
    foreach ($encabezados as $encabezado) {
        $html .= '<th>' . htmlspecialchars($encabezado) . '</th>';
    }
    $html .= '</tr></thead>';
    $html .= '<tbody>';

    foreach ($datos as $fila) {
        $html .= '<tr>';
        foreach (array_keys($encabezados) as $key) {
            $valor = obtenerValorParaExcel($fila, $key, $tipo);
            $class = '';
            if (in_array($key, ['enfermedad_cuidado', 'medicamento_uso_diario', 'observaciones'])) {
                $class = 'text-wrap-column';
            }
            $html .= '<td class="' . $class . '">' . htmlspecialchars($valor) . '</td>';
        }
        $html .= '</tr>';
    }

    $html .= '</tbody></table>';
    $html .= '</div>';
    $html .= '<div class="card-footer text-muted small">Total de registros: ' . count($datos) . '</div>';
    $html .= '</div>';

    return $html;
}

function generarExcel($datos, $tipo, $anio, $tipo_ensenanza, $grado)
{
    error_log("🔍 EXCEL DEBUG - Iniciando generación");

    // Crear archivo Excel usando una biblioteca simple
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment; filename="reporte_' . $tipo . '_' . date('Y-m-d') . '.xls"');
    header('Cache-Control: max-age=0');

    // Crear tabla HTML que Excel puede interpretar
    echo '<?xml version="1.0" encoding="UTF-8"?>';
    echo '<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" ';
    echo 'xmlns:o="urn:schemas-microsoft-com:office:office" ';
    echo 'xmlns:x="urn:schemas-microsoft-com:office:excel" ';
    echo 'xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" ';
    echo 'xmlns:html="http://www.w3.org/TR/REC-html40">';

    $encabezados = obtenerEncabezadosExcel($tipo);

    echo '<Worksheet ss:Name="Reporte">';
    echo '<Table>';

    // Encabezados
    echo '<Row>';
    foreach ($encabezados as $encabezado) {
        echo '<Cell><Data ss:Type="String">' . htmlspecialchars($encabezado) . '</Data></Cell>';
    }
    echo '</Row>';

    // Datos
    foreach ($datos as $fila) {
        echo '<Row>';
        foreach (array_keys($encabezados) as $key) {
            $valor = obtenerValorParaExcel($fila, $key, $tipo);
            echo '<Cell><Data ss:Type="String">' . htmlspecialchars($valor) . '</Data></Cell>';
        }
        echo '</Row>';
    }

    echo '</Table>';
    echo '</Worksheet>';
    echo '</Workbook>';

    exit;
}

function obtenerEncabezadosExcel($tipo)
{
    $encabezados_base = [
        'run' => 'RUN',
        'nombre_completo' => 'Nombre Completo',
        'grado_nombre' => 'Grado'
    ];

    switch ($tipo) {
        case 'religion':
            return array_merge($encabezados_base, [
                'opta_religion_texto' => 'Opta Religión',
                'religion' => 'Religión'
            ]);

        case 'transporte':
            return array_merge($encabezados_base, [
                'transporte_texto' => 'Usa Transporte',
                'sector' => 'Sector'
            ]);

        case 'sector':
            return array_merge($encabezados_base, [
                'sector' => 'Sector'
            ]);

        case 'junaeb':
            return array_merge($encabezados_base, [
                'junaeb_texto' => 'Beneficio JUNAEB'
            ]);

        case 'uso_imagen':
            return array_merge($encabezados_base, [
                'uso_imagen_texto' => 'Autoriza Uso Imagen'
            ]);

        case 'enfermedad':
            return array_merge($encabezados_base, [
                'enfermedad_cuidado' => 'Enfermedad de Cuidado'
            ]);

        case 'medicamento':
            return array_merge($encabezados_base, [
                'medicamento_uso_diario' => 'Medicamento Uso Diario'
            ]);

        case 'observaciones_salud':
            return array_merge($encabezados_base, [
                'observaciones' => 'Observaciones de Salud'
            ]);

        case 'consolidado':
            return array_merge($encabezados_base, [
                'fecha_nac_fmt'         => 'Fecha Nacimiento',
                'edad'                  => 'Edad',
                'opta_religion_texto'   => 'Opta Religión',
                'religion'              => 'Religión',
                'transporte_texto'      => 'Usa Transporte',
                'sector'                => 'Sector',
                'junaeb_texto'          => 'Beneficio JUNAEB',
                'uso_imagen_texto'      => 'Autoriza Uso Imagen',
                'enfermedad_cuidado'    => 'Enfermedad de Cuidado',
                'medicamento_uso_diario' => 'Medicamento Uso Diario',
                'observaciones'         => 'Observaciones de Salud'
            ]);

        default:
            return $encabezados_base;
    }
}

function obtenerValorParaExcel($fila, $key, $tipo)
{
    // Si existe directamente, devolverlo
    if (array_key_exists($key, $fila)) {
        return $fila[$key] ?? '-';
    }

    // Para el caso consolidado, manejar campos especiales
    if ($tipo === 'consolidado') {
        switch ($key) {
            case 'opta_religion_texto':
                return isset($fila['opta_religion']) ? ($fila['opta_religion'] == 1 ? 'SÍ' : 'NO') : '-';
            case 'transporte_texto':
                return isset($fila['transporte']) ? ($fila['transporte'] == 1 ? 'SÍ' : 'NO') : '-';
            case 'junaeb_texto':
                return isset($fila['junaeb']) ? ($fila['junaeb'] == 1 ? 'SÍ' : 'NO') : '-';
            case 'uso_imagen_texto':
                return isset($fila['uso_imagen']) ? ($fila['uso_imagen'] == 1 ? 'SÍ' : 'NO') : '-';
        }
    }

    return '-';
}
