<?php
/**
 * Projet                    : MageStock
 * Logiciel                  : MageStock
 * Fichier                   : views/update.php
 * Rôle du fichier           : Centre administrateur guidé de mise à jour, maintenance et récupération
 * Auteur                    : Régis KREMER
 * Version du fichier        : 2.6.124
 * Version générale MageStock: 2.6.124
 * Lot                       : MAGESTOCK UPDATE CENTER INSTALLER PROXY RESPONSIVE RELEASE FINAL1
 * Base cumulative requise   : MageStock 2.6.123
 * Date de création          : 2026-07-21
 * Date de modification      : 2026-07-30
 * Dépendances               : includes/update-helper.php, includes/update-discovery.php, assets/js/pages/update.js, assets/css/update.css
 * Données persistantes      : état et historique du moteur UPDATE via l'API dédiée
 * Permissions requises      : Administrateur et update.manage
 * Contraintes de sécurité   : paquet signé obligatoire, aucune installation automatique, confirmation explicite, aucune URL arbitraire
 * Compatibilité             : ordinateur, smartphone, tablette ; thèmes clair et sombre
 *
 * Résumé des modifications :
 * - transforme l'écran en centre de maintenance guidé avec progression et état de sécurité lisibles ;
 * - priorise le parcours officiel MageKorp Hub puis l'import hors-ligne sans masquer les fonctions de récupération ;
 * - renforce l'accessibilité tactile, les états live et la lisibilité responsive ;
 * - conserve tous les contrats DOM/API du moteur UPDATE existant.
 *
 * Historique :
 * - 2.6.110 — centre de mise à jour signé avec précontrôle.
 * - 2.6.117 — moteur de rollup cumulatif.
 * - 2.6.118 — découverte distante signée MageKorp Hub.
 * - 2.6.124 — refonte complète du centre de mise à jour et parcours de maintenance guidé.
 */
$status = magestockUpdateStatus();
$state = $status['state'] ?? [];
?>
<div class="update-page" id="pgUpdate">
    <section class="update-hero" aria-labelledby="updatePageTitle">
        <div class="update-hero-copy">
            <span class="update-kicker" data-i18n="update.kicker">Administration système</span>
            <h1 id="updatePageTitle" data-i18n="update.title">Mises à jour MageStock</h1>
            <p data-i18n="update.subtitle">Recherchez une version officielle, téléchargez son paquet signé, puis confirmez séparément son installation.</p>
        </div>
        <div class="update-version-panel" aria-label="Versions MageStock">
            <div><span data-i18n="update.installed_version">Version installée</span><strong id="updInstalledVersion"><?= htmlspecialchars((string)($state['installedVersion'] ?? '—')) ?></strong></div>
            <div><span data-i18n="update.code_version">Version du code</span><strong><?= htmlspecialchars(APP_VER) ?></strong></div>
            <div class="update-version-health"><span>État</span><strong id="updOverallStatus">—</strong></div>
        </div>
    </section>

    <div class="update-alert" id="updMainAlert" role="status" aria-live="polite" aria-atomic="true"></div>

    <nav class="update-flow" aria-label="Progression de la mise à jour">
        <div class="update-flow-step" id="updFlowSearch" data-step="1"><span>1</span><div><strong>Rechercher</strong><small>Version officielle</small></div></div>
        <div class="update-flow-step" id="updFlowVerify" data-step="2"><span>2</span><div><strong>Vérifier</strong><small>Signature et compatibilité</small></div></div>
        <div class="update-flow-step" id="updFlowBackup" data-step="3"><span>3</span><div><strong>Sauvegarder</strong><small>Point de restauration</small></div></div>
        <div class="update-flow-step" id="updFlowInstall" data-step="4"><span>4</span><div><strong>Installer</strong><small>Contrôle de santé</small></div></div>
    </nav>

    <section class="update-workspace">
        <div class="update-main-column">
            <section class="update-card update-primary-card" aria-labelledby="updDiscoveryTitle">
                <div class="update-card-head">
                    <div>
                        <span class="update-kicker" data-i18n="update.discovery.kicker">Catalogue officiel</span>
                        <h2 id="updDiscoveryTitle" data-i18n="update.discovery.title">Rechercher une mise à jour sur MageKorp Hub</h2>
                        <p data-i18n="update.discovery.description">MageStock consulte uniquement le domaine officiel en HTTPS, vérifie le manifeste Ed25519 et ne transmet aucune donnée métier.</p>
                    </div>
                    <span class="update-discovery-status neutral" id="updDiscoveryStatus" data-i18n="update.discovery.never_checked">Pas encore vérifié</span>
                </div>

                <div class="update-primary-action">
                    <div class="update-primary-action-copy">
                        <strong>Canal stable officiel</strong>
                        <span>Recherche, téléchargement et validation du paquet compatible avec votre installation.</span>
                    </div>
                    <button class="btn btn-primary update-main-button" id="updDiscover" type="button" data-i18n="update.discovery.search">Rechercher les mises à jour</button>
                </div>

                <div class="update-discovery-result" id="updDiscoveryResult" hidden></div>
                <div class="update-discovery-actions" id="updDiscoveryActions" hidden>
                    <a class="btn btn-secondary" id="updReleaseNotes" href="#" target="_blank" rel="noopener noreferrer" hidden data-i18n="update.discovery.release_notes">Voir les changements</a>
                    <button class="btn btn-primary" id="updDownloadRemote" type="button" data-i18n="update.discovery.download">Télécharger et analyser</button>
                </div>
                <p class="update-privacy-note" data-i18n="update.discovery.privacy">Aucun utilisateur, produit, stock, magasin, réglage LDAP, secret ou identifiant d’installation n’est envoyé.</p>
            </section>

            <section class="update-card update-package-card" id="updPackageCard" hidden aria-labelledby="updPackageTitle">
                <div class="update-package-heading">
                    <div>
                        <span class="update-kicker" data-i18n="update.package.kicker">Paquet prêt</span>
                        <h2 id="updPackageTitle" data-i18n="update.package.title">Analyse du paquet officiel</h2>
                    </div>
                    <span class="update-package-source" id="updPackageSource"></span>
                </div>
                <div id="updAnalysis" class="update-analysis"></div>
                <div class="update-package-actions">
                    <button class="btn btn-secondary" id="updPreflight" type="button" hidden data-i18n="update.package.recheck">Revérifier les permissions</button>
                    <button class="btn btn-success update-install-button" id="updApply" type="button" hidden data-i18n="update.package.install">Installer la mise à jour</button>
                </div>
                <p class="update-confirmation-note" data-i18n="update.package.confirmation">L’installation ne démarre jamais automatiquement. Une confirmation administrateur reste obligatoire.</p>
            </section>

            <details class="update-card update-manual-card">
                <summary>
                    <span><strong data-i18n="update.manual.title">Importer manuellement une mise à jour</strong><small data-i18n="update.manual.description">Conservez cette méthode lorsque le serveur n’a pas d’accès Internet sortant. Le ZIP subit exactement les mêmes contrôles.</small></span>
                    <span class="update-summary-chevron" aria-hidden="true">⌄</span>
                </summary>
                <div class="update-details-body">
                    <form id="updUploadForm" enctype="multipart/form-data">
                        <label class="update-drop" for="updPackage">
                            <span class="update-file-symbol" aria-hidden="true">ZIP</span>
                            <span class="update-drop-copy"><strong data-i18n="update.manual.select">Sélectionner un ZIP officiel</strong><small id="updSelectedFile" data-i18n="update.manual.limit">128 Mo maximum</small></span>
                            <input type="file" id="updPackage" name="package" accept=".zip,application/zip" required>
                        </label>
                        <button class="btn btn-primary" id="updUploadSubmit" type="submit" data-i18n="update.manual.analyze">Analyser le paquet</button>
                    </form>
                </div>
            </details>
        </div>

        <aside class="update-side-column" aria-label="État et maintenance">
            <section class="update-card update-security-card">
                <div class="update-card-head compact">
                    <div><span class="update-kicker">Confiance</span><h2>État & sécurité</h2></div>
                    <span class="update-security-dot" aria-hidden="true"></span>
                </div>
                <dl class="update-state-list">
                    <div><dt data-i18n="update.system.status">État</dt><dd id="updStatus">—</dd></div>
                    <div><dt data-i18n="update.system.target">Cible</dt><dd id="updTarget">—</dd></div>
                    <div><dt data-i18n="update.system.method">Méthode</dt><dd id="updMethod">—</dd></div>
                    <div><dt data-i18n="update.system.package_mode">Mode du paquet</dt><dd id="updPackageMode">—</dd></div>
                    <div><dt>Signature</dt><dd id="updTrustState">Ed25519</dd></div>
                    <div><dt>Moteur</dt><dd id="updEngineState">Prêt</dd></div>
                    <div><dt data-i18n="update.system.last_operation">Dernière opération</dt><dd id="updLastDate">—</dd></div>
                </dl>
                <button class="btn btn-secondary update-full-button" id="updIntegrity" type="button" data-i18n="update.system.integrity">Vérifier l’intégrité</button>
            </section>

            <section class="update-card update-recovery-card" id="updRecoveryCard">
                <span class="update-kicker">Maintenance</span>
                <h2>Reprise et restauration</h2>
                <p>Ces actions apparaissent uniquement lorsqu’une mise à jour nécessite une intervention administrateur.</p>
                <div class="update-recovery-actions">
                    <button class="btn btn-primary" id="updFinalizeManual" type="button" hidden data-i18n="update.system.finalize_manual">Finaliser le dépôt manuel</button>
                    <button class="btn btn-primary" id="updResume" type="button" hidden data-i18n="update.system.resume">Reprendre</button>
                    <button class="btn btn-danger" id="updRollback" type="button" hidden data-i18n="update.system.rollback">Restaurer</button>
                    <span class="update-recovery-idle" id="updRecoveryIdle">Aucune action de récupération nécessaire.</span>
                </div>
            </section>
        </aside>
    </section>

    <details class="update-card update-rollup-card">
        <summary>
            <span><strong data-i18n="update.rollup.title">Une installation ancienne peut rejoindre la cible sans poser chaque version intermédiaire</strong><small data-i18n="update.rollup.kicker">Moteur cumulatif actif</small></span>
            <span class="update-summary-chevron" aria-hidden="true">⌄</span>
        </summary>
        <div class="update-details-body update-rollup-body">
            <p data-i18n="update.rollup.description">MageKorp sélectionne le paquet direct ou cumulatif compatible avec la version installée. Le moteur MageStock revérifie ensuite sa signature interne, ses fichiers, les migrations et les permissions.</p>
            <ol class="update-rollup-steps">
                <li><strong data-i18n="update.rollup.direct">Rollup direct</strong><span data-i18n="update.rollup.direct_desc">Une source historique précise rejoint la cible en un paquet.</span></li>
                <li><strong data-i18n="update.rollup.cumulative">Cumulatif</strong><span data-i18n="update.rollup.cumulative_desc">Une plage de versions sources rejoint la même cible.</span></li>
                <li><strong data-i18n="update.rollup.bridge">Pont</strong><span data-i18n="update.rollup.bridge_desc">Un socle intermédiaire reste possible pour une structure trop ancienne.</span></li>
            </ol>
            <p class="update-rollup-note" data-i18n="update.rollup.note">La découverte distante, le téléchargement et l’analyse sont automatisés. L’installation, elle, reste toujours manuelle et confirmée.</p>
        </div>
    </details>

    <section class="update-card update-history-card">
        <div class="update-history-heading"><div><span class="update-kicker">Traçabilité</span><h2 data-i18n="update.history.title">Historique</h2></div><span id="updHistoryCount" class="update-history-count">0</span></div>
        <div id="updHistory" class="update-history"><p class="text-muted" data-i18n="update.loading">Chargement…</p></div>
    </section>
</div>
