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

$_lundi   = date('N') == 1 ? date('Y-m-d') : date('Y-m-d', strtotime('last monday'));
$desde    = $_GET['desde']    ?? $_lundi;
$hasta    = $_GET['hasta']    ?? date('Y-m-d', strtotime('+60 days'));
$vista    = $_GET['vista']    ?? 'juez';
$mostrInh   = isset($_GET['inhabiles']);
$sinInterD  = isset($_GET['sin_interd']);

if(!preg_match('/^\d{4}-\d{2}-\d{2}$/',$desde)) $desde=date('Y-m-01');
if(!preg_match('/^\d{4}-\d{2}-\d{2}$/',$hasta))  $hasta=date('Y-m-t');
if($hasta<$desde) $hasta=$desde;
if(!in_array($vista,['juicio','juez','fiscal','defensor_privado','defensor_publico','especifico'])) $vista='juez';
$spec=[];
if($vista==='especifico'){
    foreach(($_GET['spec']??[]) as $s){
        $s=trim($s);
        if(preg_match('/^[A-Za-z0-9]{1,12}$/',$s)) $spec[]=$s;
    }
    $spec=array_values(array_unique($spec));
}

// Feriados en el rango (una sola query)
$stF=$pdo->prepare("SELECT fecha,descripcion FROM ogj_feriados WHERE fecha BETWEEN ? AND ?");
$stF->execute([$desde,$hasta]);
$feriados=[];
foreach($stF->fetchAll() as $r) $feriados[$r['fecha']]=$r['descripcion'];

// Todos los días con su tipo
$todos_dias=[];
$dt=new DateTime($desde); $fe=new DateTime($hasta);
while($dt<=$fe){
    $f=$dt->format('Y-m-d');
    $dn=(int)$dt->format('N');
    if($dn>=6)      $todos_dias[$f]=['tipo'=>'finde',  'desc'=>($dn===6?'Sábado':'Domingo')];
    elseif(isset($feriados[$f])) $todos_dias[$f]=['tipo'=>'feriado','desc'=>$feriados[$f]];
    else            $todos_dias[$f]=['tipo'=>'habil',  'desc'=>''];
    $dt->modify('+1 day');
}

$dias = $mostrInh
    ? array_keys($todos_dias)
    : array_keys(array_filter($todos_dias, fn($d)=>$d['tipo']==='habil'));

// Agendamientos en el rango
$stmt=$pdo->prepare("
    SELECT ag.id, ag.aa_id, aa.cuij_principal, aa.imputados, aa.delitos,
           aa.tipo_tribunal,
           ag.condicion, ag.sub_condicion, ag.turno, ag.estado,
           ag.debate_desde, ag.debate_hasta, ag.fecha_fallo, ag.fecha_fin_bloqueo,
           ag.presidente_id, ag.vocal_1_id, ag.vocal_2_id,
           jPte.nombre AS pte_nom, jV1.nombre AS v1_nom, jV2.nombre AS v2_nom
    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 ag.debate_desde<=? AND ag.fecha_fin_bloqueo>=?
    ORDER BY ag.debate_desde
");
$stmt->execute([$hasta,$desde]);
$agendamientos=$stmt->fetchAll();

// Licencias (IP62) — rango desde/hasta, afectan juez, fiscal y defensor
$stLic=$pdo->prepare("
    SELECT e.juez_id, e.fiscal_id, e.defensor_id,
           DATE(FROM_UNIXTIME(e.start_time)) AS fecha_desde,
           DATE(FROM_UNIXTIME(e.end_time))   AS fecha_hasta,
           COALESCE(NULLIF(e.tipoAudiencia,''), 'Licencia') AS motivo
    FROM mrbs_entry e
    WHERE e.tipoAudiencia_id = 'IP62'
      AND DATE(FROM_UNIXTIME(e.end_time))   >= ?
      AND DATE(FROM_UNIXTIME(e.start_time)) <= ?
");
$stLic->execute([$desde,$hasta]);
$licencias_juez=[];
$licencias_lit=[];
foreach($stLic->fetchAll() as $r){
    $dIni=new DateTime(max($r['fecha_desde'],$desde));
    $dFin=new DateTime(min($r['fecha_hasta'],$hasta));
    while($dIni<=$dFin){
        $f=$dIni->format('Y-m-d');
        if($r['juez_id'])     $licencias_juez[$r['juez_id']][$f]    =$r['motivo'];
        if($r['fiscal_id'])   $licencias_lit[$r['fiscal_id']][$f]   =$r['motivo'];
        if($r['defensor_id']) $licencias_lit[$r['defensor_id']][$f] =$r['motivo'];
        $dIni->modify('+1 day');
    }
}

// Mapa juez→ocupación por día (con rol pte/vocal para etiqueta Fp/Fv)
$jueces_map=[];
foreach($agendamientos as $ag){
    $esUnip = stripos($ag['tipo_tribunal']??'','unipersonal')!==false;
    foreach([
        [$ag['presidente_id'],$ag['pte_nom'],'presidente'],
        [$ag['vocal_1_id'],$ag['v1_nom'],'vocal'],
        [$ag['vocal_2_id'],$ag['v2_nom'],'vocal'],
    ] as [$jid,$jnom,$rol]){
        if(!$jid||$jid==='J000') continue;
        if(!isset($jueces_map[$jid])) $jueces_map[$jid]=['nombre'=>$jnom,'colegio'=>'','dias'=>[]];
        $caratula=$ag['cuij_principal']
            .' · '.mb_substr($ag['imputados'],0,35)
            .($ag['delitos']?' s/ '.mb_substr($ag['delitos'],0,30):'');
        foreach($dias as $f){
            if(!$ag['debate_desde']||!$ag['fecha_fin_bloqueo']) continue;
            if($f<$ag['debate_desde']||$f>$ag['fecha_fin_bloqueo']) continue;
            $esD=$ag['debate_hasta']&&$f<=$ag['debate_hasta'];
            $esV=$ag['fecha_fallo']&&$f===$ag['fecha_fallo'];
            $esF=!$esD&&!$esV&&$ag['fecha_fallo']&&$f>$ag['fecha_fallo'];
            $etapa=($esD?'D':'').($esV?'V':'').($esF?'F':'');
            if(!$etapa) continue;
            $jueces_map[$jid]['dias'][$f]??=[];
            // 'rolF': 'p' si presidente o unipersonal → Fp; 'v' → Fv
            $jueces_map[$jid]['dias'][$f][]=['etapa'=>$etapa,'rolF'=>($rol==='presidente'||$esUnip)?'p':'v','caratula'=>$caratula];
        }
    }
}

// Cargar colegio de cada juez en el mapa
if(!empty($jueces_map)){
    $jids_q=array_keys($jueces_map);
    $ph_q=implode(',',array_fill(0,count($jids_q),'?'));
    $stC=$pdo->prepare("SELECT juez_id,colegio FROM mrbs_juez WHERE juez_id IN ($ph_q)");
    $stC->execute($jids_q);
    foreach($stC->fetchAll() as $r) { if(isset($jueces_map[$r['juez_id']])) $jueces_map[$r['juez_id']]['colegio']=$r['colegio']??''; }
}

// Ordenar: Rosario (abc) → InterDistrital (abc) → otros (abc)
uasort($jueces_map, function($a,$b){
    $ca=$a['colegio']; $cb=$b['colegio'];
    $ra=($ca==='Rosario'?0:($ca==='InterDistrital'?1:2));
    $rb=($cb==='Rosario'?0:($cb==='InterDistrital'?1:2));
    if($ra!==$rb) return $ra-$rb;
    return strcmp($a['nombre'],$b['nombre']);
});

// Mapa litigante→ocupación (fiscal o defensor — sin etapa F)
$litigantes_map=[];
if(in_array($vista,['fiscal','defensor_privado','defensor_publico'])){
    $aaIds=array_unique(array_column($agendamientos,'aa_id'));
    if(!empty($aaIds)){
        $ph=implode(',',array_fill(0,count($aaIds),'?'));
        if($vista==='fiscal'){
            $rolFilter="al.rol_en_causa='Fiscal'";
        } elseif($vista==='defensor_publico'){
            $rolFilter="al.rol_en_causa='Defensor' AND vl.rol='Defensor Público'";
        } else {
            $rolFilter="al.rol_en_causa='Defensor' AND vl.rol='Defensor Privado'";
        }
        $stL=$pdo->prepare("
            SELECT al.aa_id, al.rol_en_causa, vl.litigante_id, vl.nombre
            FROM agj_aa_litigantes al
            JOIN v_litigantes vl ON al.litigante_id=vl.litigante_id
            WHERE al.aa_id IN ($ph)
              AND $rolFilter
        ");
        $stL->execute(array_values($aaIds));
        $aa_lit=[];
        foreach($stL->fetchAll() as $r) $aa_lit[$r['aa_id']][]=$r;
        foreach($agendamientos as $ag){
            $aid=$ag['aa_id'];
            if(!isset($aa_lit[$aid])) continue;
            $caratula=$ag['cuij_principal']
                .' · '.mb_substr($ag['imputados'],0,35)
                .($ag['delitos']?' s/ '.mb_substr($ag['delitos'],0,30):'');
            foreach($aa_lit[$aid] as $lit){
                $lid=$lit['litigante_id'];
                if(!isset($litigantes_map[$lid])) $litigantes_map[$lid]=['nombre'=>$lit['nombre'],'dias'=>[]];
                foreach($dias as $f){
                    if(!$ag['debate_desde']||!$ag['debate_hasta']) continue;
                    if($f<$ag['debate_desde']||$f>$ag['debate_hasta']) continue;
                    $esD=$f<$ag['fecha_fallo']||!$ag['fecha_fallo'];
                    $esV=$ag['fecha_fallo']&&$f===$ag['fecha_fallo'];
                    $etapa=($esD?'D':'').($esV?'V':'');
                    if(!$etapa) continue;
                    $litigantes_map[$lid]['dias'][$f]??=[];
                    $litigantes_map[$lid]['dias'][$f][]=['etapa'=>$etapa,'caratula'=>$caratula];
                }
            }
        }
        uasort($litigantes_map,fn($a,$b)=>strcmp($a['nombre'],$b['nombre']));
    }
}

// Personas disponibles para el picker de Específico
$allPeople=$pdo->query("
    SELECT juez_id AS id, nombre, 'Juez' AS tipo
    FROM mrbs_juez WHERE instancia=1 AND activo=1
      AND juez_id NOT IN ('J000','JT00','JC00','JIPP')
    UNION ALL
    SELECT litigante_id, nombre,
        CASE rol WHEN 'Fiscal' THEN 'Fiscal'
                 WHEN 'Defensor Privado' THEN 'Def. Privado'
                 ELSE 'Def. Público' END
    FROM v_litigantes
    ORDER BY nombre
")->fetchAll(PDO::FETCH_ASSOC);

// Mapa específico: solo personas seleccionadas
$especifico_map=[];
if($vista==='especifico' && !empty($spec)){
    $ph=implode(',',array_fill(0,count($spec),'?'));
    // Nombres de las personas seleccionadas
    $stSp=$pdo->prepare("
        SELECT juez_id AS id, nombre, 'juez' AS tipo FROM mrbs_juez WHERE juez_id IN ($ph)
        UNION ALL
        SELECT litigante_id, nombre, 'litigante' FROM v_litigantes WHERE litigante_id IN ($ph)
    ");
    $stSp->execute(array_merge($spec,$spec));
    $specInfo=[];
    foreach($stSp->fetchAll() as $r) $specInfo[$r['id']]=['nombre'=>$r['nombre'],'tipo'=>$r['tipo']];

    foreach($spec as $sid){
        if(!isset($specInfo[$sid])) continue;
        $especifico_map[$sid]=['nombre'=>$specInfo[$sid]['nombre'],'tipo'=>$specInfo[$sid]['tipo'],'dias'=>[]];
    }

    // Ocupación de jueces (de jueces_map ya construido)
    foreach($especifico_map as $sid=>&$sd){
        if($sd['tipo']==='juez' && isset($jueces_map[$sid])) $sd['dias']=$jueces_map[$sid]['dias'];
    }
    unset($sd);

    // Ocupación de litigantes
    $specLitIds=array_keys(array_filter($especifico_map,fn($s)=>$s['tipo']==='litigante'));
    if(!empty($specLitIds)){
        $aaIds2=array_values(array_unique(array_column($agendamientos,'aa_id')));
        if(!empty($aaIds2)){
            $ph1=implode(',',array_fill(0,count($aaIds2),'?'));
            $ph2=implode(',',array_fill(0,count($specLitIds),'?'));
            $stL2=$pdo->prepare("SELECT aa_id,litigante_id FROM agj_aa_litigantes WHERE aa_id IN ($ph1) AND litigante_id IN ($ph2)");
            $stL2->execute(array_merge(array_values($aaIds2),$specLitIds));
            $aa_lit2=[];
            foreach($stL2->fetchAll() as $r) $aa_lit2[$r['aa_id']][]=$r['litigante_id'];
            foreach($agendamientos as $ag){
                $aid=$ag['aa_id'];
                if(!isset($aa_lit2[$aid])) continue;
                $caratula=$ag['cuij_principal'].' · '.mb_substr($ag['imputados'],0,35).($ag['delitos']?' s/ '.mb_substr($ag['delitos'],0,30):'');
                foreach($aa_lit2[$aid] as $lid){
                    if(!isset($especifico_map[$lid])) continue;
                    foreach($dias as $f){
                        if(!$ag['debate_desde']||!$ag['debate_hasta']) continue;
                        if($f<$ag['debate_desde']||$f>$ag['debate_hasta']) continue;
                        $esD=!$ag['fecha_fallo']||$f<$ag['fecha_fallo'];
                        $esV=$ag['fecha_fallo']&&$f===$ag['fecha_fallo'];
                        $etapa=($esD?'D':'').($esV?'V':'');
                        if(!$etapa) continue;
                        $especifico_map[$lid]['dias'][$f]??=[];
                        $especifico_map[$lid]['dias'][$f][]=['etapa'=>$etapa,'caratula'=>$caratula];
                    }
                }
            }
        }
    }
    uasort($especifico_map,fn($a,$b)=>strcmp($a['nombre'],$b['nombre']));
}

$inhParam=$mostrInh?'&inhabiles=1':'';
$hoy=date('Y-m-d');

$paginaActual='juicios';
require __DIR__ . '/../../config/menu.php';
?>
<form method="GET" id="ganttForm"
      style="display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:8px;padding:6px 0;border-bottom:1px solid #e2e8f0">
  <strong style="font-size:14px;color:#1e293b;white-space:nowrap;margin-right:4px">📊 Gantt</strong>
  <div style="width:130px"><input type="date" name="desde" value="<?=$desde?>" onchange="this.form.submit()"></div>
  <span style="color:#94a3b8;font-size:12px">→</span>
  <div style="width:130px"><input type="date" name="hasta" value="<?=$hasta?>" onchange="this.form.submit()"></div>
  <select name="vista" onchange="this.form.submit()" style="padding:5px 8px;border:1px solid #d1d5db;border-radius:5px;font-size:12px">
    <option value="juicio"   <?=$vista==='juicio'  ?'selected':''?>>Por Juicio</option>
    <option value="juez"     <?=$vista==='juez'    ?'selected':''?>>Por Juez</option>
    <option value="fiscal"          <?=$vista==='fiscal'         ?'selected':''?>>Por Fiscal</option>
    <option value="defensor_privado" <?=$vista==='defensor_privado'?'selected':''?>>Por Defensor Privado</option>
    <option value="defensor_publico" <?=$vista==='defensor_publico'?'selected':''?>>Por Defensor Público</option>
    <option value="especifico" <?=$vista==='especifico'?'selected':''?>>Específico</option>
  </select>
  <?php foreach($spec as $sid): ?>
  <input type="hidden" name="spec[]" value="<?=htmlspecialchars($sid)?>">
  <?php endforeach; ?>
  <?php if($vista==='especifico'): ?>
  <!-- Picker de personas para vista Específico -->
  <div style="display:flex;align-items:flex-start;gap:6px;flex-wrap:wrap;border-left:2px solid #e2e8f0;padding-left:8px;margin-left:4px;position:relative">
    <div style="position:relative">
      <input type="text" id="specSearch" placeholder="Buscar persona…"
             autocomplete="off"
             style="padding:5px 8px;border:1px solid #d1d5db;border-radius:5px;font-size:12px;width:200px"
             oninput="specFilter(this.value)" onfocus="specFilter(this.value)">
      <div id="specDrop"
           style="display:none;position:absolute;top:100%;left:0;z-index:400;
                  background:#fff;border:1px solid #e2e8f0;border-radius:6px;
                  box-shadow:0 4px 16px rgba(0,0,0,.15);max-height:240px;overflow-y:auto;
                  min-width:280px;margin-top:2px;font-size:12px"></div>
    </div>
    <div id="specChips" style="display:flex;flex-wrap:wrap;gap:4px;align-items:center;min-height:28px">
      <?php foreach($spec as $sid):
        $pInfo=array_values(array_filter($allPeople,fn($p)=>$p['id']===$sid));
        $pNom=$pInfo[0]['nombre']??$sid;
        $pTipo=$pInfo[0]['tipo']??'';
      ?>
      <span class="spec-chip" data-id="<?=htmlspecialchars($sid)?>"
            style="display:inline-flex;align-items:center;gap:4px;background:#dbeafe;
                   border:1px solid #93c5fd;border-radius:12px;padding:2px 8px;font-size:11px;color:#1e40af">
        <span style="color:#64748b;font-size:10px"><?=htmlspecialchars($pTipo)?></span>
        <?=htmlspecialchars($pNom)?>
        <button type="button" onclick="specRemove('<?=htmlspecialchars($sid)?>')"
                style="border:none;background:none;cursor:pointer;color:#6b7280;font-size:13px;
                       padding:0;line-height:1;margin-left:2px">&times;</button>
      </span>
      <?php endforeach; ?>
      <?php if(empty($spec)): ?>
      <span style="color:#94a3b8;font-size:11px;font-style:italic">Sin personas seleccionadas</span>
      <?php endif; ?>
    </div>
    <button type="submit" id="specApply" class="btn btn-p btn-sm" style="align-self:center">Aplicar</button>
  </div>
  <?php endif; ?>
  <label style="font-size:12px;font-weight:normal;display:flex;align-items:center;gap:4px;cursor:pointer;white-space:nowrap">
    <input type="checkbox" name="inhabiles" value="1" <?=$mostrInh?'checked':''?> onchange="this.form.submit()"> Inhábiles
  </label>
  <?php if($vista==='juez'): ?>
  <label style="font-size:12px;font-weight:normal;display:flex;align-items:center;gap:4px;cursor:pointer;white-space:nowrap"
         title="Ocultar jueces del Colegio InterDistrital">
    <input type="checkbox" name="sin_interd" value="1" <?=$sinInterD?'checked':''?> onchange="this.form.submit()"> Ocultar InterDistrital
  </label>
  <?php endif; ?>
  <a href="?desde=<?=date('Y-m-d',strtotime('monday this week'))?>&hasta=<?=date('Y-m-d',strtotime('friday this week'))?>&vista=<?=$vista?><?=$inhParam?>" class="btn btn-g btn-sm">Semana</a>
  <a href="?desde=<?=date('Y-m-01')?>&hasta=<?=date('Y-m-t')?>&vista=<?=$vista?><?=$inhParam?>" class="btn btn-g btn-sm">Mes</a>
  <span style="border-left:1px solid #e2e8f0;height:20px"></span>
  <span style="font-size:11px;display:flex;gap:5px;align-items:center;flex-wrap:wrap">
    <?php if($vista==='juicio'): ?>
      <span style="color:#64748b">D=Debate F=Fallo B=Bloqueo</span>
      <span style="background:#93c5fd;padding:1px 6px;border-radius:3px">Titular</span>
      <span style="background:#fde68a;padding:1px 6px;border-radius:3px">Sobre-ag.</span>
    <?php elseif($vista==='juez'): ?>
      <span style="color:#64748b">D=Debate&nbsp; V=Veredicto&nbsp; Fp=Fund.Presidente&nbsp; Fv=Fund.Vocal</span>
      <span style="background:#f0fdf4;border:1px solid #bbf7d0;padding:1px 6px;border-radius:3px">Libre</span>
      <span style="background:#93c5fd;padding:1px 6px;border-radius:3px">1 juicio</span>
      <span style="background:#fca5a5;padding:1px 6px;border-radius:3px">2 juicios</span>
      <span style="background:#ef4444;color:#fff;padding:1px 6px;border-radius:3px">3+</span>
      <span style="background:#fed7aa;border:1px solid #fb923c;color:#7c2d12;padding:1px 6px;border-radius:3px">L=Licencia</span>
    <?php elseif($vista==='especifico'): ?>
      <span style="color:#64748b">D=Debate&nbsp; V=Veredicto&nbsp; F=Fundamentos</span>
      <span style="background:#f0fdf4;border:1px solid #bbf7d0;padding:1px 6px;border-radius:3px">Libre</span>
      <span style="background:#93c5fd;padding:1px 6px;border-radius:3px">1 juicio</span>
      <span style="background:#fca5a5;padding:1px 6px;border-radius:3px">2+</span>
      <span style="background:#fed7aa;border:1px solid #fb923c;color:#7c2d12;padding:1px 6px;border-radius:3px">L=Licencia</span>
    <?php else: ?>
      <span style="color:#64748b">D=Debate&nbsp; V=Veredicto</span>
      <span style="background:#f0fdf4;border:1px solid #bbf7d0;padding:1px 6px;border-radius:3px">Libre</span>
      <span style="background:#93c5fd;padding:1px 6px;border-radius:3px">1 juicio</span>
      <span style="background:#fca5a5;padding:1px 6px;border-radius:3px">2 juicios</span>
      <span style="background:#ef4444;color:#fff;padding:1px 6px;border-radius:3px">3+</span>
      <span style="background:#fed7aa;border:1px solid #fb923c;color:#7c2d12;padding:1px 6px;border-radius:3px">L=Licencia</span>
    <?php endif; ?>
    <?php if($mostrInh): ?>
      <span style="background:#fef9c3;border:1px solid #fde047;padding:1px 6px;border-radius:3px">Inhábil</span>
    <?php endif; ?>
    <span style="background:#854d0e;color:#fef08a;padding:1px 6px;border-radius:3px">Hoy</span>
  </span>
</form>

<?php
// Helper: estilo del <th> de columna de fecha
function thDiaStyle(string $f, array $todos_dias, bool $mostrInh, string $hoy): string {
    $esHoy = $f === $hoy;
    $info  = $todos_dias[$f] ?? ['tipo'=>'habil','desc'=>''];
    $esInh = $info['tipo'] !== 'habil';
    if($esHoy)       return 'background:#854d0e;color:#fef08a';
    if($esInh)       return 'background:#fef9c3;color:#92400e';
    return 'background:#f1f5f9;color:#475569';
}
function thDiaTitle(string $f, array $todos_dias): string {
    static $dn=['','Lunes','Martes','Miércoles','Jueves','Viernes','Sábado','Domingo'];
    static $mn=['','enero','febrero','marzo','abril','mayo','junio','julio','agosto','septiembre','octubre','noviembre','diciembre'];
    $dt  = new DateTime($f);
    $txt = $dn[(int)$dt->format('N')].' '.(int)$dt->format('j').' de '.$mn[(int)$dt->format('n')].' de '.$dt->format('Y');
    $info= $todos_dias[$f] ?? ['tipo'=>'habil','desc'=>''];
    if($info['desc']) $txt .= ' — '.$info['desc'];
    return ' title="'.htmlspecialchars($txt).'"';
}
$colLabel = match($vista){
    'juez'=>'Juez','fiscal'=>'Fiscal',
    'defensor_privado'=>'Defensor Privado','defensor_publico'=>'Defensor Público',
    'especifico'=>'Persona',
    default=>'Juicio / CUIJ'
};
$colWidth  = in_array($vista,['juez','fiscal','defensor_privado','defensor_publico','especifico']) ? 200 : 220;

// Debates titulares por día (fila resumen del Gantt de juicios)
$debTitByDay=[];
if($vista==='juicio'){
    foreach($dias as $f){
        $cnt=0;
        foreach($agendamientos as $ag){
            if($ag['condicion']==='Titular'
               && $ag['debate_desde'] && $ag['debate_hasta']
               && $f>=$ag['debate_desde'] && $f<=$ag['debate_hasta']) $cnt++;
        }
        $debTitByDay[$f]=$cnt;
    }
}
?>

<div style="max-height:calc(100vh - 170px);overflow:auto;border:1px solid #e2e8f0;border-radius:6px">
<table style="min-width:max-content;font-size:11px;border-collapse:collapse">
  <thead>
    <tr>
      <th style="width:<?=$colWidth?>px;min-width:<?=$colWidth?>px;max-width:<?=$colWidth?>px;
                 position:sticky;left:0;top:0;z-index:30;
                 background:#1e293b;color:#f1f5f9;padding:5px 10px;
                 border-right:2px solid #334155;white-space:nowrap;text-align:left;
                 overflow:hidden;text-overflow:ellipsis">
        <?=$colLabel?>
      </th>
      <?php foreach($dias as $f):
        $esHoy=$f===$hoy;
        $style=thDiaStyle($f,$todos_dias,$mostrInh,$hoy);
        $title=thDiaTitle($f,$todos_dias);
      ?>
      <th<?=$title?> style="min-width:36px;position:sticky;top:0;z-index:20;text-align:center;
               padding:4px 2px;border:1px solid #e2e8f0;font-size:10px;<?=$style?>">
        <?=date('d/m',strtotime($f))?>
      </th>
      <?php endforeach; ?>
    </tr>
    <?php if($vista==='juicio'): ?>
    <tr>
      <th style="width:<?=$colWidth?>px;min-width:<?=$colWidth?>px;max-width:<?=$colWidth?>px;
                 position:sticky;left:0;top:22px;z-index:30;
                 background:#0f172a;color:#94a3b8;padding:3px 10px;
                 border-right:2px solid #334155;white-space:nowrap;text-align:left;
                 font-size:9px;font-weight:400;font-style:italic;overflow:hidden;text-overflow:ellipsis">
        Debates titulares
      </th>
      <?php foreach($dias as $f):
        $cnt=$debTitByDay[$f]??0;
        $info2=$todos_dias[$f]??['tipo'=>'habil'];
        if($cnt<=4 && $cnt>0)  { $rbg='#bae6fd'; $rco='#075985'; $rfw='600'; }
        elseif($cnt<=6)        { $rbg='#86efac'; $rco='#14532d'; $rfw='700'; }
        elseif($cnt<=8)        { $rbg='#fdba74'; $rco='#7c2d12'; $rfw='700'; }
        elseif($cnt>8)         { $rbg='#881337'; $rco='#ffe4e6'; $rfw='700'; }
        elseif($f===$hoy)      { $rbg='#854d0e'; $rco='#fef08a'; $rfw='400'; }
        elseif($info2['tipo']!=='habil') { $rbg='#fef9c3'; $rco='#92400e'; $rfw='400'; }
        else                   { $rbg='#f1f5f9'; $rco='#94a3b8'; $rfw='400'; }
      ?>
      <th style="position:sticky;top:22px;z-index:20;
                 text-align:center;min-width:36px;padding:2px;
                 border:1px solid #e2e8f0;font-size:9px;
                 font-weight:<?=$rfw?>;background:<?=$rbg?>;color:<?=$rco?>">
        <?=$cnt?:''?>
      </th>
      <?php endforeach; ?>
    </tr>
    <?php endif; ?>
  </thead>
  <tbody>
<?php if($vista==='juicio'): ?>
  <?php foreach($agendamientos as $ag):
    $isTitular=$ag['condicion']==='Titular';
  ?>
  <tr>
    <td style="position:sticky;left:0;background:#f8fafc;z-index:5;
               border-right:2px solid #e2e8f0;padding:5px 8px;
               width:<?=$colWidth?>px;min-width:<?=$colWidth?>px;max-width:<?=$colWidth?>px;
               white-space:nowrap;overflow:hidden;text-overflow:ellipsis">
      <strong style="font-size:12px"><?=htmlspecialchars($ag['cuij_principal'])?></strong>
      <?=$ag['condicion']==='SobreAgendado'?'<span style="color:#d97706;font-size:10px"> ⚠️</span>':''?><br>
      <span style="font-size:10px;color:#64748b"><?=htmlspecialchars(mb_substr($ag['imputados'],0,28))?></span><br>
      <span style="font-size:10px;color:#0891b2"><?=htmlspecialchars($ag['turno']??'')?></span>
    </td>
    <?php foreach($dias as $f):
      $info    = $todos_dias[$f] ?? ['tipo'=>'habil','desc'=>''];
      $esInh   = $info['tipo'] !== 'habil';
      $esHoy   = $f === $hoy;
      $esDebate= $ag['debate_desde'] && $f>=$ag['debate_desde'] && $ag['debate_hasta'] && $f<=$ag['debate_hasta'];
      $esFallo = $ag['fecha_fallo'] && $f===$ag['fecha_fallo'];
      $esBloqueo=!$esDebate&&!$esFallo&&$ag['fecha_fallo']&&$ag['fecha_fin_bloqueo']&&$f>$ag['fecha_fallo']&&$f<=$ag['fecha_fin_bloqueo'];
      $lbl=$esDebate?'D':($esFallo?'F':($esBloqueo?'B':''));
      $enPeriodo = $esDebate||$esFallo||$esBloqueo;
      if($esInh && $enPeriodo) $bg='#fde68a';          // amarillo sobre período inhábil
      elseif($esInh)           $bg='#fef9c3';
      elseif($esHoy&&!$enPeriodo) $bg='#fef9c3';
      elseif($esDebate)        $bg=($isTitular?'#93c5fd':'#fde68a');
      elseif($esFallo)         $bg='#86efac';
      elseif($esBloqueo)       $bg='#c4b5fd';
      else                     $bg='#f8fafc';
    ?>
    <td style="background:<?=$bg?>;text-align:center;min-width:36px;font-size:9px;
               padding:2px;border:1px solid #e2e8f0"><?=$lbl?></td>
    <?php endforeach; ?>
  </tr>
  <?php endforeach; ?>
  <?php if(empty($agendamientos)): ?>
  <tr><td colspan="<?=count($dias)+1?>" style="text-align:center;padding:20px;color:#64748b">Sin juicios en el período</td></tr>
  <?php endif; ?>

<?php elseif($vista==='juez'): ?>
  <?php
  $prevColegio = null;
  foreach($jueces_map as $jid=>$jd):
    // Filtro InterDistrital
    if($sinInterD && $jd['colegio']==='InterDistrital') continue;
    // Fila separadora al pasar de Rosario a InterDistrital
    if($prevColegio==='Rosario' && $jd['colegio']==='InterDistrital'):
  ?>
  <tr>
    <td colspan="<?=count($dias)+1?>" style="background:#e2e8f0;height:6px;border:none;padding:0"></td>
  </tr>
  <?php endif; $prevColegio = $jd['colegio']; ?>
  <tr>
    <td style="position:sticky;left:0;background:#f8fafc;z-index:5;
               border-right:2px solid #e2e8f0;padding:5px 10px;
               width:<?=$colWidth?>px;min-width:<?=$colWidth?>px;max-width:<?=$colWidth?>px;
               white-space:nowrap;overflow:hidden;text-overflow:ellipsis">
      <strong style="font-size:12px"><?=htmlspecialchars($jd['nombre'])?></strong>
      <?php if($jd['colegio']==='InterDistrital'): ?>
      <span style="font-size:9px;color:#94a3b8;margin-left:4px">ID</span>
      <?php endif; ?>
    </td>
    <?php foreach($dias as $f):
      $info  = $todos_dias[$f] ?? ['tipo'=>'habil','desc'=>''];
      $esInh = $info['tipo'] !== 'habil';
      $esHoy = $f === $hoy;
      $entradas = $jd['dias'][$f] ?? [];
      $cant     = count($entradas);
      // Etiqueta: etapas únicas D→V→Fp/Fv (Fp=Presidente/Unipersonal, Fv=Vocal)
      $etSet=[];
      foreach($entradas as $e){
          if(strpos($e['etapa'],'D')!==false) $etSet['D']=1;
          if(strpos($e['etapa'],'V')!==false) $etSet['V']=1;
          if(strpos($e['etapa'],'F')!==false) $etSet[($e['rolF']??'v')==='p'?'Fp':'Fv']=1;
      }
      // Ordenar: D primero, luego V, luego Fp/Fv
      $ordered=[]; foreach(['D','V','Fp','Fv'] as $k){ if(isset($etSet[$k])) $ordered[]=$k; }
      $lbl=implode('-',$ordered);
      // Tooltip: una línea por juicio con su etapa
      $tipLines=array_map(fn($e)=>$e['etapa'].': '.$e['caratula'],$entradas);
      // Licencia overlay
      $licMotivo=$licencias_juez[$jid][$f] ?? null;
      if($licMotivo){
          $lbl='L'.($lbl?'·'.$lbl:'');
          $tip=htmlspecialchars('Licencia: '.$licMotivo.($tipLines?"\n".implode("\n",$tipLines):''));
          $bg='#fed7aa'; $co='#7c2d12'; $bd='#fb923c';
      } else {
          $tip=htmlspecialchars(implode("\n",$tipLines));
          if($esHoy && $cant===0){
              $bg='#854d0e'; $co='#fef08a'; $bd='#854d0e';
          } elseif($esInh){
              if($cant===0)     { $bg='#fef9c3'; $co='#92400e'; $bd='#fde047'; }
              elseif($cant===1) { $bg='#fde047'; $co='#78350f'; $bd='#f59e0b'; }
              elseif($cant===2) { $bg='#f59e0b'; $co='#fff';    $bd='#d97706'; }
              else              { $bg='#d97706'; $co='#fff';    $bd='#b45309'; }
          } elseif($cant===0){
              $bg='#f0fdf4'; $co='#1e293b'; $bd='#bbf7d0';
          } elseif($cant===1){
              $bg='#93c5fd'; $co='#1e293b'; $bd='#60a5fa';
          } elseif($cant===2){
              $bg='#fca5a5'; $co='#1e293b'; $bd='#f87171';
          } else {
              $bg='#ef4444'; $co='#ffffff'; $bd='#b91c1c';
          }
      }
    ?>
    <td style="background:<?=$bg?>;color:<?=$co?>;border:1px solid <?=$bd?>;
               text-align:center;min-width:40px;font-size:9px;padding:2px;
               font-weight:<?=($cant>=2||$licMotivo)?'700':'400'?>;letter-spacing:-.2px"
        title="<?=$tip?>">
      <?=$lbl?>
    </td>
    <?php endforeach; ?>
  </tr>
  <?php endforeach; ?>
  <?php if(empty($jueces_map)): ?>
  <tr><td colspan="<?=count($dias)+1?>" style="text-align:center;padding:20px;color:#64748b">Sin jueces con juicios en el período</td></tr>
  <?php endif; ?>

<?php elseif(in_array($vista,['fiscal','defensor_privado','defensor_publico'])): ?>
  <?php foreach($litigantes_map as $lid=>$ld): ?>
  <tr>
    <td style="position:sticky;left:0;background:#f8fafc;z-index:5;
               border-right:2px solid #e2e8f0;padding:5px 10px;
               width:<?=$colWidth?>px;min-width:<?=$colWidth?>px;max-width:<?=$colWidth?>px;
               white-space:nowrap;overflow:hidden;text-overflow:ellipsis">
      <strong style="font-size:12px"><?=htmlspecialchars($ld['nombre'])?></strong>
    </td>
    <?php foreach($dias as $f):
      $info  = $todos_dias[$f] ?? ['tipo'=>'habil','desc'=>''];
      $esInh = $info['tipo'] !== 'habil';
      $esHoy = $f === $hoy;
      $entradas = $ld['dias'][$f] ?? [];
      $cant     = count($entradas);
      $etSet=[];
      foreach($entradas as $e){
          if(strpos($e['etapa'],'D')!==false)$etSet['D']=1;
          if(strpos($e['etapa'],'V')!==false)$etSet['V']=1;
      }
      $lbl=implode('-',array_keys($etSet));
      $tipLines=array_map(fn($e)=>$e['etapa'].': '.$e['caratula'],$entradas);
      // Licencia overlay
      $licMotivo=$licencias_lit[$lid][$f] ?? null;
      if($licMotivo){
          $lbl='L'.($lbl?'·'.$lbl:'');
          $tip=htmlspecialchars('Licencia: '.$licMotivo.($tipLines?"\n".implode("\n",$tipLines):''));
          $bg='#fed7aa'; $co='#7c2d12'; $bd='#fb923c';
      } else {
          $tip=htmlspecialchars(implode("\n",$tipLines));
          if($esHoy && $cant===0){
              $bg='#854d0e'; $co='#fef08a'; $bd='#854d0e';
          } elseif($esInh){
              if($cant===0)     { $bg='#fef9c3'; $co='#92400e'; $bd='#fde047'; }
              elseif($cant===1) { $bg='#fde047'; $co='#78350f'; $bd='#f59e0b'; }
              elseif($cant===2) { $bg='#f59e0b'; $co='#fff';    $bd='#d97706'; }
              else              { $bg='#d97706'; $co='#fff';    $bd='#b45309'; }
          } elseif($cant===0){
              $bg='#f0fdf4'; $co='#1e293b'; $bd='#bbf7d0';
          } elseif($cant===1){
              $bg='#93c5fd'; $co='#1e293b'; $bd='#60a5fa';
          } elseif($cant===2){
              $bg='#fca5a5'; $co='#1e293b'; $bd='#f87171';
          } else {
              $bg='#ef4444'; $co='#ffffff'; $bd='#b91c1c';
          }
      }
    ?>
    <td style="background:<?=$bg?>;color:<?=$co?>;border:1px solid <?=$bd?>;
               text-align:center;min-width:40px;font-size:9px;padding:2px;
               font-weight:<?=($cant>=2||$licMotivo)?'700':'400'?>;letter-spacing:-.2px"
        title="<?=$tip?>">
      <?=$lbl?>
    </td>
    <?php endforeach; ?>
  </tr>
  <?php endforeach; ?>
  <?php if(empty($litigantes_map)): ?>
  <tr><td colspan="<?=count($dias)+1?>" style="text-align:center;padding:20px;color:#64748b">
    Sin <?=match($vista){'fiscal'=>'fiscales','defensor_publico'=>'defensores públicos',default=>'defensores privados'}?> con juicios en el período
  </td></tr>
  <?php endif; ?>
<?php elseif($vista==='especifico'): ?>
  <?php if(empty($spec)): ?>
  <tr><td colspan="<?=count($dias)+1?>" style="text-align:center;padding:20px;color:#64748b">
    Buscá y seleccioná personas en el picker de arriba para ver su Gantt.
  </td></tr>
  <?php elseif(empty($especifico_map)): ?>
  <tr><td colspan="<?=count($dias)+1?>" style="text-align:center;padding:20px;color:#64748b">
    No se encontraron datos para las personas seleccionadas en el período.
  </td></tr>
  <?php else: ?>
  <?php foreach($especifico_map as $sid=>$sd):
    $esJuez = $sd['tipo']==='juez';
  ?>
  <tr>
    <td style="position:sticky;left:0;background:#f8fafc;z-index:5;
               border-right:2px solid #e2e8f0;padding:5px 10px;
               width:<?=$colWidth?>px;min-width:<?=$colWidth?>px;max-width:<?=$colWidth?>px;
               white-space:nowrap;overflow:hidden;text-overflow:ellipsis">
      <strong style="font-size:12px"><?=htmlspecialchars($sd['nombre'])?></strong><br>
      <span style="font-size:10px;color:#64748b"><?=$esJuez?'Juez':'Litigante'?></span>
    </td>
    <?php foreach($dias as $f):
      $info    = $todos_dias[$f] ?? ['tipo'=>'habil','desc'=>''];
      $esInh   = $info['tipo'] !== 'habil';
      $esHoy   = $f === $hoy;
      $entradas= $sd['dias'][$f] ?? [];
      $cant    = count($entradas);
      $etSet=[];
      foreach($entradas as $e){
          if(strpos($e['etapa'],'D')!==false) $etSet['D']=1;
          if(strpos($e['etapa'],'V')!==false) $etSet['V']=1;
          if(strpos($e['etapa'],'F')!==false) $etSet['F']=1;
      }
      $lbl=implode('-',array_keys($etSet));
      $tipLines=array_map(fn($e)=>$e['etapa'].': '.$e['caratula'],$entradas);
      // Licencia overlay: jueces→$licencias_juez; litigantes→$licencias_lit
      $licMotivo=$esJuez ? ($licencias_juez[$sid][$f]??null) : ($licencias_lit[$sid][$f]??null);
      if($licMotivo){
          $lbl='L'.($lbl?'·'.$lbl:'');
          $tip=htmlspecialchars('Licencia: '.$licMotivo.($tipLines?"\n".implode("\n",$tipLines):''));
          $bg='#fed7aa'; $co='#7c2d12'; $bd='#fb923c';
      } else {
          $tip=htmlspecialchars(implode("\n",$tipLines));
          if($esHoy && $cant===0){
              $bg='#854d0e'; $co='#fef08a'; $bd='#854d0e';
          } elseif($esInh){
              if($cant===0)     { $bg='#fef9c3'; $co='#92400e'; $bd='#fde047'; }
              elseif($cant===1) { $bg='#fde047'; $co='#78350f'; $bd='#f59e0b'; }
              else              { $bg='#f59e0b'; $co='#fff';    $bd='#d97706'; }
          } elseif($cant===0){
              $bg='#f0fdf4'; $co='#1e293b'; $bd='#bbf7d0';
          } elseif($cant===1){
              $bg='#93c5fd'; $co='#1e293b'; $bd='#60a5fa';
          } elseif($cant===2){
              $bg='#fca5a5'; $co='#1e293b'; $bd='#f87171';
          } else {
              $bg='#ef4444'; $co='#ffffff'; $bd='#b91c1c';
          }
      }
    ?>
    <td style="background:<?=$bg?>;color:<?=$co?>;border:1px solid <?=$bd?>;
               text-align:center;min-width:40px;font-size:9px;padding:2px;
               font-weight:<?=($cant>=2||$licMotivo)?'700':'400'?>;letter-spacing:-.2px"
        title="<?=$tip?>">
      <?=$lbl?>
    </td>
    <?php endforeach; ?>
  </tr>
  <?php endforeach; ?>
  <?php endif; ?>
<?php endif; ?>
  </tbody>
</table>
</div>

<script>
// ── Picker Específico ──────────────────────────────────────────────────────
(function(){
  const PEOPLE = <?= json_encode($allPeople, JSON_UNESCAPED_UNICODE) ?>;
  const form   = document.getElementById('ganttForm');
  const search = document.getElementById('specSearch');
  const drop   = document.getElementById('specDrop');
  const chips  = document.getElementById('specChips');
  if (!search || !drop) return;

  // IDs ya seleccionados (chips presentes en el DOM)
  function selectedIds(){
    return Array.from(document.querySelectorAll('input[name="spec[]"]')).map(i=>i.value);
  }

  // Renderizar resultados en el dropdown
  window.specFilter = function(q){
    q = q.toLowerCase().trim();
    drop.style.display = 'block';
    const sel = selectedIds();
    const matches = q ? PEOPLE.filter(p=>p.nombre.toLowerCase().includes(q)||p.tipo.toLowerCase().includes(q)) : PEOPLE;
    if(!matches.length){ drop.innerHTML='<div style="padding:8px 12px;color:#94a3b8">Sin resultados</div>'; return; }
    const grupos = {};
    matches.slice(0,50).forEach(p=>{
      if(!grupos[p.tipo]) grupos[p.tipo]=[];
      grupos[p.tipo].push(p);
    });
    let html='';
    Object.keys(grupos).sort().forEach(tipo=>{
      html+=`<div style="padding:4px 10px;font-size:10px;font-weight:600;color:#64748b;background:#f8fafc;letter-spacing:.04em">${tipo}</div>`;
      grupos[tipo].forEach(p=>{
        const ya = sel.includes(p.id);
        html+=`<div onclick="specAdd('${p.id}','${p.nombre.replace(/'/g,"\\'")}','${p.tipo}')"
                    style="padding:6px 14px;cursor:${ya?'default':'pointer'};
                           background:${ya?'#f1f5f9':'#fff'};color:${ya?'#94a3b8':'#1e293b'};
                           border-bottom:1px solid #f1f5f9"
                    onmouseover="if(!${ya})this.style.background='#eff6ff'"
                    onmouseout="if(!${ya})this.style.background='#fff'">
               ${ya?'✓ ':''}${p.nombre}</div>`;
      });
    });
    drop.innerHTML = html;
  };

  // Agregar persona
  window.specAdd = function(id, nombre, tipo){
    if(selectedIds().includes(id)) return;
    // Hidden input en el form
    const inp = document.createElement('input');
    inp.type='hidden'; inp.name='spec[]'; inp.value=id;
    inp.dataset.specId = id;
    form.appendChild(inp);
    // Chip visible
    const chip = document.createElement('span');
    chip.className='spec-chip';
    chip.dataset.id=id;
    chip.style.cssText='display:inline-flex;align-items:center;gap:4px;background:#dbeafe;border:1px solid #93c5fd;border-radius:12px;padding:2px 8px;font-size:11px;color:#1e40af';
    chip.innerHTML=`<span style="color:#64748b;font-size:10px">${tipo}</span> ${nombre} <button type="button" onclick="specRemove('${id}')" style="border:none;background:none;cursor:pointer;color:#6b7280;font-size:13px;padding:0;line-height:1;margin-left:2px">&times;</button>`;
    // Quitar mensaje placeholder si lo hay
    const placeholder = chips.querySelector('span[style*="italic"]');
    if(placeholder) placeholder.remove();
    chips.appendChild(chip);
    drop.style.display='none';
    search.value='';
  };

  // Quitar persona
  window.specRemove = function(id){
    document.querySelector(`.spec-chip[data-id="${id}"]`)?.remove();
    document.querySelector(`input[name="spec[]"][data-spec-id="${id}"]`)?.remove();
    form.querySelectorAll('input[name="spec[]"]').forEach(i=>{ if(i.value===id && !i.dataset.specId) i.remove(); });
    if(!chips.querySelector('.spec-chip')){
      const pl=document.createElement('span');
      pl.style.cssText='color:#94a3b8;font-size:11px;font-style:italic';
      pl.textContent='Sin personas seleccionadas';
      chips.appendChild(pl);
    }
  };

  // Aplicar selección (submit form)
  search.addEventListener('keydown', e=>{ if(e.key==='Enter'){ e.preventDefault(); form.submit(); } });

  // Cerrar dropdown al hacer clic fuera
  document.addEventListener('click', e=>{
    if(drop && search && !drop.contains(e.target) && e.target!==search) drop.style.display='none';
  });

  // Botón Aplicar dentro del picker
  document.getElementById('specApply')?.addEventListener('click', ()=>form.submit());
})();
</script>

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