<?php
include_once 'config/database.php';

try {
    $database = new Database();
    $conn = $database->getConnection();

    // Configurar charset UTF-8 para la conexión
    if ($conn) {
        $conn->exec("SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci");
        $conn->exec("SET CHARACTER SET utf8mb4");
    }

    // Asegurar sesión iniciada
    if (session_status() === PHP_SESSION_NONE) {
        session_start();
    }

    // Obtener parámetros de filtro
    $search_nombre = isset($_GET['search_nombre']) ? trim($_GET['search_nombre']) : '';
    $filtro_estado = isset($_GET['filtro_estado']) ? trim($_GET['filtro_estado']) : '';
    $filtro_grupo = isset($_GET['filtro_grupo']) ? trim($_GET['filtro_grupo']) : '';
    $con_preguntas = isset($_GET['con_preguntas']) && $_GET['con_preguntas'] == '1';

    // Consultar registros (sin límite de paginación para exportar todos)
    $query = "SELECT ce.codclienteencuesta, ce.codprogramacion, ce.codencuesta, ce.estado, ce.fecha,
                     c.nombre, c.documento, c.distrito, c.grupoimportado,
                     e.encuesta,
                     (SELECT COUNT(*) FROM trespuesta WHERE codprogramacion = ce.codprogramacion) as total_respuestas
              FROM tcliente_encuesta ce
              INNER JOIN tclientes_import c ON ce.codprogramacion = c.codprogramacion
              INNER JOIN tencuesta e ON ce.codencuesta = e.codencuesta
              WHERE 1=1";
    
    $params = [];
    
    if ($search_nombre) {
        $query .= " AND c.nombre LIKE ?";
        $params[] = "%{$search_nombre}%";
    }
    
    if ($filtro_estado) {
        $query .= " AND ce.estado = ?";
        $params[] = $filtro_estado;
    }
    
    if ($filtro_grupo) {
        $query .= " AND c.grupoimportado = ?";
        $params[] = $filtro_grupo;
    }
    
    $query .= " ORDER BY ce.fecha DESC, c.nombre ASC";
    
    $stmt = $conn->prepare($query);
    $stmt->execute($params);
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

    // Si se solicita con preguntas y respuestas, obtener la estructura de preguntas
    $preguntas_por_encuesta = [];
    $todas_preguntas = [];
    $respuestas_cache = [];
    
    if ($con_preguntas) {
        // Obtener todas las encuestas únicas de los resultados
        $encuestas_ids = array_unique(array_column($rows, 'codencuesta'));
        
        if (!empty($encuestas_ids)) {
            $placeholders = str_repeat('?,', count($encuestas_ids) - 1) . '?';
            
            // Obtener todas las preguntas de estas encuestas con su orden
            $sql_preguntas = "SELECT dep.codencuesta, dep.codpreguntas, p.pregunta, dep.orden,
                                    e.encuesta as nombre_encuesta
                             FROM tdet_encu_pregu dep
                             INNER JOIN tpreguntas p ON dep.codpreguntas = p.codpreguntas
                             INNER JOIN tencuesta e ON dep.codencuesta = e.codencuesta
                             WHERE dep.codencuesta IN ($placeholders)
                             ORDER BY dep.codencuesta, dep.orden ASC";
            
            $stmt_preguntas = $conn->prepare($sql_preguntas);
            $stmt_preguntas->execute($encuestas_ids);
            $preguntas = $stmt_preguntas->fetchAll(PDO::FETCH_ASSOC);
            
            // Organizar preguntas por encuesta
            foreach ($preguntas as $preg) {
                $codencuesta = $preg['codencuesta'];
                if (!isset($preguntas_por_encuesta[$codencuesta])) {
                    $preguntas_por_encuesta[$codencuesta] = [];
                }
                $preguntas_por_encuesta[$codencuesta][] = $preg;
                $todas_preguntas[$preg['codpreguntas']] = $preg;
            }
            
            // Obtener todas las respuestas de los clientes en los resultados
            $codprogramaciones = array_unique(array_column($rows, 'codprogramacion'));
            if (!empty($codprogramaciones)) {
                $placeholders_prog = str_repeat('?,', count($codprogramaciones) - 1) . '?';
                
                $sql_respuestas = "SELECT r.codprogramacion, r.codpreg_alterna, r.respuesta, r.fecharespuesta,
                                          dpa.codpreguntas
                                   FROM trespuesta r
                                   LEFT JOIN tdetpreg_alterna dpa ON r.codpreg_alterna = dpa.codpreg_alterna
                                   WHERE r.codprogramacion IN ($placeholders_prog)";
                
                $stmt_respuestas = $conn->prepare($sql_respuestas);
                $stmt_respuestas->execute($codprogramaciones);
                $respuestas = $stmt_respuestas->fetchAll(PDO::FETCH_ASSOC);
                
                // Organizar respuestas por codprogramacion y codpreguntas
                foreach ($respuestas as $resp) {
                    $codprog = $resp['codprogramacion'];
                    $codpreg = $resp['codpreguntas'];
                    if (!isset($respuestas_cache[$codprog])) {
                        $respuestas_cache[$codprog] = [];
                    }
                    // Si hay múltiples respuestas para la misma pregunta, concatenarlas
                    if (isset($respuestas_cache[$codprog][$codpreg])) {
                        $respuestas_cache[$codprog][$codpreg] .= ' | ' . $resp['respuesta'];
                    } else {
                        $respuestas_cache[$codprog][$codpreg] = $resp['respuesta'];
                    }
                }
            }
        }
    }

    // Headers para Excel (XLS - HTML table compatible)
    $filename = $con_preguntas ? 'respuestas_encuestas_detallado_' . date('Ymd_His') . '.xls' : 'respuestas_encuestas_' . date('Ymd_His') . '.xls';
    header('Content-Type: application/vnd.ms-excel; charset=utf-8');
    header('Content-Disposition: attachment; filename="' . $filename . '"');
    header('Pragma: no-cache');
    header('Expires: 0');
    header('Cache-Control: no-cache, must-revalidate');

    // BOM para UTF-8 (ayuda con caracteres especiales)
    echo "\xEF\xBB\xBF";

    // Salida como tabla HTML que Excel interpreta como XLS
    echo '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">';
    echo '<head>';
    echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">';
    echo '<!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>Respuestas Encuestas</x:Name><x:WorksheetOptions><x:DefaultRowHeight>285</x:DefaultRowHeight></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->';
    echo '</head>';
    echo '<body>';
    echo '<table border="1" cellspacing="0" cellpadding="5">';
    
    // Encabezados con estilo
    echo '<tr style="background-color: #4CAF50; color: white; font-weight: bold;">';
    echo '<th>ID</th>';
    echo '<th>Cliente</th>';
    echo '<th>Documento</th>';
    echo '<th>Distrito</th>';
    echo '<th>Grupo Importado</th>';
    echo '<th>Encuesta</th>';
    echo '<th>Estado</th>';
    echo '<th>Fecha</th>';
    echo '<th>Total Respuestas</th>';
    
    // Si se solicita con preguntas, recopilar todas las preguntas únicas una sola vez
    $preguntas_unicas = [];
    $preguntas_orden = [];
    
    if ($con_preguntas) {
        // Recopilar todas las preguntas únicas de todas las encuestas, manteniendo el orden
        foreach ($preguntas_por_encuesta as $codencuesta => $preguntas) {
            foreach ($preguntas as $preg) {
                $codpreguntas = $preg['codpreguntas'];
                if (!isset($preguntas_unicas[$codpreguntas])) {
                    $preguntas_unicas[$codpreguntas] = $preg;
                    $preguntas_orden[] = $codpreguntas;
                }
            }
        }
        
        // Crear columnas para cada pregunta única
        foreach ($preguntas_orden as $codpreguntas) {
            $preg = $preguntas_unicas[$codpreguntas];
            $pregunta_texto = htmlspecialchars($preg['pregunta']);
            // Limitar longitud del encabezado para Excel
            if (mb_strlen($pregunta_texto) > 50) {
                $pregunta_texto = mb_substr($pregunta_texto, 0, 47) . '...';
            }
            echo '<th>' . $pregunta_texto . '</th>';
        }
    }
    
    echo '</tr>';
    
    // Datos
    foreach ($rows as $row) {
        echo '<tr>';
        echo '<td>' . htmlspecialchars($row['codclienteencuesta']) . '</td>';
        echo '<td>' . htmlspecialchars($row['nombre'] ?? '') . '</td>';
        echo '<td>' . htmlspecialchars($row['documento'] ?? '') . '</td>';
        echo '<td>' . htmlspecialchars($row['distrito'] ?? '') . '</td>';
        echo '<td>' . htmlspecialchars($row['grupoimportado'] ?? '') . '</td>';
        echo '<td>' . htmlspecialchars($row['encuesta'] ?? '') . '</td>';
        echo '<td>' . htmlspecialchars($row['estado'] ?? '') . '</td>';
        echo '<td>' . ($row['fecha'] ? date('d/m/Y H:i', strtotime($row['fecha'])) : '') . '</td>';
        echo '<td>' . htmlspecialchars($row['total_respuestas']) . '</td>';
        
        // Si se solicita con preguntas, agregar las respuestas en las columnas correspondientes
        if ($con_preguntas) {
            $codprogramacion = $row['codprogramacion'];
            
            // Obtener respuestas de este cliente
            $respuestas_cliente = isset($respuestas_cache[$codprogramacion]) ? $respuestas_cache[$codprogramacion] : [];
            
            // Llenar columnas con las respuestas correspondientes a cada pregunta (usando el orden ya calculado)
            foreach ($preguntas_orden as $codpreguntas) {
                $respuesta_texto = isset($respuestas_cliente[$codpreguntas]) ? htmlspecialchars($respuestas_cliente[$codpreguntas]) : '';
                echo '<td>' . $respuesta_texto . '</td>';
            }
        }
        
        echo '</tr>';
    }
    
    echo '</table>';
    echo '</body></html>';
    
} catch(Exception $e) {
    header('Content-Type: text/html; charset=utf-8');
    echo 'Error al exportar: ' . htmlspecialchars($e->getMessage());
}
?>
