<?php
declare(strict_types=1);
$authApp = 'informes';
session_start();
require __DIR__ . '/../../config/auth.php';
require __DIR__ . '/../../../../../config/db2.php';
require __DIR__ . '/../../lib/helpers.php';

// ── BASE_URL (informe es página standalone, sin menu.php) ────────────────────
if (!defined('BASE_URL')) {
    $proto  = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
    $script = str_replace('\\', '/', $_SERVER['SCRIPT_NAME']);
    $pos    = strpos($script, '/agendaJuicios');
    $base   = $pos !== false ? substr($script, 0, $pos) . '/agendaJuicios' : '/agendaJuicios';
    define('BASE_URL', $proto . '://' . $_SERVER['HTTP_HOST'] . $base);
}

// ── Parámetros ────────────────────────────────────────────────────────────────
$tipo    = $_GET['tipo']    ?? 'pp_3y';
$formato = strtolower($_GET['formato'] ?? 'html');   // html | pdf | csv | mail
$mes     = preg_match('/^\d{4}-\d{2}$/', $_GET['mes'] ?? '') ? $_GET['mes'] : date('Y-m');
$soloRes = !empty($_GET['solo_resumen']);

// Parámetros extra para aud_dia
$audFecha      = preg_match('/^\d{4}-\d{2}-\d{2}$/', $_GET['fecha'] ?? '') ? $_GET['fecha'] : date('Y-m-d');
$audCat        = preg_match('/^\w+$/', $_GET['cat']   ?? '') ? $_GET['cat']   : 'total';
$audTurno      = in_array($_GET['turno'] ?? '', ['M','V',''], true) ? ($_GET['turno'] ?? '') : '';
$audSoloCan    = !empty($_GET['solo_canceladas']);

// ── Meses en español ──────────────────────────────────────────────────────────
$MESES = ['Enero','Febrero','Marzo','Abril','Mayo','Junio',
          'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'];
$mesNum   = (int)substr($mes, 5, 2);
$mesAnio  = (int)substr($mes, 0, 4);
$mesLabel = ($MESES[$mesNum - 1] ?? '?') . ' ' . $mesAnio;

// ── Tiempo de PP en años/meses/días ──────────────────────────────────────────
function diasATiempoPP(int $dias): string
{
    $anios = (int)($dias / 365);
    $resto = $dias % 365;
    $meses = (int)($resto / 30);
    $dd    = $resto % 30;
    $p = [];
    if ($anios > 0) $p[] = $anios . ' año'  . ($anios !== 1 ? 's' : '');
    if ($meses > 0) $p[] = $meses . ' mes'  . ($meses !== 1 ? 'es' : '');
    $p[] = $dd . ' día' . ($dd !== 1 ? 's' : '');
    return implode("\n", $p);
}

// ── Etapa actual de un agendamiento ──────────────────────────────────────────
function etapaDebate(string $desde, string $hasta, ?string $fallo, ?string $finBloqueo): string
{
    $hoy = date('Y-m-d');
    if ($hoy <= $hasta)                             return 'Debate';
    if ($fallo      && $hoy <= $fallo)              return 'Veredicto';
    if ($finBloqueo && $hoy <= $finBloqueo)         return 'Fundamentos';
    return '—';
}

// ── Columnas fecha ────────────────────────────────────────────────────────────
function esCampoFecha(string $campo): bool
{
    return preg_match('/fecha|_desde|_hasta|_fallo|bloqueo|vencimiento|detencion/', $campo) === 1;
}

// ── Configuración de reportes ─────────────────────────────────────────────────
$colsPP = [
    'cuij_principal'       => 'CUIJ',
    'imputados'            => 'Imputados',
    'delitos'              => 'Delitos',
    'fecha_detencion'      => 'Detención',
    'tiempo_pp'            => 'Tiempo en PP',
    'vencimiento_pp_actual'=> 'Venc. PP',
    'prioridad'            => 'Prioridad',
];

$reportes = [
    'pp_3y' => [
        'titulo'    => 'Preventivas Prolongadas — Más de 3 años',
        'subtitulo' => 'Imputados en prisión preventiva con más de 3 años de detención sin juicio finalizado.',
        'filtro'    => 'Estado AA: activo · Estado imputado: Preso · Detención > 1.095 días (3 años)',
        'cols'      => $colsPP,
    ],
    'pp_2y6m' => [
        'titulo'    => 'Preventivas Prolongadas — 2½ a 3 años',
        'subtitulo' => 'Imputados en prisión preventiva con entre 2 años y medio y 3 años de detención.',
        'filtro'    => 'Estado AA: activo · Estado imputado: Preso · Detención 912–1.095 días',
        'cols'      => $colsPP,
    ],
    'pp_2y' => [
        'titulo'    => 'Preventivas Prolongadas — 2 a 2½ años',
        'subtitulo' => 'Imputados en prisión preventiva con entre 2 y 2 años y medio de detención.',
        'filtro'    => 'Estado AA: activo · Estado imputado: Preso · Detención 730–912 días',
        'cols'      => $colsPP,
    ],
    'debates_curso' => [
        'titulo'    => 'Debates en Curso — ' . date('d/m/Y'),
        'subtitulo' => 'Juicios orales activos a la fecha de emisión del informe.',
        'filtro'    => 'Agendamientos no cancelados · ' . date('d/m/Y') . ' entre debate_desde y fecha_fin_bloqueo',
        'cols'      => [
            'cuij_principal' => 'CUIJ',
            'imputados'      => 'Imputados',
            'delitos'        => 'Delitos',
            'debate_desde'   => 'Inicio',
            'debate_hasta'   => 'Fin debate',
            'etapa'          => 'Etapa',
            'tribunal'       => 'Tribunal',
            'partes'         => 'Fiscal / Defensor',
        ],
    ],
    'debates_mes' => [
        'titulo'    => 'Agenda de Juicios — ' . $mesLabel,
        'subtitulo' => 'Juicios orales programados para el período indicado.',
        'filtro'    => 'Mes: ' . $mesLabel . ' · Agendamientos no cancelados',
        'cols'      => [
            'cuij_principal' => 'CUIJ',
            'imputados'      => 'Imputados',
            'delitos'        => 'Delitos',
            'debate_desde'   => 'Inicio',
            'debate_hasta'   => 'Fin',
            'turno'          => 'Turno',
            'tribunal'       => 'Tribunal',
            'partes'         => 'Fiscal / Defensor',
        ],
    ],
];

// ── Etiquetas para categorías aud_dia ────────────────────────────────────────
$audCatLabels = [
    'total'       => 'Todas las audiencias',
    'debates'     => 'Debates',
    'preliminar'  => 'Preliminares',
    'cierre'      => 'Cierre de proceso',
    'cautelar'    => 'Revisión de Cautelar',
    'ppp'         => 'Prórroga Prisión Preventiva',
    'imputativas' => 'Imputativas',
    'ejecucion'   => 'Ejecución de pena',
    'menores'     => 'Menores',
    'otras'       => 'Otras audiencias',
];
$audCatLabel  = $audCatLabels[$audCat] ?? $audCat;
$audTurnoLabel = $audTurno === 'M' ? ' — Turno Mañana' : ($audTurno === 'V' ? ' — Turno Vespertino' : '');
$audFechaLabel = date('d/m/Y', strtotime($audFecha));

// IDs de ejecución (dinámico desde etapa)
$idsEjecucionInf = [];
try {
    $idsEjecucionInf = $pdo->query(
        "SELECT id FROM mrbs_tipo_audiencia WHERE etapa = 'Ejecuci\u{00F3}n'"
    )->fetchAll(PDO::FETCH_COLUMN);
} catch (PDOException $e) { /* silencio */ }

// Filters SQL para aud_dia
$audCatIds = [
    'debates'     => ['IP29','IP30','IP34','IP63','IP64','IP65','IP77'],
    'preliminar'  => ['IP22','IP23'],
    'cierre'      => ['IP31','IP08','IP28','IP21'],
    'cautelar'    => ['IP04'],
    'ppp'         => ['IP05','IP06'],
    'imputativas' => ['IP02','IP03','IP19','IP20'],
    'ejecucion'   => $idsEjecucionInf,
];
$audKnownIds = array_merge(...array_values($audCatIds));

$reportes['aud_dia'] = [
    'titulo'    => 'Audiencias del ' . $audFechaLabel . ' — ' . $audCatLabel . $audTurnoLabel,
    'subtitulo' => ($audSoloCan ? 'Sólo canceladas · ' : '') . 'Audiencias agendadas para la fecha indicada.',
    'filtro'    => 'Fecha: ' . $audFechaLabel . ' · Categoría: ' . $audCatLabel . $audTurnoLabel
                . ($audSoloCan ? ' · Solo canceladas' : ''),
    'cols'      => [
        'hora'        => 'Desde',
        'hora_hasta'  => 'Hasta',
        'sala'        => 'Sala',
        'tipo'        => 'Tipo de audiencia',
        'causa'       => 'Causa / NRO',
        'juez'        => 'Juez',
        'partes'      => 'Fiscal / Defensor',
        'estado'      => 'Estado',
    ],
];

if (!isset($reportes[$tipo])) {
    http_response_code(400);
    die('<h2>Tipo de reporte desconocido: ' . htmlspecialchars($tipo) . '</h2>');
}
$cfg = $reportes[$tipo];

// ── Ejecutar query ────────────────────────────────────────────────────────────
$rows    = [];
$totales = [];
$errQuery = null;

try {
    $condPP = "
        WHERE aa.deleted_at IS NULL
          AND aa.estado NOT IN ('Cancelado','Realizado','Abreviado')
          AND aa.estado_imputado = 'Preso'
          AND aa.fecha_detencion IS NOT NULL
          AND NOT EXISTS (
              SELECT 1 FROM agj_agendamientos agx
              WHERE agx.aa_id = aa.id AND agx.estado = 'Realizado' AND agx.deleted_at IS NULL
          )
          AND NOT EXISTS (
              SELECT 1 FROM agj_agendamientos agy
              WHERE agy.aa_id = aa.id AND agy.estado NOT IN ('Cancelado')
                AND agy.deleted_at IS NULL
                AND CURDATE() BETWEEN agy.debate_desde AND agy.fecha_fin_bloqueo
          )
    ";

    switch ($tipo) {
        case 'pp_3y':
        case 'pp_2y6m':
        case 'pp_2y':
            $condDias = match($tipo) {
                'pp_3y'   => 'AND DATEDIFF(CURDATE(), aa.fecha_detencion) > 1095',
                'pp_2y6m' => 'AND DATEDIFF(CURDATE(), aa.fecha_detencion) BETWEEN 913 AND 1095',
                'pp_2y'   => 'AND DATEDIFF(CURDATE(), aa.fecha_detencion) BETWEEN 730 AND 912',
            };
            $rows = $pdo->query("
                SELECT aa.id, aa.cuij_principal, aa.imputados, aa.delitos,
                    aa.fecha_detencion,
                    DATEDIFF(CURDATE(), aa.fecha_detencion) AS dias_det,
                    aa.vencimiento_pp_actual, aa.fecha_auto_apertura,
                    aa.prioridad_agregada, aa.estado_imputado,
                    aa.medidas_juzgado_familia,
                    aa.fecha_prescripcion_menor, aa.fecha_prescripcion_mayor
                FROM agj_autos_apertura aa
                $condPP $condDias
                ORDER BY dias_det DESC
            ")->fetchAll();
            foreach ($rows as &$r) {
                $r['prioridad'] = calcular_prioridad($r);
                $r['tiempo_pp'] = diasATiempoPP((int)($r['dias_det'] ?? 0));
            }
            unset($r);
            usort($rows, fn($a, $b) => ($b['prioridad'] ?? 0) <=> ($a['prioridad'] ?? 0));
            $totales = [
                'Total registros'        => count($rows),
                'Días promedio detenido' => $rows
                    ? (int)round(array_sum(array_column($rows, 'dias_det')) / count($rows))
                    : 0,
            ];
            break;

        case 'debates_curso':
            $rows = $pdo->query("
                SELECT ag.id, aa.id AS aa_id, aa.cuij_principal, aa.imputados, aa.delitos,
                    ag.debate_desde, ag.debate_hasta, ag.fecha_fallo, ag.fecha_fin_bloqueo,
                    ag.condicion,
                    CONCAT_WS(' / ',
                        NULLIF(jPte.nombre,''), NULLIF(jV1.nombre,''), NULLIF(jV2.nombre,'')
                    ) AS tribunal
                FROM agj_agendamientos ag
                JOIN agj_autos_apertura aa ON ag.aa_id = aa.id
                LEFT JOIN mrbs_juez jPte ON ag.presidente_id = jPte.juez_id
                LEFT JOIN mrbs_juez jV1  ON ag.vocal_1_id    = jV1.juez_id
                LEFT JOIN mrbs_juez jV2  ON ag.vocal_2_id    = jV2.juez_id
                WHERE ag.deleted_at IS NULL
                  AND ag.estado NOT IN ('Cancelado')
                  AND CURDATE() BETWEEN ag.debate_desde AND ag.fecha_fin_bloqueo
                ORDER BY ag.debate_desde
            ")->fetchAll();
            foreach ($rows as &$r) {
                $r['etapa'] = etapaDebate(
                    $r['debate_desde'], $r['debate_hasta'],
                    $r['fecha_fallo'],  $r['fecha_fin_bloqueo']
                );
                $r['partes'] = '';
            }
            unset($r);
            if (!empty($rows)) {
                $aaIds = array_unique(array_column($rows, 'aa_id'));
                $ph = implode(',', array_fill(0, count($aaIds), '?'));
                $litRows = $pdo->prepare("
                    SELECT al.aa_id, al.rol_en_causa, vl.nombre
                    FROM agj_aa_litigantes al
                    JOIN v_litigantes vl ON al.litigante_id=vl.litigante_id
                    WHERE al.aa_id IN ($ph)
                    ORDER BY al.aa_id, al.rol_en_causa DESC, al.orden
                ");
                $litRows->execute(array_values($aaIds));
                $litMap = [];
                foreach ($litRows->fetchAll() as $lr) {
                    $litMap[$lr['aa_id']][$lr['rol_en_causa']][] = $lr['nombre'];
                }
                foreach ($rows as &$r) {
                    $parts = [];
                    if (!empty($litMap[$r['aa_id']]['Fiscal']))     $parts[] = implode(', ', $litMap[$r['aa_id']]['Fiscal']);
                    if (!empty($litMap[$r['aa_id']]['Querellante'])) $parts[] = 'Q: '.implode(', ', $litMap[$r['aa_id']]['Querellante']);
                    if (!empty($litMap[$r['aa_id']]['Defensor']))   $parts[] = implode(', ', $litMap[$r['aa_id']]['Defensor']);
                    $r['partes'] = implode("\n", $parts);
                }
                unset($r);
            }
            $totales = ['Debates activos' => count($rows)];
            break;

        case 'debates_mes':
            $stmt = $pdo->prepare("
                SELECT ag.id, aa.id AS aa_id, aa.cuij_principal, aa.imputados, aa.delitos,
                    ag.debate_desde, ag.debate_hasta, ag.turno,
                    CONCAT_WS(' / ',
                        NULLIF(jPte.nombre,''), NULLIF(jV1.nombre,''), NULLIF(jV2.nombre,'')
                    ) AS tribunal,
                    ag.condicion
                FROM agj_agendamientos ag
                JOIN agj_autos_apertura aa ON ag.aa_id = aa.id
                LEFT JOIN mrbs_juez jPte ON ag.presidente_id = jPte.juez_id
                LEFT JOIN mrbs_juez jV1  ON ag.vocal_1_id    = jV1.juez_id
                LEFT JOIN mrbs_juez jV2  ON ag.vocal_2_id    = jV2.juez_id
                WHERE ag.deleted_at IS NULL
                  AND ag.estado NOT IN ('Cancelado')
                  AND DATE_FORMAT(ag.debate_desde, '%Y-%m') = ?
                ORDER BY ag.debate_desde
            ");
            $stmt->execute([$mes]);
            $rows = $stmt->fetchAll();
            foreach ($rows as &$r) $r['partes'] = '';
            unset($r);
            if (!empty($rows)) {
                $aaIds = array_unique(array_column($rows, 'aa_id'));
                $ph = implode(',', array_fill(0, count($aaIds), '?'));
                $litRows = $pdo->prepare("
                    SELECT al.aa_id, al.rol_en_causa, vl.nombre
                    FROM agj_aa_litigantes al
                    JOIN v_litigantes vl ON al.litigante_id=vl.litigante_id
                    WHERE al.aa_id IN ($ph)
                    ORDER BY al.aa_id, al.rol_en_causa DESC, al.orden
                ");
                $litRows->execute(array_values($aaIds));
                $litMap = [];
                foreach ($litRows->fetchAll() as $lr) {
                    $litMap[$lr['aa_id']][$lr['rol_en_causa']][] = $lr['nombre'];
                }
                foreach ($rows as &$r) {
                    $parts = [];
                    if (!empty($litMap[$r['aa_id']]['Fiscal']))      $parts[] = implode(', ', $litMap[$r['aa_id']]['Fiscal']);
                    if (!empty($litMap[$r['aa_id']]['Querellante']))  $parts[] = 'Q: '.implode(', ', $litMap[$r['aa_id']]['Querellante']);
                    if (!empty($litMap[$r['aa_id']]['Defensor']))    $parts[] = implode(', ', $litMap[$r['aa_id']]['Defensor']);
                    $r['partes'] = implode("\n", $parts);
                }
                unset($r);
            }
            $totales = ['Total debates' => count($rows)];
            break;

        case 'aud_dia':
            $ts0 = strtotime($audFecha . ' 00:00:00');
            $ts1 = strtotime($audFecha . ' 23:59:59');

            // Filtro de turno horario
            $condTurno = '';
            if ($audTurno === 'M') {
                $condTurno = "AND TIME(FROM_UNIXTIME(e.start_time)) < '14:00:00'";
            } elseif ($audTurno === 'V') {
                $condTurno = "AND TIME(FROM_UNIXTIME(e.start_time)) >= '14:00:00'";
            }

            // Filtro de categoría
            $condCat = '';
            if ($audCat === 'menores') {
                $condCat = "AND e.tipoAudiencia_id LIKE 'IM%'";
            } elseif ($audCat === 'otras') {
                $placeholders = implode(',', array_fill(0, count($audKnownIds), '?'));
                $condCat = "AND (e.tipoAudiencia_id NOT IN ($placeholders) OR e.tipoAudiencia_id IS NULL)"
                         . " AND e.tipoAudiencia_id NOT LIKE 'IM%'";
            } elseif (isset($audCatIds[$audCat])) {
                $ids = $audCatIds[$audCat];
                $placeholders = implode(',', array_fill(0, count($ids), '?'));
                $condCat = "AND e.tipoAudiencia_id IN ($placeholders)";
            }

            // Filtro canceladas
            $condCan = $audSoloCan ? "AND e.estado = 'Cancelada'" : '';

            $sql = "
                SELECT
                    TIME_FORMAT(FROM_UNIXTIME(e.start_time), '%H:%i') AS hora,
                    TIME_FORMAT(FROM_UNIXTIME(e.end_time),   '%H:%i') AS hora_hasta,
                    COALESCE(r.room_name, '—')                         AS sala,
                    COALESCE(NULLIF(e.tipoAudiencia,''), t.tipoAudiencia, '—') AS tipo,
                    COALESCE(e.name, '—')                              AS causa,
                    COALESCE(j.nombre, '—')                            AS juez,
                    NULLIF(CONCAT_WS('\n',
                        NULLIF(TRIM(CONCAT_WS(', ', f1.nombre, f2.nombre)), ''),
                        NULLIF(TRIM(CONCAT_WS(', ', d1.nombre, d2.nombre, d3.nombre, d4.nombre)), '')
                    ), '')                                             AS partes,
                    COALESCE(e.estado, '—')                            AS estado
                FROM mrbs_entry e
                LEFT JOIN mrbs_room           r  ON e.room_id         = r.id
                LEFT JOIN mrbs_tipo_audiencia t  ON e.tipoAudiencia_id = t.id
                LEFT JOIN mrbs_juez           j  ON e.juez_id          = j.juez_id
                LEFT JOIN mrbs_fiscal         f1 ON e.fiscal_id        = f1.fiscal_id
                LEFT JOIN mrbs_fiscal         f2 ON e.fiscal2_id       = f2.fiscal_id
                LEFT JOIN mrbs_defensor       d1 ON e.defensor_id      = d1.defensor_id
                LEFT JOIN mrbs_defensor       d2 ON e.defensor2_id     = d2.defensor_id
                LEFT JOIN mrbs_defensor       d3 ON e.defensor3_id     = d3.defensor_id
                LEFT JOIN mrbs_defensor       d4 ON e.defensor4_id     = d4.defensor_id
                WHERE e.start_time BETWEEN ? AND ?
                  AND (e.estado IS NULL OR e.estado NOT IN ('No es Audiencia','Duplicada'))
                  AND e.noContarEstaAudiencia = 0
                  $condTurno $condCat $condCan
                ORDER BY e.start_time, r.room_name
            ";

            // Construir parámetros
            $params = [$ts0, $ts1];
            if ($audCat === 'otras') {
                $params = array_merge($params, $audKnownIds);
            } elseif (isset($audCatIds[$audCat])) {
                $params = array_merge($params, $audCatIds[$audCat]);
            }

            $stmt = $pdo->prepare($sql);
            $stmt->execute($params);
            $rows    = $stmt->fetchAll();
            $activas = count(array_filter($rows, fn($r) => $r['estado'] !== 'Cancelada'));
            $cancs   = count($rows) - $activas;
            $totales = [
                'Total'      => count($rows),
                'Activas'    => $activas,
                'Canceladas' => $cancs,
            ];
            break;
    }
} catch (PDOException $e) {
    $errQuery = $e->getMessage();
}

// ── Obtener email del usuario logueado ────────────────────────────────────────
function getUserEmail(PDO $pdo, string $usuario): string
{
    try {
        $s = $pdo->prepare("SELECT email FROM mrbs_users WHERE name = ? LIMIT 1");
        $s->execute([$usuario]);
        return (string)($s->fetchColumn() ?: '');
    } catch (PDOException $e) {
        return '';
    }
}

// ── Renderizar celda ──────────────────────────────────────────────────────────
function renderCelda(string $campo, $valor, bool $isHtml = true, array $row = []): string
{
    if ($valor === null || $valor === '') return $isHtml ? '<td>—</td>' : '—';

    // Prioridad → valor + link a verAuto.php (solo HTML)
    if ($campo === 'prioridad' && $isHtml && !empty($row['id'])) {
        $url = BASE_URL . '/public/autos/verAuto.php?id=' . (int)$row['id'];
        return '<td style="text-align:right;white-space:nowrap">'
            . '<a href="' . $url . '" target="_blank"'
            . ' title="Detalle de AA y agendamiento actual"'
            . ' style="display:inline-block;padding:2px 8px;background:#e0e7ff;color:#3730a3;'
            .         'border-radius:4px;font-weight:700;text-decoration:none;font-size:12px">'
            . htmlspecialchars((string)$valor)
            . '</a></td>';
    }

    // Tiempo en PP → 3 líneas (años / meses / días)
    if ($campo === 'tiempo_pp') {
        $partes = explode("\n", (string)$valor);
        if (!$isHtml) return implode(' · ', $partes);
        $inner = implode('<br>', array_map('htmlspecialchars', $partes));
        return '<td style="white-space:nowrap;text-align:center;line-height:1.7;font-size:11px">' . $inner . '</td>';
    }

    if (esCampoFecha($campo)) {
        $fmt = is_string($valor) && preg_match('/^\d{4}-\d{2}-\d{2}/', $valor)
            ? date('d/m/Y', strtotime($valor)) : htmlspecialchars((string)$valor);
        return $isHtml ? "<td style=\"white-space:nowrap\">$fmt</td>" : $fmt;
    }

    $esc = htmlspecialchars((string)$valor);
    if (!$isHtml) return (string)$valor;

    if ($campo === 'partes') {
        $lines = array_filter(array_map('trim', explode("\n", (string)$valor)));
        if (!$lines) return $isHtml ? '<td style="color:#94a3b8">—</td>' : '—';
        if (!$isHtml) return implode(' | ', $lines);
        $inner = implode('<br>', array_map('htmlspecialchars', $lines));
        return "<td style=\"white-space:normal;min-width:130px;font-size:11px;line-height:1.5\">$inner</td>";
    }
    if ($campo === 'cuij_principal') {
        return "<td style=\"white-space:nowrap\">$esc</td>";
    }
    $style = in_array($campo, ['imputados','delitos','tribunal'], true)
        ? ' style="white-space:normal;word-break:break-word;min-width:120px"'
        : '';
    return "<td$style>$esc</td>";
}

// ── Generar HTML del informe (reutilizable para PDF y mail) ───────────────────
function renderInformeHTML(
    array $cfg, array $rows, array $totales,
    string $tipo, string $mes, bool $soloResumen, bool $forEmail = false
): string {
    $cols = $cfg['cols'];
    $now  = date('d/m/Y H:i');
    $borderColor = '#d1d5db';
    $hdrBg       = '#374151';
    $evenBg      = '#f9fafb';
    $summaryBg   = '#f0f4ff';

    ob_start(); ?>
<table style="width:100%;border-collapse:collapse;font-family:Arial,sans-serif;font-size:12px">
  <thead>
    <tr style="background:<?=$hdrBg?>;color:#fff">
      <?php foreach ($cols as $campo => $label): ?>
      <th style="padding:8px 10px;text-align:left;border:1px solid <?=$borderColor?>;white-space:nowrap">
        <?=htmlspecialchars($label)?>
      </th>
      <?php endforeach; ?>
    </tr>
  </thead>
  <tbody>
    <?php if (empty($rows)): ?>
    <tr><td colspan="<?=count($cols)?>" style="padding:12px;text-align:center;color:#6b7280;border:1px solid <?=$borderColor?>">
      Sin registros para los filtros seleccionados.
    </td></tr>
    <?php else: ?>
    <?php foreach ($rows as $i => $r): ?>
    <tr style="background:<?= $i % 2 === 0 ? '#fff' : $evenBg ?>">
      <?php foreach ($cols as $campo => $label): echo renderCelda($campo, $r[$campo] ?? null, true, $r); endforeach; ?>
    </tr>
    <?php endforeach; ?>
    <?php endif; ?>
  </tbody>
</table>
<?php if (!empty($totales)): ?>
<table style="width:auto;border-collapse:collapse;font-family:Arial,sans-serif;font-size:12px;margin-top:12px">
  <thead>
    <tr style="background:<?=$summaryBg?>;font-weight:bold">
      <?php foreach ($totales as $lbl => $val): ?>
      <th style="padding:7px 14px;border:1px solid <?=$borderColor?>;text-align:left;color:#1e3a8a">
        <?=htmlspecialchars($lbl)?>
      </th>
      <?php endforeach; ?>
    </tr>
  </thead>
  <tbody>
    <tr>
      <?php foreach ($totales as $lbl => $val): ?>
      <td style="padding:7px 14px;border:1px solid <?=$borderColor?>;font-size:14px;font-weight:700;color:#1e40af">
        <?=htmlspecialchars((string)$val)?>
      </td>
      <?php endforeach; ?>
    </tr>
  </tbody>
</table>
<?php endif; ?>
    <?php
    return ob_get_clean();
}

// ── Construir HTML para PDF (compartido por descarga y email) ─────────────────
function buildPDFHtml(array $cfg, array $rows, array $totales, string $tipo, string $mes, bool $soloRes): string
{
    $tableHtml = renderInformeHTML($cfg, $soloRes ? [] : $rows, $totales, $tipo, $mes, $soloRes);
    return '<!DOCTYPE html><html><head><meta charset="UTF-8">
    <style>
        body  { font-family: Arial, sans-serif; font-size: 10px; color: #1e293b; margin: 18px; }
        h1    { font-size: 15px; color: #1e3a8a; margin-bottom: 4px; }
        .sub  { font-size: 10px; color: #475569; margin-bottom: 4px; }
        .meta { font-size: 9px; color: #64748b; border-top: 1px solid #e2e8f0;
                padding-top: 5px; margin-bottom: 12px; }
    </style></head><body>
    <div style="border-bottom:3px solid #1e3a8a;padding-bottom:8px;margin-bottom:12px">
      <div style="font-size:9px;color:#64748b;margin-bottom:3px">OGJ Rosario · Oficina de Gestión Judicial</div>
      <h1>' . htmlspecialchars($cfg['titulo']) . '</h1>
      <div class="sub">' . htmlspecialchars($cfg['subtitulo']) . '</div>
    </div>
    <div class="meta">Filtros: ' . htmlspecialchars($cfg['filtro'])
        . ' &nbsp;|&nbsp; Emitido: ' . date('d/m/Y H:i')
        . ($soloRes ? ' &nbsp;|&nbsp; <em>Solo resumen</em>' : '') . '</div>
    ' . $tableHtml . '
    </body></html>';
}

function renderDompdfString(string $html): string
{
    $dompdf = new \Dompdf\Dompdf(['defaultPaperSize' => 'A4', 'defaultPaperOrientation' => 'landscape']);
    $dompdf->loadHtml($html, 'UTF-8');
    $dompdf->render();
    return $dompdf->output();
}

// ── Exportar CSV ─────────────────────────────────────────────────────────────
if ($formato === 'csv') {
    $filename = 'informe_' . $tipo . '_' . date('Ymd_His') . '.csv';
    header('Content-Type: text/csv; charset=UTF-8');
    header('Content-Disposition: attachment; filename="' . $filename . '"');
    $out = fopen('php://output', 'w');
    fprintf($out, "\xEF\xBB\xBF");   // BOM UTF-8
    fputcsv($out, ['Informe: ' . $cfg['titulo']]);
    fputcsv($out, ['Filtros: ' . $cfg['filtro']]);
    fputcsv($out, ['Emitido: ' . date('d/m/Y H:i')]);
    fputcsv($out, []);
    fputcsv($out, array_values($cfg['cols']));
    foreach ($rows as $r) {
        $line = [];
        foreach (array_keys($cfg['cols']) as $campo) {
            $v = $r[$campo] ?? '';
            if ($campo === 'tiempo_pp') {
                $v = implode(' · ', explode("\n", (string)$v));
            } elseif (esCampoFecha($campo) && is_string($v) && preg_match('/^\d{4}-\d{2}-\d{2}/', $v)) {
                $v = date('d/m/Y', strtotime($v));
            }
            $line[] = $v;
        }
        fputcsv($out, $line);
    }
    fputcsv($out, []);
    fputcsv($out, ['Resumen']);
    foreach ($totales as $lbl => $val) {
        fputcsv($out, [$lbl, $val]);
    }
    fclose($out);
    exit;
}

// ── Exportar PDF ──────────────────────────────────────────────────────────────
if ($formato === 'pdf') {
    $dompdfPath = __DIR__ . '/../../../web/lib/dompdf/vendor/autoload.php';
    if (!file_exists($dompdfPath)) {
        die('dompdf no encontrado en: ' . $dompdfPath);
    }
    require_once $dompdfPath;
    $pdfContent = renderDompdfString(buildPDFHtml($cfg, $rows, $totales, $tipo, $mes, false));
    header('Content-Type: application/pdf');
    header('Content-Disposition: attachment; filename="informe_' . $tipo . '_' . date('Ymd') . '.pdf"');
    echo $pdfContent;
    exit;
}

// ── Enviar por email ──────────────────────────────────────────────────────────
$mailStatus = null;
if ($formato === 'mail' || isset($_POST['enviar_mail'])) {
    $userEmail = getUserEmail($pdo, $_SESSION['usuario'] ?? '');
    if (!$userEmail) {
        $mailStatus = ['ok' => false, 'msg' => 'No se encontró el email del usuario logueado.'];
    } else {
        $dompdfPath = __DIR__ . '/../../../web/lib/dompdf/vendor/autoload.php';
        require_once $dompdfPath;
        $phpmailerPath = __DIR__ . '/../../../web/lib/PHPMailer/src/PHPMailer.php';
        require_once $phpmailerPath;
        require_once __DIR__ . '/../../../web/lib/PHPMailer/src/SMTP.php';
        require_once __DIR__ . '/../../../web/lib/PHPMailer/src/Exception.php';

        $pdfContent  = renderDompdfString(buildPDFHtml($cfg, $rows, $totales, $tipo, $mes, $soloRes));
        $pdfFilename = 'informe_' . $tipo . '_' . date('Ymd') . ($soloRes ? '_resumen' : '') . '.pdf';

        $asunto = 'Informe OGJ Rosario: ' . $cfg['titulo'] . ' — ' . date('d/m/Y');
        $cuerpo = '<body style="font-family:Arial,sans-serif;font-size:14px;color:#1e293b;line-height:1.6;margin:24px">'
            . '<p>Se adjunta el informe solicitado:</p>'
            . '<p style="font-weight:700;color:#1e3a8a">' . htmlspecialchars($cfg['titulo']) . '</p>'
            . '<p style="color:#475569;font-size:13px">' . htmlspecialchars($cfg['subtitulo']) . '</p>'
            . '<p style="font-size:12px;color:#64748b;margin-top:16px">'
            .   'Filtros: ' . htmlspecialchars($cfg['filtro']) . '<br>'
            .   'Emitido: ' . date('d/m/Y H:i')
            .   ($soloRes ? '<br><em>Versión: solo resumen</em>' : '')
            . '</p>'
            . '<hr style="border:none;border-top:1px solid #e2e8f0;margin:20px 0">'
            . '<p style="font-size:11px;color:#94a3b8">OGJ Rosario · Oficina de Gestión Judicial</p>'
            . '</body>';

        try {
            $mail = new PHPMailer\PHPMailer\PHPMailer(true);
            $mail->isSMTP();
            $mail->Host        = 'ogjrosario.com.ar';
            $mail->SMTPAuth    = true;
            $mail->Username    = 'administrador@ogjrosario.com.ar';
            $mail->Password    = 'aLu6S6LStvnYysX';
            $mail->SMTPSecure  = 'ssl';
            $mail->Port        = 465;
            $mail->SMTPOptions = [
                'ssl' => ['verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true],
            ];
            $mail->CharSet = 'UTF-8';
            $mail->setFrom('administrador@ogjrosario.com.ar', 'Agenda Juicios OGJ');
            $mail->addAddress($userEmail);
            $mail->isHTML(true);
            $mail->Subject = $asunto;
            $mail->Body    = $cuerpo;
            $mail->AltBody = 'Se adjunta el informe: ' . $cfg['titulo'] . '. Emitido: ' . date('d/m/Y H:i') . '.';
            $mail->addStringAttachment($pdfContent, $pdfFilename, 'base64', 'application/pdf');
            $mail->send();
            $mailStatus = ['ok' => true, 'msg' => 'Informe enviado a ' . htmlspecialchars($userEmail) . ' (adjunto PDF).'];
        } catch (\Exception $e) {
            $mailStatus = ['ok' => false, 'msg' => 'Error al enviar: ' . htmlspecialchars($e->getMessage())];
        }
    }
}

// ── Render HTML ───────────────────────────────────────────────────────────────
$tableHtml = renderInformeHTML($cfg, $rows, $totales, $tipo, $mes, false);
$qActual   = http_build_query(array_merge($_GET, ['formato' => '']));
?><!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title><?=htmlspecialchars($cfg['titulo'])?> — OGJ Rosario</title>
<style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
body{font-family:Arial,sans-serif;background:#f0f2f5;color:#1e293b;font-size:14px;padding:24px}
.rpt{max-width:1200px;margin:0 auto;background:#fff;border:1px solid #e2e8f0;border-radius:10px;
     padding:28px 32px;box-shadow:0 2px 12px rgba(0,0,0,.08)}
.rpt-hdr{border-bottom:3px solid #1e3a8a;padding-bottom:14px;margin-bottom:18px}
.rpt-org{font-size:11px;color:#64748b;margin-bottom:6px;text-transform:uppercase;letter-spacing:.06em}
.rpt-titulo{font-size:22px;font-weight:700;color:#1e3a8a;margin-bottom:4px}
.rpt-sub{font-size:13px;color:#475569}
.rpt-meta{display:flex;gap:20px;flex-wrap:wrap;font-size:12px;color:#64748b;margin:12px 0 18px;
          padding:10px 14px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px}
.rpt-meta span{display:flex;align-items:center;gap:5px}
.rpt-meta strong{color:#374151}
.export-bar{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:16px;align-items:center}
.btn{display:inline-block;padding:6px 14px;border:none;border-radius:5px;cursor:pointer;
     font-size:12px;font-weight:600;text-decoration:none;white-space:nowrap}
.btn-p{background:#2563eb;color:#fff}.btn-g{background:#64748b;color:#fff}
.btn-r{background:#dc2626;color:#fff}.btn-s{background:#16a34a;color:#fff}
.btn-w{background:#d97706;color:#fff}
.btn:hover{opacity:.85}
.msg{padding:10px 16px;border-radius:6px;font-size:13px;margin-bottom:14px}
.msg-ok{background:#d1fae5;color:#065f46;border:1px solid #6ee7b7}
.msg-err{background:#fee2e2;color:#991b1b;border:1px solid #fca5a5}
table{width:100%;border-collapse:collapse;font-size:13px}
th{background:#374151;color:#fff;padding:9px 11px;text-align:left;
   border:1px solid #d1d5db;font-size:11px;text-transform:uppercase;letter-spacing:.04em;white-space:nowrap}
td{border:1px solid #d1d5db;padding:8px 10px;vertical-align:top}
tr:nth-child(even) td{background:#f9fafb}
tr:hover td{background:#dbeafe}
.resumen-tabla{width:auto;margin-top:16px}
.resumen-tabla th{background:#e0e7ff;color:#1e3a8a;font-size:12px}
.resumen-tabla td{font-size:16px;font-weight:700;color:#1e40af;background:#f0f4ff}
.tw{overflow-x:auto}
@media print{
  body{background:#fff;padding:0}
  .export-bar,.no-print{display:none!important}
  .rpt{border:none;box-shadow:none;padding:0}
}
</style>
</head>
<body>
<div class="rpt">

  <div class="rpt-hdr">
    <div class="rpt-org">OGJ Rosario · Oficina de Gestión Judicial</div>
    <div class="rpt-titulo"><?=htmlspecialchars($cfg['titulo'])?></div>
    <div class="rpt-sub"><?=htmlspecialchars($cfg['subtitulo'])?></div>
  </div>

  <div class="rpt-meta">
    <span><strong>Filtros:</strong> <?=htmlspecialchars($cfg['filtro'])?></span>
    <span><strong>Emitido:</strong> <?=date('d/m/Y H:i')?></span>
    <span><strong>Usuario:</strong> <?=htmlspecialchars($_SESSION['usuario'] ?? '—')?></span>
  </div>

  <?php if ($mailStatus): ?>
  <div class="msg <?=$mailStatus['ok']?'msg-ok':'msg-err'?>"><?=$mailStatus['msg']?></div>
  <?php endif; ?>

  <?php if ($errQuery): ?>
  <div class="msg msg-err">Error en la consulta: <?=htmlspecialchars($errQuery)?></div>
  <?php endif; ?>

  <div class="export-bar no-print">
    <a href="?<?=http_build_query(array_merge($_GET,['formato'=>'csv']))?>" class="btn btn-s">
      ⬇ Descargar CSV
    </a>
    <a href="?<?=http_build_query(array_merge($_GET,['formato'=>'pdf']))?>" class="btn btn-r">
      📄 Descargar PDF
    </a>

    <form method="post" action="?<?=http_build_query($_GET)?>" style="display:contents">
      <input type="hidden" name="enviar_mail" value="1">
      <button type="submit" class="btn btn-p">📧 Enviar por email (completo)</button>
    </form>
    <form method="post" action="?<?=http_build_query(array_merge($_GET,['solo_resumen'=>'1']))?>" style="display:contents">
      <input type="hidden" name="enviar_mail" value="1">
      <button type="submit" class="btn btn-g">📧 Enviar resumen</button>
    </form>

    <button onclick="window.print()" class="btn btn-w">🖨 Imprimir</button>
    <button onclick="window.close()" class="btn btn-g">✕ Cerrar</button>
  </div>

  <div class="tw">
    <?= $tableHtml ?>
  </div>

</div>
</body>
</html>
