<?php
/**
 * Partial: répertoire index columns.
 * Rendered both on full page load and as HTMX partial swap.
 *
 * Expected variables:
 *   $repData       array  output of Database::getRepertoireFilterData()
 *   $activeFilters array{years:int[], ap:string[], or:string[], fi:string[], kw:string[]}
 */

$activeSets = [
    'years' => array_map('strval', $activeFilters['years'] ?? []),
    'ap'    => $activeFilters['ap'] ?? [],
    'or'    => $activeFilters['or'] ?? [],
    'fi'    => $activeFilters['fi'] ?? [],
    'kw'    => $activeFilters['kw'] ?? [],
];

// ── Students ────────────────────────────────────────────────────────────────
$studentWorks = [];
foreach ($repData['students'] as $s) {
    if (empty($s['authors'])) continue;
    foreach (explode(',', $s['authors']) as $name) {
        $name = trim($name);
        if ($name === '') continue;
        $studentWorks[$name][] = (int)$s['id'];
    }
}
ksort($studentWorks);

// ── Shared helpers ──────────────────────────────────────────────────────────

function repToggleUrl(array $sets, string $dim, string $value): string {
    if (in_array($value, $sets[$dim], true)) {
        $sets[$dim] = array_values(array_filter($sets[$dim], fn($v) => $v !== $value));
    } else {
        $sets[$dim][] = $value;
    }
    $params = [];
    foreach ($sets['years'] as $v) $params[] = 'fy[]=' . urlencode((string)$v);
    foreach ($sets['ap']    as $v) $params[] = 'ap[]=' . urlencode($v);
    foreach ($sets['or']    as $v) $params[] = 'or[]=' . urlencode($v);
    foreach ($sets['fi']    as $v) $params[] = 'fi[]=' . urlencode($v);
    foreach ($sets['kw']    as $v) $params[] = 'kw[]=' . urlencode($v);
    $qs = implode('&', $params);
    return '/repertoire' . ($qs ? '?' . $qs : '');
}

function repFilterEntry(
    array $item,
    string $dim,
    array $activeSets,
    bool $anyActive,
    bool $colHasMatch,
    string $hx,
): void {
    $val      = (string)$item['value'];
    $isActive = in_array($val, $activeSets[$dim], true);
    $isFaded  = $anyActive && $colHasMatch && !$item['matched'] && !$isActive;
    $cls      = 'rep-entry'
              . ($isActive ? ' rep-entry--selected' : '')
              . ($isFaded  ? ' rep-entry--faded'    : '');
    $url      = repToggleUrl($activeSets, $dim, $val);
?>
            <li>
                <button type="button" class="<?= $cls ?>"
                        aria-pressed="<?= $isActive ? 'true' : 'false' ?>"
                        <?= $isFaded ? 'disabled' : "hx-get=\"" . htmlspecialchars($url) . "\" $hx" ?>>
                    <?= htmlspecialchars($val) ?>
                </button>
            </li>
<?php
}

// ── Column definitions ──────────────────────────────────────────────────────
$hx = 'hx-target="#repertoire-index" hx-swap="outerHTML" hx-push-url="true" hx-indicator="#rep-indicator"';

$anyActive = !empty($activeSets['years']) || !empty($activeSets['ap'])
          || !empty($activeSets['or'])    || !empty($activeSets['fi'])
          || !empty($activeSets['kw']);

$filterColumns = [
    ['dataKey' => 'years',          'dim' => 'years', 'heading' => 'Années'],
    ['dataKey' => 'ap_programs',    'dim' => 'ap',    'heading' => 'Ateliers Pluridisciplinaires'],
    ['dataKey' => 'orientations',   'dim' => 'or',    'heading' => 'Orientations'],
    ['dataKey' => 'finality_types', 'dim' => 'fi',    'heading' => 'Finalité du Master'],
    ['dataKey' => 'keywords',       'dim' => 'kw',    'heading' => 'Mots-clés'],
];

$colHasMatches = [];
foreach ($filterColumns as $col) {
    $colHasMatches[$col['dim']] = !empty(array_filter(
        $repData[$col['dataKey']],
        fn($i) => $i['matched']
    ));
}
?>
<div id="repertoire-index" class="repertoire-index">

<?php
// Render filter columns in the correct left-to-right order.
// Students column (non-filter) is inserted between keywords and AP/or/fi/years.
$renderOrder = ['years', 'ap', 'or', 'fi', 'students', 'kw'];

foreach ($renderOrder as $colKey):
    if ($colKey === 'students'): ?>
    <!-- ÉTUDIANTES -->
    <section class="repertoire-col" data-col="students">
        <h2>Étudiantes</h2>
        <ul>
        <?php if (empty($studentWorks)): ?>
            <li class="rep-empty">—</li>
        <?php else: ?>
            <?php foreach ($studentWorks as $name => $ids): ?>
            <?php
                $firstId    = $ids[0];
                $targetUrl  = count($ids) === 1 ? '/tfe?id=' . $firstId : '#';
                $previewUrl = '/repertoire/student-preview?name=' . urlencode($name);
            ?>
            <li class="student-entry">
                <a href="<?= htmlspecialchars($targetUrl) ?>"
                   class="rep-entry rep-entry--link"
                   data-student-name="<?= htmlspecialchars($name) ?>"
                   hx-get="<?= htmlspecialchars($previewUrl) ?>"
                   hx-target="#student-popover"
                   hx-trigger="mouseenter"
                   hx-swap="innerHTML">
                    <?= htmlspecialchars($name) ?>
                </a>
            </li>
            <?php endforeach; ?>
        <?php endif; ?>
        </ul>
    </section>
<?php else:
        $col = array_values(array_filter($filterColumns, fn($c) => $c['dim'] === $colKey))[0]; ?>
    <section class="repertoire-col" data-col="<?= $col['dim'] ?>">
        <h2><?= htmlspecialchars($col['heading']) ?></h2>
        <ul>
<?php   foreach ($repData[$col['dataKey']] as $item):
            repFilterEntry($item, $col['dim'], $activeSets, $anyActive, $colHasMatches[$col['dim']], $hx);
        endforeach; ?>
        </ul>
    </section>
<?php endif;
endforeach; ?>

</div>
