<?php
/** MageStock 2.6.109 — Paramètres LDAP / Active Directory, groupes repliés par défaut. */
?>
<section class="card settings-card ldap-settings-card mb-4" id="ldapSettingsSection">
    <div class="card-header settings-section-header">
        <div>
            <h3 class="card-title">
                <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
                    <rect x="3" y="3" width="18" height="6" rx="1"/><rect x="3" y="15" width="18" height="6" rx="1"/>
                    <path d="M7 9v6M17 9v6M12 9v6"/><circle cx="7" cy="6" r=".5" fill="currentColor"/><circle cx="7" cy="18" r=".5" fill="currentColor"/>
                </svg>
                Annuaire LDAP / Active Directory
            </h3>
            <p class="settings-section-desc">Centralisez l’authentification d’entreprise sans stocker les mots de passe des utilisateurs dans MageStock.</p>
        </div>
        <span class="ldap-status-badge is-loading" id="ldapGlobalStatus">Chargement…</span>
    </div>
    <div class="card-body">
        <div class="ldap-security-banner" id="ldapSecurityBanner">
            <strong>Protection anti-verrouillage</strong>
            <span>Un administrateur local actif reste obligatoire. LDAPS ou StartTLS est imposé et le secret du compte technique est chiffré hors des paramètres publics.</span>
        </div>

        <div class="ldap-diagnostics-grid" id="ldapDiagnosticsGrid" aria-live="polite"></div>

        <details class="ldap-config-group">
            <summary>1. Mode d’authentification</summary>
            <div class="ldap-config-body settings-form-grid">
                <div class="form-group mb-0">
                    <label class="form-label" for="ldapName">Nom de la configuration</label>
                    <input class="form-input" id="ldapName" maxlength="120" placeholder="Annuaire principal">
                </div>
                <div class="form-group mb-0">
                    <label class="form-label" for="ldapDirectoryType">Type d’annuaire</label>
                    <select class="form-select" id="ldapDirectoryType">
                        <option value="active_directory">Microsoft Active Directory</option>
                        <option value="openldap">OpenLDAP</option>
                        <option value="freeipa">FreeIPA</option>
                        <option value="generic">LDAP générique</option>
                    </select>
                </div>
                <div class="form-group mb-0">
                    <label class="form-label" for="ldapMode">Mode de connexion</label>
                    <select class="form-select" id="ldapMode">
                        <option value="local">Désactivé — comptes locaux uniquement</option>
                        <option value="hybrid">Hybride — comptes locaux et LDAP</option>
                        <option value="ldap_priority">LDAP prioritaire — secours admin local uniquement</option>
                    </select>
                    <span class="form-hint">Le mode prioritaire nécessite un test complet réussi depuis moins de 24 heures.</span>
                </div>
                <label class="ldap-toggle-row">
                    <input type="checkbox" id="ldapEnabled">
                    <span><strong>Activer la configuration LDAP</strong><small>L’activation est refusée tant que les contrôles de sécurité ne sont pas validés.</small></span>
                </label>
                <label class="ldap-toggle-row">
                    <input type="checkbox" id="ldapLocalFallback" checked>
                    <span><strong>Conserver l’administrateur local de secours</strong><small>Obligatoire en mode LDAP prioritaire.</small></span>
                </label>
            </div>
        </details>

        <details class="ldap-config-group">
            <summary>2. Serveurs et chiffrement</summary>
            <div class="ldap-config-body">
                <div class="ldap-server-grid">
                    <fieldset class="ldap-server-card">
                        <legend>Serveur principal</legend>
                        <label>Hôte<input class="form-input" id="ldapHost1" placeholder="dc01.exemple.local"></label>
                        <label>Port<input class="form-input" id="ldapPort1" type="number" min="1" max="65535" value="636"></label>
                        <label>Transport<select class="form-select" id="ldapEncryption1"><option value="ldaps">LDAPS</option><option value="starttls">LDAP + StartTLS</option></select></label>
                        <label>Délai (s)<input class="form-input" id="ldapTimeout1" type="number" min="2" max="20" value="5"></label>
                    </fieldset>
                    <fieldset class="ldap-server-card">
                        <legend>Serveur secondaire</legend>
                        <label>Hôte<input class="form-input" id="ldapHost2" placeholder="dc02.exemple.local"></label>
                        <label>Port<input class="form-input" id="ldapPort2" type="number" min="1" max="65535" value="636"></label>
                        <label>Transport<select class="form-select" id="ldapEncryption2"><option value="ldaps">LDAPS</option><option value="starttls">LDAP + StartTLS</option></select></label>
                        <label>Délai (s)<input class="form-input" id="ldapTimeout2" type="number" min="2" max="20" value="5"></label>
                    </fieldset>
                </div>
                <div class="ldap-inline-options">
                    <label class="ldap-toggle-row"><input type="checkbox" id="ldapVerifyCertificate" checked><span><strong>Vérifier strictement le certificat TLS</strong><small>Recommandé et activé par défaut.</small></span></label>
                    <label class="ldap-toggle-row"><input type="checkbox" id="ldapReferrals"><span><strong>Autoriser les referrals LDAP</strong><small>Désactivé par défaut pour limiter les redirections imprévues.</small></span></label>
                </div>
                <div class="ldap-secret-grid">
                    <div class="ldap-secret-card">
                        <div><strong>Certificat d’autorité privé</strong><span id="ldapCertificateState">Non configuré</span></div>
                        <textarea class="form-input" id="ldapCertificatePem" rows="4" placeholder="-----BEGIN CERTIFICATE-----&#10;...&#10;-----END CERTIFICATE-----"></textarea>
                        <div class="ldap-actions-row"><button class="btn btn-secondary" type="button" id="ldapSaveCertificate">Enregistrer le certificat</button><button class="btn btn-ghost text-danger" type="button" id="ldapDeleteCertificate">Supprimer</button></div>
                    </div>
                </div>
            </div>
        </details>

        <details class="ldap-config-group">
            <summary>3. Compte technique et recherche utilisateurs</summary>
            <div class="ldap-config-body">
                <div class="settings-form-grid">
                    <div class="form-group mb-0"><label class="form-label" for="ldapBaseDn">Base DN</label><input class="form-input" id="ldapBaseDn" placeholder="DC=exemple,DC=local"></div>
                    <div class="form-group mb-0"><label class="form-label" for="ldapBindDn">Bind DN du compte technique</label><input class="form-input" id="ldapBindDn" placeholder="CN=svc-magestock,OU=Services,DC=exemple,DC=local"></div>
                    <div class="form-group mb-0"><label class="form-label" for="ldapUserBaseDn">Base utilisateurs</label><input class="form-input" id="ldapUserBaseDn" placeholder="OU=Utilisateurs,DC=exemple,DC=local"></div>
                    <div class="form-group mb-0"><label class="form-label" for="ldapUserFilter">Filtre utilisateur</label><input class="form-input ldap-mono" id="ldapUserFilter" placeholder="(&(objectClass=user)(sAMAccountName={login}))"><span class="form-hint">Le placeholder <code>{login}</code> est obligatoire et échappé côté serveur.</span></div>
                </div>
                <label class="ldap-toggle-row"><input type="checkbox" id="ldapAnonymousBind"><span><strong>Autoriser un bind anonyme</strong><small>À utiliser uniquement si l’annuaire l’impose explicitement.</small></span></label>
                <div class="ldap-secret-card">
                    <div><strong>Mot de passe du compte technique</strong><span id="ldapSecretState">Non configuré</span></div>
                    <input class="form-input" id="ldapBindSecret" type="password" autocomplete="new-password" placeholder="Laisser vide pour conserver le secret existant">
                    <div class="ldap-actions-row"><button class="btn btn-secondary" type="button" id="ldapSaveSecret">Enregistrer le secret chiffré</button><button class="btn btn-ghost text-danger" type="button" id="ldapDeleteSecret">Supprimer</button></div>
                </div>
            </div>
        </details>

        <details class="ldap-config-group">
            <summary>4. Attributs, groupes et synchronisation</summary>
            <div class="ldap-config-body">
                <div class="ldap-attributes-grid">
                    <label>Identifiant<input class="form-input" id="ldapLoginAttribute"></label>
                    <label>Identifiant stable<input class="form-input" id="ldapStableIdAttribute"></label>
                    <label>Nom affiché<input class="form-input" id="ldapDisplayNameAttribute"></label>
                    <label>Prénom<input class="form-input" id="ldapFirstNameAttribute"></label>
                    <label>Nom<input class="form-input" id="ldapLastNameAttribute"></label>
                    <label>E-mail<input class="form-input" id="ldapEmailAttribute"></label>
                    <label>Appartenance groupes<input class="form-input" id="ldapMemberOfAttribute"></label>
                    <label>Compte désactivé<input class="form-input" id="ldapDisabledAttribute"></label>
                    <label>Valeurs de désactivation<input class="form-input" id="ldapDisabledValues" placeholder="true, yes, locked"><span class="form-hint">Séparées par des virgules ; Active Directory utilise automatiquement le bit ACCOUNTDISABLE.</span></label>
                </div>
                <div class="settings-form-grid ldap-group-search-grid">
                    <div class="form-group mb-0"><label class="form-label" for="ldapGroupBaseDn">Base groupes</label><input class="form-input" id="ldapGroupBaseDn" placeholder="OU=Groupes,DC=exemple,DC=local"></div>
                    <div class="form-group mb-0"><label class="form-label" for="ldapGroupFilter">Filtre groupes</label><input class="form-input ldap-mono" id="ldapGroupFilter" placeholder="(&(objectClass=group)(member={dn}))"></div>
                </div>
                <div class="ldap-inline-options">
                    <label class="ldap-toggle-row"><input type="checkbox" id="ldapNestedGroups"><span><strong>Résoudre les groupes imbriqués</strong><small>Active la règle Active Directory dédiée lorsque disponible.</small></span></label>
                    <label class="ldap-toggle-row"><input type="checkbox" id="ldapDenyUnmapped" checked><span><strong>Refuser les utilisateurs sans groupe associé</strong><small>Évite qu’un compte non prévu obtienne un accès par défaut.</small></span></label>
                    <label class="ldap-toggle-row"><input type="checkbox" id="ldapSyncOnLogin" checked><span><strong>Synchroniser le profil à chaque connexion</strong><small>Actualise rôle, groupes et magasins.</small></span></label>
                    <label class="ldap-toggle-row"><input type="checkbox" id="ldapDisableMissing"><span><strong>Désactiver les comptes absents de l’annuaire</strong><small>Appliqué lors d’une synchronisation manuelle ou planifiée ; les historiques métier sont conservés.</small></span></label>
                </div>
                <div class="ldap-mapping-head"><div><strong>Correspondance groupes → droits MageStock</strong><p>Le groupe peut être saisi comme DN complet, nom CN ou motif avec <code>*</code>.</p></div><button class="btn btn-secondary" type="button" id="ldapAddMapping">Ajouter un groupe</button></div>
                <div id="ldapGroupMappings" class="ldap-mappings"></div>
            </div>
        </details>

        <details class="ldap-config-group">
            <summary>5. Enregistrement et diagnostics</summary>
            <div class="ldap-config-body">
                <div class="ldap-test-credentials">
                    <div class="form-group mb-0"><label class="form-label" for="ldapTestUsername">Utilisateur de test</label><input class="form-input" id="ldapTestUsername" autocomplete="username"></div>
                    <div class="form-group mb-0"><label class="form-label" for="ldapTestPassword">Mot de passe de test</label><input class="form-input" id="ldapTestPassword" type="password" autocomplete="current-password"><span class="form-hint">Utilisé uniquement pour le test courant, jamais enregistré.</span></div>
                </div>
                <div class="ldap-primary-actions">
                    <button class="btn btn-primary" type="button" id="ldapSaveConfig">Enregistrer la configuration</button>
                    <button class="btn btn-secondary" type="button" id="ldapTestConnection">Tester le serveur</button>
                    <button class="btn btn-secondary" type="button" id="ldapTestBind">Tester le compte technique</button>
                    <button class="btn btn-secondary" type="button" id="ldapTestSearch">Tester la recherche</button>
                    <button class="btn btn-secondary" type="button" id="ldapSimulate">Simuler les droits</button>
                    <button class="btn btn-success" type="button" id="ldapTestAuthentication">Test complet d’authentification</button>
                    <button class="btn btn-ghost" type="button" id="ldapSyncKnownUsers">Synchroniser les comptes LDAP connus</button>
                    <button class="btn btn-ghost" type="button" id="ldapLoadAudit">Afficher le journal LDAP</button>
                </div>
                <div class="ldap-priority-confirm" id="ldapPriorityConfirm" hidden>
                    <label class="form-label" for="ldapPriorityPhrase">Confirmation du mode LDAP prioritaire</label>
                    <input class="form-input" id="ldapPriorityPhrase" placeholder="LDAP PRIORITAIRE" autocomplete="off">
                </div>
                <pre class="ldap-test-result" id="ldapTestResult" aria-live="polite">Aucun test exécuté.</pre>
            </div>
        </details>
    </div>
</section>
