<?php
declare(strict_types=1);
session_start();
require __DIR__ . '/config/auth.php';
require dirname(__DIR__, 3) . '/config/db2.php';
require __DIR__ . '/lib/helpers.php';

$paginaActual = 'inicio';
require __DIR__ . '/config/menu.php';

// ── Fecha seleccionada ────────────────────────────────────────────────────────
$fecha = preg_match('/^\d{4}-\d{2}-\d{2}$/', $_GET['fecha'] ?? '')
    ? $_GET['fecha'] : date('Y-m-d');
$fechaLabel = date('d/m/Y', strtotime($fecha));
$esHoy = ($fecha === date('Y-m-d'));

// ── Pre-cargar IDs de ejecucion por etapa ────────────────────────────────────
$idsEjecucion = [];
try {
    $idsEjecucion = $pdo->query(
        "SELECT id FROM mrbs_tipo_audiencia WHERE etapa = 'Ejecución'"
    )->fetchAll(PDO::FETCH_COLUMN);
} catch (PDOException $e) { /* silencio */ }

// ── Categorías de audiencias ──────────────────────────────────────────────────
$CATS = [
    'total' => [
        'label'   => 'Audiencias del día',
        'tooltip' => 'Todas las audiencias agendadas (excluye franquicias y no-audiencias)',
        'color'   => '#1e40af',
        'icon'    => '🏛',
    ],
    'debates' => [
        'label'   => 'Debates',
        'tooltip' => 'Juicio Debate (IP29), Juicio Flagrancia (IP30), Juicio Debate Querella (IP34), Fundamentos (IP63), Deliberación (IP64), Veredicto (IP65), de visu (IP77)',
        'color'   => '#7c3aed',
        'icon'    => '⚖️',
        'ids'     => ['IP29','IP30','IP34','IP63','IP64','IP65','IP77'],
    ],
    'preliminar' => [
        'label'   => 'Preliminares',
        'tooltip' => 'Audiencia Preliminar (IP22) y Preliminar Continuación (IP23)',
        'color'   => '#0891b2',
        'icon'    => '📋',
        'ids'     => ['IP22','IP23'],
    ],
    'cierre' => [
        'label'   => 'Cierre de proceso',
        'tooltip' => 'Juicio Abreviado (IP31), Suspensión Juicio a Prueba (IP08), Sobreseimiento (IP28), Archivo Jurisdiccional (IP21)',
        'color'   => '#16a34a',
        'icon'    => '✅',
        'ids'     => ['IP31','IP08','IP28','IP21'],
    ],
    'cautelar' => [
        'label'   => 'Revisión de Cautelar',
        'tooltip' => 'Revisión Medida Cautelar (IP04)',
        'color'   => '#d97706',
        'icon'    => '🔒',
        'ids'     => ['IP04'],
    ],
    'ppp' => [
        'label'   => 'Prórroga Prisión Preventiva',
        'tooltip' => 'Prórroga Prisión Preventiva (IP06) y suplencia (IP05)',
        'color'   => '#dc2626',
        'icon'    => '⏱',
        'ids'     => ['IP05','IP06'],
    ],
    'imputativas' => [
        'label'      => 'Imputativas',
        'tooltip'    => 'Imputativa con Detenido (IP02), por Flagrancia (IP03), Sin Detenido (IP19), Nueva Imputativa (IP20)',
        'color'      => '#0f766e',
        'icon'       => '📁',
        'ids'        => ['IP02','IP03','IP19','IP20'],
        'always_show'=> true,
    ],
    'ejecucion' => [
        'label'      => 'Ejecución de pena',
        'tooltip'    => 'Audiencias de ejecución de pena',
        'color'      => '#6d28d9',
        'icon'       => '⚖',
        'ids'        => $idsEjecucion,
        'always_show'=> true,
    ],
    'menores' => [
        'label'   => 'Menores',
        'tooltip' => 'Todas las audiencias juveniles (id comienza con IM)',
        'color'   => '#9333ea',
        'icon'    => '👤',
        'prefix'  => 'IM',
    ],
    'otras' => [
        'label'   => 'Otras',
        'tooltip' => 'Audiencias que no pertenecen a ninguna categoría anterior',
        'color'   => '#64748b',
        'icon'    => '📌',
    ],
];

// IDs que pertenecen a categorías definidas (para calcular "otras")
$knownIds = array_merge(
    $CATS['debates']['ids'],
    $CATS['preliminar']['ids'],
    $CATS['cierre']['ids'],
    $CATS['cautelar']['ids'],
    $CATS['ppp']['ids'],
    $CATS['imputativas']['ids'],
    (array)$idsEjecucion
);

// ── Cargar audiencias del día ─────────────────────────────────────────────────
$errDash = null;
$shifts  = ['M' => [], 'V' => []];   // M = mañana, V = vespertino

try {
    $ts_inicio = strtotime($fecha . ' 00:00:00');
    $ts_fin    = strtotime($fecha . ' 23:59:59');

    $stmt = $pdo->prepare("
        SELECT e.id, e.start_time, e.tipoAudiencia_id,
               COALESCE(NULLIF(e.tipoAudiencia,''), t.tipoAudiencia, 'Sin tipo') AS tipo_nombre,
               e.estado, e.name, r.room_name
        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
        WHERE e.start_time BETWEEN ? AND ?
          AND (e.estado IS NULL OR e.estado NOT IN ('No es Audiencia','Duplicada'))
          AND e.noContarEstaAudiencia = 0
        ORDER BY e.start_time
    ");
    $stmt->execute([$ts_inicio, $ts_fin]);
    $allEntries = $stmt->fetchAll();

    // Clasificar por turno y categoría
    foreach ($allEntries as $e) {
        $hour  = (int)date('H', (int)$e['start_time']);
        $turn  = ($hour >= 14) ? 'V' : 'M';
        $tid   = $e['tipoAudiencia_id'] ?? '';

        // Determinar categoría
        if (str_starts_with($tid, 'IM')) {
            $cat = 'menores';
        } elseif (in_array($tid, $CATS['debates']['ids'], true)) {
            $cat = 'debates';
        } elseif (in_array($tid, $CATS['preliminar']['ids'], true)) {
            $cat = 'preliminar';
        } elseif (in_array($tid, $CATS['cierre']['ids'], true)) {
            $cat = 'cierre';
        } elseif (in_array($tid, $CATS['cautelar']['ids'], true)) {
            $cat = 'cautelar';
        } elseif (in_array($tid, $CATS['ppp']['ids'], true)) {
            $cat = 'ppp';
        } elseif (in_array($tid, $CATS['imputativas']['ids'], true)) {
            $cat = 'imputativas';
        } elseif (in_array($tid, $CATS['ejecucion']['ids'], true)) {
            $cat = 'ejecucion';
        } else {
            $cat = 'otras';
        }

        $shifts[$turn]['total'][] = $e;
        $shifts[$turn][$cat][]    = $e;
    }

} catch (PDOException $e) {
    $errDash = $e->getMessage();
}

// Total del día = M + V
$shifts['T'] = [];
foreach (array_merge(['total'], array_keys($CATS)) as $catKey) {
    $combined = array_merge($shifts['M'][$catKey] ?? [], $shifts['V'][$catKey] ?? []);
    if ($combined) $shifts['T'][$catKey] = $combined;
}

// ── Datos para gráficos ───────────────────────────────────────────────────────
$chartPorMes  = [];
$chartPorAnio = [];
$chartImpAnio = [];
$anioActualChart = (int)date('Y');
$mesActualChart  = (int)date('m');
$MESES_CHART = ['Ene','Feb','Mar','Abr','May','Jun','Jul','Ago','Sep','Oct','Nov','Dic'];

try {
    $baseWhere = "AND (estado IS NULL OR estado NOT IN ('No es Audiencia','Duplicada'))
                  AND noContarEstaAudiencia = 0";

    // Chart 1: por mes, año corriente — solo hasta el mes actual
    $rows = $pdo->query("
        SELECT MONTH(FROM_UNIXTIME(start_time)) AS mes,
               SUM(CASE WHEN estado = 'Realizada' OR (estado = 'En Proceso' AND start_time < UNIX_TIMESTAMP()) THEN 1 ELSE 0 END) AS realizadas,
               SUM(CASE WHEN estado = 'Cancelada' THEN 1 ELSE 0 END) AS canceladas
        FROM mrbs_entry
        WHERE YEAR(FROM_UNIXTIME(start_time)) = $anioActualChart
          AND MONTH(FROM_UNIXTIME(start_time)) <= $mesActualChart
          $baseWhere
        GROUP BY mes ORDER BY mes
    ")->fetchAll();
    $rowsIdx = [];
    foreach ($rows as $r) $rowsIdx[(int)$r['mes']] = $r;
    for ($m = 1; $m <= $mesActualChart; $m++) {
        $chartPorMes[] = [
            'lbl'        => $MESES_CHART[$m - 1],
            'realizadas' => (int)($rowsIdx[$m]['realizadas'] ?? 0),
            'canceladas' => (int)($rowsIdx[$m]['canceladas'] ?? 0),
        ];
    }

    // Chart 2: por año 2018-actual
    $rows = $pdo->query("
        SELECT YEAR(FROM_UNIXTIME(start_time)) AS anio,
               SUM(CASE WHEN estado = 'Realizada' OR (estado = 'En Proceso' AND start_time < UNIX_TIMESTAMP()) THEN 1 ELSE 0 END) AS realizadas,
               SUM(CASE WHEN estado = 'Cancelada' THEN 1 ELSE 0 END) AS canceladas
        FROM mrbs_entry
        WHERE YEAR(FROM_UNIXTIME(start_time)) BETWEEN 2018 AND $anioActualChart $baseWhere
        GROUP BY anio ORDER BY anio
    ")->fetchAll();
    $rowsIdx = [];
    foreach ($rows as $r) $rowsIdx[(int)$r['anio']] = $r;
    for ($a = 2018; $a <= $anioActualChart; $a++) {
        $chartPorAnio[] = [
            'lbl'        => (string)$a,
            'realizadas' => (int)($rowsIdx[$a]['realizadas'] ?? 0),
            'canceladas' => (int)($rowsIdx[$a]['canceladas'] ?? 0),
        ];
    }

    // Chart 3: imputativas por año 2018-actual
    $rows = $pdo->query("
        SELECT YEAR(FROM_UNIXTIME(start_time)) AS anio,
               SUM(CASE WHEN estado = 'Realizada' OR (estado = 'En Proceso' AND start_time < UNIX_TIMESTAMP()) THEN 1 ELSE 0 END) AS realizadas,
               SUM(CASE WHEN estado = 'Cancelada' THEN 1 ELSE 0 END) AS canceladas
        FROM mrbs_entry
        WHERE YEAR(FROM_UNIXTIME(start_time)) BETWEEN 2018 AND $anioActualChart
          AND tipoAudiencia_id IN ('IP02','IP03','IP19','IP20') $baseWhere
        GROUP BY anio ORDER BY anio
    ")->fetchAll();
    $rowsIdx = [];
    foreach ($rows as $r) $rowsIdx[(int)$r['anio']] = $r;
    for ($a = 2018; $a <= $anioActualChart; $a++) {
        $chartImpAnio[] = [
            'lbl'        => (string)$a,
            'realizadas' => (int)($rowsIdx[$a]['realizadas'] ?? 0),
            'canceladas' => (int)($rowsIdx[$a]['canceladas'] ?? 0),
        ];
    }
} catch (PDOException $e) { /* gráficos degradan silenciosamente */ }

// ── Helpers ───────────────────────────────────────────────────────────────────
function countEntries(array $entries): array
{
    $cancelled = 0;
    foreach ($entries as $e) {
        if ($e['estado'] === 'Cancelada') $cancelled++;
    }
    return ['active' => count($entries) - $cancelled, 'cancelled' => $cancelled];
}

// Tooltip dinámico: lista los tipos únicos de audiencia presentes
function typesTooltip(array $entries): string
{
    $names = [];
    foreach ($entries as $e) {
        if ($e['tipo_nombre'] && $e['tipo_nombre'] !== 'Sin tipo') {
            $names[$e['tipo_nombre']] = true;
        }
    }
    $sorted = array_keys($names);
    sort($sorted);
    return $sorted ? implode(', ', $sorted) : '—';
}

$urlInforme  = BASE_URL . '/public/informes/informe.php';
$fechaAnterior = date('Y-m-d', strtotime($fecha . ' -1 day'));
$fechaSiguiente = date('Y-m-d', strtotime($fecha . ' +1 day'));

// ── Función para renderizar una celda de categoría ───────────────────────────
function catRow(string $catKey, array $catDef, array $entries, string $fecha, string $turno, string $urlInforme): string
{
    $counts    = countEntries($entries);
    $active    = $counts['active'];
    $cancelled = $counts['cancelled'];
    $tipoDyn   = htmlspecialchars(typesTooltip($entries));
    $tipoStatic = htmlspecialchars($catDef['tooltip']);
    // Tooltip combina descripción estática + tipos reales presentes
    $fullTooltip = $tipoStatic . ($tipoDyn !== '—' ? "\n\nAudiencias hoy: " . $tipoDyn : '');
    $color = $catDef['color'];
    $icon  = $catDef['icon'];
    $label = htmlspecialchars($catDef['label']);

    $href = $urlInforme . '?tipo=aud_dia&cat=' . urlencode($catKey)
          . '&fecha=' . urlencode($fecha) . '&turno=' . urlencode($turno);

    $linkHtml = $active > 0
        ? '<a href="' . $href . '" target="_blank" title="Ver listado de audiencias"'
          . ' style="font-size:20px;font-weight:700;color:' . $color . ';text-decoration:none">'
          . $active . '</a>'
        : '<span style="font-size:20px;font-weight:700;color:#94a3b8">0</span>';

    $cancelHtml = '';
    if ($cancelled > 0) {
        $cancelHtml = ' <a href="' . $href . '&solo_canceladas=1" target="_blank"'
            . ' title="' . $cancelled . ' audiencia' . ($cancelled === 1 ? '' : 's') . ' cancelada' . ($cancelled === 1 ? '' : 's') . '"'
            . ' style="font-size:13px;color:#dc2626;font-weight:700;text-decoration:none">('
            . $cancelled . ')</a>';
    }

    return '<tr title="' . $fullTooltip . '">'
         . '<td style="padding:7px 10px;font-size:13px;color:#334155;white-space:nowrap">'
         . '<span style="margin-right:6px">' . $icon . '</span>' . $label . '</td>'
         . '<td style="padding:7px 10px;text-align:right;white-space:nowrap">'
         . $linkHtml . $cancelHtml
         . '</td></tr>';
}
?>

<div class="ph" style="display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:16px">
  <div style="display:flex;gap:6px;flex-wrap:wrap;align-items:center">
    <a href="<?=BASE_URL?>/public/juicios/tablero.php" class="btn btn-p btn-sm">Tablero de Juicios</a>
    <a href="/mrbs/web"                                class="btn btn-i btn-sm">Tablero de Audiencias</a>
  </div>
  <div style="text-align:center">
    <h1 style="margin:0">Audiencias del día<?= $esHoy ? ' — Hoy' : '' ?></h1>
    <div class="bc">OGJ Rosario · <?= $fechaLabel ?></div>
  </div>
  <div style="display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end">
    <a href="?fecha=<?= $fechaAnterior ?>" class="btn btn-g btn-sm" title="<?= date('d/m/Y', strtotime($fechaAnterior)) ?>">← Anterior</a>
    <?php if (!$esHoy): ?>
    <a href="?" class="btn btn-p btn-sm">Hoy</a>
    <?php endif; ?>
    <a href="?fecha=<?= $fechaSiguiente ?>" class="btn btn-g btn-sm" title="<?= date('d/m/Y', strtotime($fechaSiguiente)) ?>">Siguiente →</a>
    <form method="get" style="display:flex;align-items:center;gap:4px;margin-left:4px">
      <input type="date" name="fecha" value="<?= htmlspecialchars($fecha) ?>"
             style="padding:4px 7px;border:1px solid #d1d5db;border-radius:5px;font-size:13px">
      <button type="submit" class="btn btn-g btn-sm">Ver</button>
    </form>
  </div>
</div>

<?php if ($errDash): ?>
<div class="msg msg-err">⚠ Error al cargar audiencias: <?=htmlspecialchars($errDash)?></div>
<?php endif; ?>

<!-- ── Grilla turnos ─────────────────────────────────────────────────────── -->
<div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:16px">

<?php foreach ([
    'M' => ['label'=>'Turno Mañana',   'sub'=>'Hasta las 13:59'],
    'V' => ['label'=>'Turno Vespertino','sub'=>'14:00 en adelante'],
    'T' => ['label'=>'Total del Día',  'sub'=>'Matutino + Vespertino'],
] as $turnoCod => $turnoInfo): ?>

<div class="card" style="margin-bottom:0">
  <div class="sec" style="display:flex;align-items:center;justify-content:space-between">
    <span><?= $turnoInfo['label'] ?></span>
    <span style="font-size:11px;font-weight:400;color:#64748b"><?= $turnoInfo['sub'] ?></span>
  </div>

  <?php
  $totalCounts = countEntries($shifts[$turnoCod]['total'] ?? []);
  $totalActive = $totalCounts['active'];
  $totalCancel = $totalCounts['cancelled'];
  ?>

  <?php if (empty($shifts[$turnoCod]['total'])): ?>
  <div style="padding:20px;text-align:center;color:#94a3b8;font-size:13px">
    Sin audiencias programadas
  </div>
  <?php else: ?>

  <table style="width:100%;border-collapse:collapse">
    <tbody>
    <?php foreach ($CATS as $catKey => $catDef): ?>
    <?php
    $entries = $shifts[$turnoCod][$catKey] ?? [];
    if ($catKey !== 'total' && empty($entries) && !($catDef['always_show'] ?? false)) continue;
    echo catRow($catKey, $catDef, $entries, $fecha, $turnoCod, $urlInforme);
    ?>
    <?php endforeach; ?>
    </tbody>
  </table>

  <?php if ($totalCancel > 0): ?>
  <div style="font-size:11px;color:#94a3b8;margin-top:8px;padding:4px 10px">
    <span style="color:#dc2626;font-weight:600"><?= $totalCancel ?></span>
    audiencia<?= $totalCancel === 1 ? '' : 's' ?> cancelada<?= $totalCancel === 1 ? '' : 's' ?> incluida<?= $totalCancel === 1 ? '' : 's' ?> en los números en rojo
  </div>
  <?php endif; ?>

  <?php endif; ?>
</div>

<?php endforeach; ?>

</div><!-- /grid -->

<!-- ── Gráficos de audiencias ──────────────────────────────────────────────── -->
<script src="https://cdn.jsdelivr.net/npm/chart.js@4/dist/chart.umd.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2/dist/chartjs-plugin-datalabels.min.js"></script>
<script>Chart.register(ChartDataLabels);</script>
<div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:16px;margin-top:16px">
<?php
$chartsData = [
    ["Audiencias por Mes — {$anioActualChart}", 'chartMes',  $chartPorMes],
    ['Audiencias por Año (2018–' . $anioActualChart . ')',   'chartAnio', $chartPorAnio],
    ['Imputativas por Año (2018–' . $anioActualChart . ')',  'chartImp',  $chartImpAnio],
];
foreach ($chartsData as [$title, $canvasId, $data]):
    $labels = json_encode(array_column($data, 'lbl'));
    $real   = json_encode(array_column($data, 'realizadas'));
    $canc   = json_encode(array_column($data, 'canceladas'));
?>
<div class="card" style="margin-bottom:0">
  <div class="sec" style="font-size:12px"><?= htmlspecialchars($title) ?></div>
  <canvas id="<?= $canvasId ?>" style="max-height:200px"></canvas>
  <script>
  (function(){
    new Chart(document.getElementById('<?= $canvasId ?>'), {
      type: 'bar',
      data: {
        labels: <?= $labels ?>,
        datasets: [
          { label: 'Realizadas', data: <?= $real ?>, backgroundColor: 'rgba(22,163,74,.8)',  borderColor: '#16a34a', borderWidth: 1 },
          { label: 'Canceladas', data: <?= $canc ?>, backgroundColor: 'rgba(220,38,38,.75)', borderColor: '#dc2626', borderWidth: 1 }
        ]
      },
      options: {
        responsive: true,
        plugins: {
          legend: { position: 'top', labels: { font: { size: 10 }, boxWidth: 12 } },
          datalabels: {
            anchor: 'end', align: 'end',
            font: { size: 9 },
            color: '#374151',
            formatter: (val) => val > 0 ? val : null
          }
        },
        layout: { padding: { top: 16 } },
        scales: {
          x: { ticks: { font: { size: 10 } } },
          y: { beginAtZero: true, ticks: { font: { size: 10 } } }
        }
      }
    });
  })();
  </script>
</div>
<?php endforeach; ?>
</div>

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