<?php
/**
 * fichiers-fragment.php (partage & admin)
 *
 * HTMX fragment: returns the combined Format(s) + Fichiers block.
 * Called on every format checkbox change so the Fichiers fieldset adapts.
 *
 * Fixed inputs (always present in #format-fichiers-block):
 *   1. Image de couverture (optional)
 *   2. Note d'intention (PDF, required unless adminMode)
 *   3. TFE — multi-file upload (required unless adminMode)
 *   4. Annexes checkbox + file input
 *
 * Format-specific extra inputs (separate #format-extras-block so toggling
 * formats does not destroy file queue state):
 *   - Site web   → URL field only
 *   - Vidéo      → PeerTube upload or direct file input
 *   - Audio      → PeerTube upload or direct file input
 *   - (all others: Écriture, Performance, Objet éditorial, Installation, Autre)
 *     → no extra input needed beyond the standard TFE file upload
 *
 * Expected POST:
 *   formats[]       — array of selected format_type IDs
 *   website_url     — current value (repopulation)
 *   website_label   — current value (repopulation)
 *   admin_mode      — '1' for admin context (removes required attrs)
 */

require_once APP_ROOT . '/src/PeerTubeService.php';
$_ptDb = Database::getInstance();
$peerTubeEnabled = PeerTubeService::isEnabled($_ptDb);

$db = $_ptDb->getConnection();

// Load all format types in display order
$allFormats = $db->query('SELECT id, name FROM format_types ORDER BY sort_order, id')
                 ->fetchAll(PDO::FETCH_ASSOC);

// Build name→id map for format logic
$formatIdByName = [];
foreach ($allFormats as $f) {
    $formatIdByName[$f['name']] = (int)$f['id'];
}

$siteWebId = $formatIdByName['Site web'] ?? null;
$videoId   = $formatIdByName['Vidéo']    ?? null;
$audioId   = $formatIdByName['Audio']    ?? null;
$imageId   = $formatIdByName['Image']    ?? null;

$selectedFormats = isset($_POST['formats']) && is_array($_POST['formats'])
    ? array_map('intval', $_POST['formats'])
    : [];

$adminMode = ($_POST['admin_mode'] ?? '0') === '1';
$editMode  = ($_POST['edit_mode'] ?? '0') === '1';

$hasSiteWeb = $siteWebId && in_array($siteWebId, $selectedFormats, true);
$hasVideo   = $videoId   && in_array($videoId,   $selectedFormats, true);
$hasAudio   = $audioId   && in_array($audioId,   $selectedFormats, true);
$hasImage   = $imageId   && in_array($imageId,   $selectedFormats, true);

// Show standard file inputs unless *only* Site web is selected
$hasNonWebFormat = !empty(array_filter(
    $selectedFormats,
    fn($id) => $id !== $siteWebId
));
$showUploadBlock = $hasNonWebFormat || !$hasSiteWeb;

$websiteUrl   = htmlspecialchars($_POST['website_url']   ?? '');
$websiteLabel = htmlspecialchars($_POST['website_label'] ?? '');

$hxPost = $adminMode ? '/admin/fichiers-fragment.php' : '/partage/fichiers-fragment';

$hasAnnexesChecked = !empty($_POST['has_annexes']);
?>
<!-- ═══════════════════ Format(s) + Fichiers (stable) ═══════════════════ -->
<div id="format-fichiers-block">
<input type="hidden" name="admin_mode" value="<?= $adminMode ? '1' : '0' ?>">
<input type="hidden" name="edit_mode" value="<?= $editMode ? '1' : '0' ?>">
<?php if ($editMode && ($_POST['_cover'] ?? null)): ?>
<input type="hidden" name="_cover" value="<?= htmlspecialchars($_POST['_cover']) ?>">
<?php endif; ?>

<!-- ═══════════════════ Format(s) ═══════════════════ -->
<fieldset>
    <legend>Format(s)</legend>
    <div>
        <span class="admin-row-label">Format(s) du TFE :<?= !$adminMode ? ' <span class="asterisk">*</span>' : '' ?></span>
        <fieldset class="admin-checkbox-group"
                  <?= !$adminMode ? 'required aria-required="true"' : '' ?>
                  hx-post="<?= htmlspecialchars($hxPost) ?>"
                  hx-target="#format-extras-block"
                  hx-select="#format-extras-block"
                  hx-trigger="change"
                  hx-include="this, [name='website_url'], [name='admin_mode'], [name='edit_mode'], [name='_cover'], [name='has_annexes']"
                  hx-swap="outerHTML">
            <legend class="sr-only">Format(s) du TFE</legend>
            <ul>
                <?php foreach ($allFormats as $opt): ?>
                <li>
                    <label class="admin-checkbox-label">
                        <input type="checkbox"
                               name="formats[]"
                               value="<?= htmlspecialchars((string)$opt['id']) ?>"
                               <?= in_array((int)$opt['id'], $selectedFormats, true) ? 'checked' : '' ?>>
                        <?= htmlspecialchars($opt['name']) ?>
                    </label>
                </li>
                <?php endforeach; ?>
            </ul>
        </fieldset>
    </div>
</fieldset>

<!-- ═══════════════════ Fichiers ═══════════════════ -->
<fieldset>
    <legend>Fichiers</legend>

    <!-- ── 1. Couverture (always) ── -->
    <div>
    <?php
    $_cover = $_POST['_cover'] ?? null;
    if ($editMode && $_cover): ?>
    <div class="admin-banner-preview">
        <img src="/media?path=<?= urlencode($_cover) ?>"
             alt="Couverture actuelle" style="max-height:180px;">
        <label class="admin-checkbox-label">
            <input type="checkbox" name="remove_cover" value="1"> Supprimer la couverture
        </label>
    </div>
    <?php endif;
    $name     = 'couverture';
    $label    = 'Image de couverture (optionnel) :';
    $accept   = 'image/jpeg,image/png,image/webp';
    $hint     = ($editMode && $_cover)
        ? 'Laisser vide pour conserver la couverture actuelle. JPG, PNG ou WEBP. Max 20 MB.'
        : 'JPG, PNG ou WEBP. Format 4:3 recommandé. Max 20 MB.';
    $required = false;
    $id       = 'couverture';
    include APP_ROOT . '/templates/partials/form/file-field.php';
    unset($_cover);
    ?>
    </div>

    <!-- ── 2. Note d'intention (always) ── -->
    <div>
    <?php
    $name     = 'note_intention';
    $label    = 'Note d\'intention :';
    $accept   = '.pdf';
    $hint     = 'PDF uniquement. Max 100 MB. Si votre fichier est trop lourd, compressez-le avec <a href="https://www.bentopdf.com" target="_blank" rel="noopener">bentopdf.com</a>.';
    $hintRaw  = true;
    $required = !$adminMode;
    $id       = 'note_intention';
    include APP_ROOT . '/templates/partials/form/file-field.php';
    ?>
    </div>

    <!-- ── 3. TFE (always) ── -->
    <div class="admin-form-group admin-files-fieldgroup">
        <label>TFE<?= !$adminMode ? ' <span class="asterisk">*</span>' : '' ?> :</label>
        <div class="admin-file-input">
            <input type="file" id="tfe-files-input"
                   name="files[]" multiple
                   accept=".pdf,.jpg,.jpeg,.png,.gif,.webp"
                   class="tfe-file-picker">
            <small class="admin-file-hint">
                PDF (max 100 MB) · Images (JPG/PNG/GIF/WEBP).
                PDFs trop lourds ? <a href="https://www.bentopdf.com" target="_blank" rel="noopener">https://bentopdf.com/</a>
            </small>
            <ul id="tfe-file-queue" class="tfe-file-queue sortable-list"
                aria-label="Fichiers sélectionnés (réordonnable)"></ul>
            <p id="tfe-file-queue-empty" class="tfe-queue-empty">Aucun fichier sélectionné.</p>
            <small class="admin-file-hint" id="tfe-file-queue-sort-hint" style="display:none;">Glissez-déposez les fichiers pour déterminer l'ordre d'affichage sur la page du TFE.</small>
        </div>
    </div>

    <!-- ── Annexes ── -->
    <div id="annexes-input-block">
        <div class="admin-form-group">
            <label class="admin-checkbox-label">
                <input type="checkbox" name="has_annexes" value="1"
                       <?= $hasAnnexesChecked ? 'checked' : '' ?>
                       hx-post="<?= htmlspecialchars($hxPost) ?>"
                       hx-target="#annexes-input-block"
                       hx-select="#annexes-input-block"
                       hx-trigger="change"
                       hx-include="[name='formats[]'], [name='website_url'], [name='admin_mode'], [name='edit_mode'], [name='_cover'], [name='has_annexes']"
                       hx-swap="outerHTML">
                Ce TFE comporte des annexes
            </label>
        </div>
        <?php if ($hasAnnexesChecked): ?>
        <div>
        <?php
        $name     = 'annexes';
        $label    = 'Annexes :';
        $accept   = '.pdf,.zip,.tar,.gz';
        $hint     = 'PDF ou archives ZIP/TAR. Max 500 MB.';
        $required = false;
        $multiple = true;
        include APP_ROOT . '/templates/partials/form/file-field.php';
        ?>
        </div>
        <?php endif; ?>
    </div>

    <!-- ── Format-specific extras (swappable, inside Fichiers fieldset) ── -->
    <div id="format-extras-block" style="display:flex;flex-direction:column;gap:var(--space-s);">
        <?php if ($hasSiteWeb): ?>
        <div class="admin-form-group">
            <label for="website_url">URL du site<?= !$adminMode ? ' <span class="asterisk">*</span>' : '' ?> :</label>
            <div class="admin-file-input">
                <input type="url" id="website_url" name="website_url"
                       value="<?= $websiteUrl ?>"
                       placeholder="https://mon-tfe.erg.be"
                       <?= !$adminMode ? 'required' : '' ?>>
                <small>Le TFE sera affiché comme un site embarqué sur sa page publique.</small>
            </div>
        </div>
        <?php endif; ?>

        <?php if ($hasVideo): ?>
        <?php if ($peerTubeEnabled): ?>
        <div class="admin-form-group">
            <label for="peertube_video">Fichier vidéo (PeerTube)<?= !$adminMode ? ' <span class="asterisk">*</span>' : '' ?> :</label>
            <div class="admin-file-input">
                <input type="file" id="peertube_video" name="peertube_video"
                       accept="video/mp4,video/webm,video/ogg,video/quicktime,.mp4,.webm,.ogv,.mov"
                       <?= !$adminMode ? 'required' : '' ?>>
                <small>MP4, WebM ou MOV. La vidéo sera hébergée sur PeerTube et intégrée
                comme lecteur embarqué sur la page du TFE. Max 500 MB.</small>
            </div>
        </div>
        <?php else: ?>
        <div class="admin-form-group">
            <label for="tfe-video-upload">Fichier vidéo<?= !$adminMode ? ' <span class="asterisk">*</span>' : '' ?> :</label>
            <div class="admin-file-input">
                <input type="file" id="tfe-video-upload" name="files[]"
                       accept="video/mp4,video/webm,video/ogg,video/quicktime,.mp4,.webm,.ogv,.mov"
                       <?= !$adminMode ? 'required' : '' ?>>
                <small>MP4, WebM ou MOV. Max 500 MB.</small>
            </div>
        </div>
        <?php endif; ?>
        <?php endif; ?>

        <?php if ($hasAudio): ?>
        <?php if ($peerTubeEnabled): ?>
        <div class="admin-form-group">
            <label for="peertube_audio">Fichier audio (PeerTube)<?= !$adminMode ? ' <span class="asterisk">*</span>' : '' ?> :</label>
            <div class="admin-file-input">
                <input type="file" id="peertube_audio" name="peertube_audio"
                       accept="audio/mpeg,audio/ogg,audio/wav,audio/flac,audio/aac,audio/mp4,.mp3,.ogg,.oga,.wav,.flac,.aac,.m4a"
                       <?= !$adminMode ? 'required' : '' ?>>
                <small>MP3, OGG, WAV, FLAC ou AAC. Le fichier sera hébergé sur PeerTube et intégré
                comme lecteur embarqué sur la page du TFE. Max 500 MB.</small>
            </div>
        </div>
        <?php else: ?>
        <div class="admin-form-group">
            <label for="tfe-audio-upload">Fichier audio<?= !$adminMode ? ' <span class="asterisk">*</span>' : '' ?> :</label>
            <div class="admin-file-input">
                <input type="file" id="tfe-audio-upload" name="files[]"
                       accept="audio/mpeg,audio/ogg,audio/wav,audio/flac,audio/aac,audio/mp4,.mp3,.ogg,.oga,.wav,.flac,.aac,.m4a"
                       <?= !$adminMode ? 'required' : '' ?>>
                <small>MP3, OGG, WAV, FLAC ou AAC. Max 500 MB.</small>
            </div>
        </div>
        <?php endif; ?>
        <?php endif; ?>
    </div>

</fieldset><!-- /Fichiers -->

<script>if(window.XamxamInitFileUploads)window.XamxamInitFileUploads()</script>
</div><!-- #format-fichiers-block -->
