<?php
declare(strict_types=1);
// ============================================================
// lib/db_helpers.php — Funciones de días hábiles, fechas y negocio
// El $pdo global ya fue creado por config/db2.php
// ============================================================

function es_dia_habil(PDO $pdo, string $fecha): bool
{
    $dow = (int) date('N', strtotime($fecha));
    if ($dow >= 6) return false;
    $s = $pdo->prepare("SELECT COUNT(*) FROM agj_feriados WHERE fecha = ? AND deleted_at IS NULL");
    $s->execute([$fecha]);
    return (int)$s->fetchColumn() === 0;
}

function agregar_dias_habiles(PDO $pdo, string $fecha_inicio, int $dias): string
{
    $dt = new DateTime($fecha_inicio);
    if ($dias === 0) {
        while (!es_dia_habil($pdo, $dt->format('Y-m-d'))) $dt->modify('+1 day');
        return $dt->format('Y-m-d');
    }
    $agregados = 0;
    while ($agregados < $dias) {
        $dt->modify('+1 day');
        if (es_dia_habil($pdo, $dt->format('Y-m-d'))) $agregados++;
    }
    return $dt->format('Y-m-d');
}

function get_parametro(PDO $pdo, string $clave, string $default = ''): string
{
    $s = $pdo->prepare("SELECT valor FROM agj_parametros_sistema WHERE clave = ? AND deleted_at IS NULL");
    $s->execute([$clave]);
    $r = $s->fetch();
    return $r ? $r['valor'] : $default;
}

function calcular_fechas_juicio(PDO $pdo, string $fecha_inicio, int $dias_debate, int $dias_extras = 0, int $dia_pre_alegatos = 1): array
{
    $inicio = agregar_dias_habiles($pdo, $fecha_inicio, 0);
    $dias_tot = ($dias_debate - 1) + $dias_extras + $dia_pre_alegatos;
    $fin_debate  = $dias_tot > 0 ? agregar_dias_habiles($pdo, $inicio, $dias_tot) : $inicio;
    $deliberacion = agregar_dias_habiles($pdo, $fin_debate, 1);
    $dias_verd   = (int)get_parametro($pdo, 'dias_veredicto_tras_debate', '2');
    $veredicto   = agregar_dias_habiles($pdo, $fin_debate, $dias_verd);
    $inicio_fund = agregar_dias_habiles($pdo, $veredicto, 1);
    $dias_fund   = (int)get_parametro($pdo, 'dias_fundamentos', '15');
    $fin_fund    = agregar_dias_habiles($pdo, $inicio_fund, $dias_fund);
    return [
        'fecha_inicio_debate'       => $inicio,
        'fecha_fin_debate'          => $fin_debate,
        'fecha_deliberacion'        => $deliberacion,
        'fecha_veredicto'           => $veredicto,
        'fecha_inicio_fundamentos'  => $inicio_fund,
        'fecha_fin_fundamentos'     => $fin_fund,
    ];
}

function calcular_prioridad(PDO $pdo, array $aa, int $factor): int
{
    $hoy = new DateTime('today');
    $p   = $factor * 100;
    if ($aa['estado_imputado'] === 'preso' && !empty($aa['menor_fecha_detencion'])) {
        $det  = new DateTime($aa['menor_fecha_detencion']);
        $p   += min((int)$hoy->diff($det)->days, 500);
        if (!empty($aa['vencimiento_pp'])) {
            $venc = new DateTime($aa['vencimiento_pp']);
            if ($venc > $hoy) {
                $dv     = (int)$hoy->diff($venc)->days;
                $umbral = (int)get_parametro($pdo, 'dias_prescripcion_umbral', '60');
                if ($dv <= $umbral) $p += ($umbral - $dv) * 5;
            } else {
                $p += 999;
            }
        }
    }
    $fecha_aa = new DateTime($aa['fecha_auto_apertura']);
    $p += min((int)$hoy->diff($fecha_aa)->days, 200);
    return max(0, $p);
}

function persona_tiene_licencia(PDO $pdo, int $persona_id, string $desde, string $hasta): bool
{
    $s = $pdo->prepare("SELECT COUNT(*) FROM agj_licencias WHERE persona_id=? AND estado='activa' AND deleted_at IS NULL AND fecha_desde<=? AND fecha_hasta>=?");
    $s->execute([$persona_id, $hasta, $desde]);
    return (int)$s->fetchColumn() > 0;
}

function juez_intervino_ipp(PDO $pdo, int $aa_id, int $persona_id): bool
{
    $s = $pdo->prepare("SELECT COUNT(*) FROM agj_aa_personas WHERE aa_id=? AND persona_id=? AND rol='juez_ipp' AND deleted_at IS NULL");
    $s->execute([$aa_id, $persona_id]);
    return (int)$s->fetchColumn() > 0;
}

function verificar_superposicion(PDO $pdo, string $desde, string $hasta, array $persona_ids, int $excluir = 0): array
{
    if (empty($persona_ids)) return [];
    $ph = implode(',', array_fill(0, count($persona_ids), '?'));
    $s = $pdo->prepare("
        SELECT ag.id, aa.cuij, aa.imputados, ag.fecha_inicio_debate, ag.fecha_fin_fundamentos, ag.es_sobreturno
        FROM agj_agendamientos ag JOIN agj_autos_apertura aa ON ag.aa_id=aa.id
        WHERE ag.estado IN ('programado','en_curso') AND ag.deleted_at IS NULL
          AND ag.id<>? AND ag.fecha_inicio_debate<=? AND ag.fecha_fin_fundamentos>=?
    ");
    $s->execute([$excluir, $hasta, $desde]);
    $candidatos = $s->fetchAll();
    $conflictos = [];
    foreach ($candidatos as $c) {
        // Intersección real de días hábiles
        $ini = max($desde, $c['fecha_inicio_debate']);
        $fin = min($hasta, $c['fecha_fin_fundamentos']);
        if ($ini > $fin) continue;
        $hay_habil = false;
        $dt = new DateTime($ini); $fe = new DateTime($fin);
        while ($dt <= $fe) { if (es_dia_habil($pdo, $dt->format('Y-m-d'))) { $hay_habil = true; break; } $dt->modify('+1 day'); }
        if (!$hay_habil) continue;
        $s2 = $pdo->prepare("SELECT p.id, p.nombre, p.tipo, ap.rol FROM agj_agendamiento_personas ap JOIN agj_personas p ON ap.persona_id=p.id WHERE ap.agendamiento_id=? AND ap.deleted_at IS NULL AND ap.persona_id IN ($ph)");
        $s2->execute(array_merge([$c['id']], $persona_ids));
        $comunes = $s2->fetchAll();
        if (!empty($comunes)) $conflictos[] = array_merge($c, ['personas_comunes' => $comunes]);
    }
    return $conflictos;
}

// Helper: link de ordenamiento (mismo patrón que consultaDetenidos.php)
function ordenLink(string $columna, string $etiqueta, string $ordenActual, string $dirActual): string
{
    $nuevaDir = ($ordenActual === $columna && $dirActual === 'ASC') ? 'DESC' : 'ASC';
    $params = $_GET;
    $params['orden'] = $columna;
    $params['dir']   = $nuevaDir;
    $query = http_build_query($params);
    $flecha = '';
    if ($ordenActual === $columna) $flecha = ($dirActual === 'ASC') ? ' ▲' : ' ▼';
    return "<a href='?$query' style='color:white;text-decoration:none;'>$etiqueta$flecha</a>";
}

// Helper: paginación HTML
function paginacionHTML(int $page, int $total_pages, array $getParams = []): string
{
    if ($total_pages <= 1) return '';
    $html = '<div class="paginacion">';
    $mk = function(int $p, string $label, bool $active = false, bool $disabled = false) use ($getParams): string {
        $params = array_merge($getParams, ['page' => $p]);
        $q = http_build_query($params);
        $cls = $active ? 'activo' : '';
        $dis = $disabled ? 'disabled' : '';
        return "<button onclick=\"location.href='?$q'\" class='$cls' $dis>$label</button>";
    };
    $html .= $mk(1, '«', false, $page <= 1);
    $html .= $mk(max(1, $page - 1), '‹', false, $page <= 1);
    for ($p = max(1, $page - 2); $p <= min($total_pages, $page + 2); $p++) {
        $html .= $mk($p, (string)$p, $p === $page);
    }
    $html .= $mk(min($total_pages, $page + 1), '›', false, $page >= $total_pages);
    $html .= $mk($total_pages, '»', false, $page >= $total_pages);
    $html .= '</div>';
    return $html;
}
