<?php
/**
 * Reporte PDF Ejecutivo Consolidado — Brújula Virtual / FONDOENERGIA
 * Sprint 12B · jsPDF + AutoTable (client-side, sin Composer)
 *
 * Muestra todas las votaciones finalizadas/cerradas con resultados por zona.
 * El botón "Descargar PDF" genera y descarga el reporte directamente en el navegador.
 */
session_save_path("/home/evolucionamos/public_html/mejora/sessions");
session_start();
require_once '../env_loader.php';
require_once '../app/models/conexion.php';
require_once '../app/models/administradores.php';

if (!isset($_SESSION['adm'])) { header('Location: index.php'); exit; }

// CSRF
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// Cargar datos de configuración
require_once '../datos.php';
try {
    $datosConf = (new \app\models\Datos())->obtenerDatos();
} catch (Exception $e) {
    $datosConf = null;
}
$entidad  = htmlspecialchars($datosConf->app   ?? 'Brújula Virtual');
$asamblea = htmlspecialchars($datosConf->titulo ?? 'Asamblea');
$logoPath = $datosConf->logo ?? 'assets/img/logo.png';
$logoAbs  = dirname(__DIR__) . '/' . $logoPath;

// Convertir logo a base64 para incrustar en el PDF
$logoB64 = '';
if (file_exists($logoAbs)) {
    $mime     = mime_content_type($logoAbs) ?: 'image/png';
    $logoB64  = 'data:' . $mime . ';base64,' . base64_encode(file_get_contents($logoAbs));
}

// Cargar todas las votaciones con resultados
$db = (new \app\models\conexion())->DB();

$votaciones = $db->query(
    "SELECT v.*,
            COUNT(DISTINCT vv.user_id) AS total_votaron,
            COUNT(vv.id)               AS total_votos
     FROM votaciones v
     LEFT JOIN votacion_votos vv ON vv.votacion_id = v.id
     WHERE v.estado IN ('cerrada','finalizada')
     GROUP BY v.id
     ORDER BY v.fecha_apertura ASC"
)->fetchAll(PDO::FETCH_OBJ);

// Para cada votación, cargar resultados por zona
$resultados = [];
foreach ($votaciones as $vot) {
    $rows = $db->prepare(
        "SELECT vc.nombre, vc.zona, vc.cedula,
                COUNT(vv.id) AS votos
         FROM votacion_candidatos vc
         LEFT JOIN votacion_votos vv
               ON vv.candidato_id = vc.id AND vv.votacion_id = :vid
         WHERE vc.votacion_id = :vid2
         GROUP BY vc.id
         ORDER BY vc.zona ASC, votos DESC"
    );
    $rows->execute([':vid' => $vot->id, ':vid2' => $vot->id]);
    $resultados[$vot->id] = $rows->fetchAll(PDO::FETCH_OBJ);
}

// Totales globales
$totalVotaciones = count($votaciones);
$totalVotos      = array_sum(array_column($votaciones, 'total_votaron'));
?>
<!DOCTYPE html>
<html lang="es">
<head>
  <?php require_once '../head.php'; ?>
  <title>Reporte PDF — <?= $entidad ?></title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf-autotable/3.8.2/jspdf.plugin.autotable.min.js"></script>
</head>
<body>
<div class="container-fluid py-4">
  <div class="row justify-content-center">
    <div class="col-lg-10">

      <!-- Header -->
      <div class="d-flex justify-content-between align-items-center mb-4">
        <div>
          <h4 class="mb-0">📄 Reporte PDF Ejecutivo</h4>
          <small class="text-muted"><?= $asamblea ?> — <?= $entidad ?></small>
        </div>
        <div class="d-flex gap-2">
          <a href="admin.php" class="btn btn-outline-secondary btn-sm">← Volver</a>
          <button class="btn btn-primary" onclick="generarPDF()">
            📥 Descargar PDF
          </button>
        </div>
      </div>

      <!-- Resumen global -->
      <div class="row g-3 mb-4">
        <div class="col-md-4">
          <div class="card text-center border-primary">
            <div class="card-body py-3">
              <div class="fs-2 fw-bold text-primary"><?= $totalVotaciones ?></div>
              <div class="text-muted small">Votaciones</div>
            </div>
          </div>
        </div>
        <div class="col-md-4">
          <div class="card text-center border-success">
            <div class="card-body py-3">
              <div class="fs-2 fw-bold text-success"><?= $totalVotos ?></div>
              <div class="text-muted small">Delegados participantes</div>
            </div>
          </div>
        </div>
        <div class="col-md-4">
          <div class="card text-center border-info">
            <div class="card-body py-3">
              <div class="fs-2 fw-bold text-info"><?= date('d/m/Y') ?></div>
              <div class="text-muted small">Fecha del reporte</div>
            </div>
          </div>
        </div>
      </div>

      <!-- Vista previa de votaciones -->
      <?php if (empty($votaciones)): ?>
        <div class="alert alert-info">No hay votaciones cerradas o finalizadas para incluir en el reporte.</div>
      <?php else: ?>
        <?php foreach ($votaciones as $vot): ?>
          <div class="card shadow-sm mb-3">
            <div class="card-header d-flex justify-content-between align-items-center">
              <span class="fw-bold"><?= htmlspecialchars($vot->titulo) ?></span>
              <span class="badge bg-secondary"><?= $vot->total_votaron ?> votaron</span>
            </div>
            <div class="card-body p-0">
              <div class="table-responsive">
                <table class="table table-sm table-hover mb-0">
                  <thead class="table-light">
                    <tr><th>Candidato</th><th>Zona</th><th>Votos</th></tr>
                  </thead>
                  <tbody>
                    <?php foreach ($resultados[$vot->id] as $r): ?>
                    <tr>
                      <td><?= htmlspecialchars($r->nombre) ?></td>
                      <td><?= htmlspecialchars($r->zona) ?></td>
                      <td><strong><?= $r->votos ?></strong></td>
                    </tr>
                    <?php endforeach; ?>
                  </tbody>
                </table>
              </div>
            </div>
          </div>
        <?php endforeach; ?>
      <?php endif; ?>

    </div>
  </div>
</div>

<script>
// ── Datos PHP → JS ──────────────────────────────────────────────────────────
const PDF_CONFIG = {
    entidad:  <?= json_encode($entidad)  ?>,
    asamblea: <?= json_encode($asamblea) ?>,
    fecha:    <?= json_encode(date('d/m/Y H:i')) ?>,
    logo:     <?= json_encode($logoB64) ?>,
    votaciones: <?= json_encode(array_map(function($v) use ($resultados) {
        return [
            'id'           => $v->id,
            'titulo'       => $v->titulo,
            'tipo'         => $v->tipo,
            'total_votaron'=> $v->total_votaron,
            'fecha_apertura' => $v->fecha_apertura,
            'fecha_cierre'   => $v->fecha_cierre,
            'pregunta'     => $v->pregunta ?? '',
            'resultados'   => array_map(fn($r) => [
                'nombre' => $r->nombre,
                'zona'   => $r->zona,
                'votos'  => (int)$r->votos,
            ], $resultados[$v->id])
        ];
    }, $votaciones)) ?>
};

async function generarPDF() {
    const { jsPDF } = window.jspdf;
    const doc = new jsPDF({ orientation: 'portrait', unit: 'mm', format: 'a4' });
    const W = 210, M = 14;
    const AZUL   = [31, 78, 121];
    const GRIS   = [108, 117, 125];
    const BLANCO = [255, 255, 255];

    // ── PORTADA ─────────────────────────────────────────────────────────────
    doc.setFillColor(...AZUL);
    doc.rect(0, 0, W, 60, 'F');

    // Logo (si existe)
    if (PDF_CONFIG.logo) {
        try { doc.addImage(PDF_CONFIG.logo, 'PNG', M, 8, 30, 30); } catch(e) {}
    }

    doc.setTextColor(...BLANCO);
    doc.setFontSize(22); doc.setFont(undefined, 'bold');
    doc.text(PDF_CONFIG.entidad, W/2, 28, { align: 'center' });
    doc.setFontSize(13); doc.setFont(undefined, 'normal');
    doc.text(PDF_CONFIG.asamblea, W/2, 38, { align: 'center' });
    doc.setFontSize(10);
    doc.text('Informe Ejecutivo de Votaciones · ' + PDF_CONFIG.fecha, W/2, 48, { align: 'center' });

    // Resumen global
    doc.setTextColor(0);
    doc.setFontSize(11); doc.setFont(undefined, 'bold');
    doc.text('Resumen de la Asamblea', M, 72);
    doc.setFont(undefined, 'normal'); doc.setFontSize(10);
    doc.text(`Total de votaciones: ${PDF_CONFIG.votaciones.length}`, M, 80);
    doc.text(`Total delegados participantes: ${PDF_CONFIG.votaciones.reduce((s,v)=>s+(+v.total_votaron),0)}`, M, 87);
    doc.text(`Fecha de generación: ${PDF_CONFIG.fecha}`, M, 94);

    // ── UNA PÁGINA POR VOTACIÓN ───────────────────────────────────────────
    PDF_CONFIG.votaciones.forEach((vot, idx) => {
        doc.addPage();

        // Header de página
        doc.setFillColor(...AZUL);
        doc.rect(0, 0, W, 18, 'F');
        doc.setTextColor(...BLANCO);
        doc.setFontSize(12); doc.setFont(undefined, 'bold');
        doc.text(vot.titulo, M, 11);
        doc.setFontSize(8); doc.setFont(undefined, 'normal');
        doc.text(PDF_CONFIG.entidad + ' · ' + PDF_CONFIG.fecha, W - M, 11, { align: 'right' });

        let y = 26;
        doc.setTextColor(0);

        // Metadatos de votación
        doc.setFontSize(9); doc.setTextColor(...GRIS);
        doc.text(`Tipo: ${vot.tipo}  ·  Participantes: ${vot.total_votaron}`, M, y);
        if (vot.pregunta) { y += 6; doc.text('Pregunta: ' + vot.pregunta, M, y); }
        y += 8;

        // Tabla de resultados
        if (vot.resultados.length > 0) {
            // Agrupar por zona
            const zonas = [...new Set(vot.resultados.map(r => r.zona))];

            zonas.forEach(zona => {
                const filas = vot.resultados.filter(r => r.zona === zona);
                const maxV  = Math.max(...filas.map(r => r.votos));

                doc.setFontSize(10); doc.setFont(undefined, 'bold'); doc.setTextColor(...AZUL);
                doc.text('Zona: ' + zona, M, y); y += 5;

                doc.autoTable({
                    startY: y,
                    head: [['Candidato', 'Votos', '%']],
                    body: filas.map(r => {
                        const pct = vot.total_votaron > 0
                            ? ((r.votos / vot.total_votaron) * 100).toFixed(1) + '%'
                            : '0%';
                        return [r.nombre, r.votos, pct];
                    }),
                    styles:       { fontSize: 9, cellPadding: 2 },
                    headStyles:   { fillColor: AZUL, textColor: BLANCO, fontStyle: 'bold' },
                    columnStyles: { 1: { halign: 'center' }, 2: { halign: 'center' } },
                    alternateRowStyles: { fillColor: [245, 247, 250] },
                    margin: { left: M, right: M },
                    tableWidth: W - 2*M,
                });
                y = doc.lastAutoTable.finalY + 8;
            });
        } else {
            doc.setTextColor(...GRIS); doc.setFontSize(9);
            doc.text('Sin resultados registrados.', M, y);
        }

        // Footer de página
        doc.setFontSize(8); doc.setTextColor(...GRIS);
        doc.text(`Página ${idx + 2}`, W/2, 290, { align: 'center' });
    });

    // Página final: footer
    doc.setFontSize(8); doc.setTextColor(...GRIS);
    doc.text('Generado por Brújula Virtual · ' + PDF_CONFIG.entidad, W/2, 290, { align: 'center' });

    // Descargar
    const nombre = `Reporte_${PDF_CONFIG.entidad.replace(/\s+/g,'_')}_${new Date().toISOString().slice(0,10)}.pdf`;
    doc.save(nombre);
}
</script>
</body>
</html>
