<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>AutoTech Panel</title>
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700;900&display=swap" rel="stylesheet">
<style>
*{margin:0;padding:0;box-sizing:border-box}
:root{--bg:#07090f;--card:#0f1520;--card2:#151e2e;--border:#1a2740;--accent:#e8a020;--blue:#3b7ff5;--green:#16c784;--red:#ef4343;--purple:#a855f7;--text:#eef2f8;--muted:#556070}
body{font-family:'Outfit',sans-serif;background:var(--bg);color:var(--text);min-height:100vh;overflow-x:hidden}
body::after{content:'';position:fixed;inset:0;background:radial-gradient(ellipse 80% 50% at 50% -10%,rgba(232,160,32,.07),transparent);pointer-events:none;z-index:0}
.hidden{display:none!important}
input,button,select{font-family:'Outfit',sans-serif;outline:none}
input,select{background:var(--card2);border:1px solid var(--border);border-radius:9px;padding:10px 14px;color:var(--text);font-size:14px;width:100%;transition:.2s}
input:focus,select:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(232,160,32,.12)}
.btn{border:none;border-radius:9px;padding:10px 20px;font-family:'Outfit',sans-serif;font-size:14px;font-weight:600;cursor:pointer;transition:.15s;display:inline-flex;align-items:center;gap:6px}
.btn:hover{transform:translateY(-1px);opacity:.92}
.btn-gold{background:linear-gradient(135deg,var(--accent),#c4830f);color:#000;box-shadow:0 3px 14px rgba(232,160,32,.3)}
.btn-blue{background:linear-gradient(135deg,var(--blue),#1d5fd4);color:#fff}
.btn-green{background:linear-gradient(135deg,var(--green),#0da06a);color:#000}
.btn-red{background:rgba(239,67,67,.15);border:1px solid rgba(239,67,67,.3);color:var(--red)}
.btn-ghost{background:rgba(255,255,255,.05);border:1px solid var(--border);color:var(--muted)}
.btn-ghost:hover{color:var(--text)}
.btn-sm{padding:6px 12px;font-size:12px;border-radius:7px}
/* LOGIN */
#login{position:fixed;inset:0;z-index:200;display:flex;align-items:center;justify-content:center;background:var(--bg)}
.login-box{background:var(--card);border:1px solid var(--border);border-radius:24px;padding:48px 40px;width:100%;max-width:420px;box-shadow:0 40px 100px rgba(0,0,0,.7);position:relative;z-index:1;animation:up .5s ease}
@keyframes up{from{opacity:0;transform:translateY(24px)}to{opacity:1;transform:translateY(0)}}
.login-icon{width:70px;height:70px;background:linear-gradient(135deg,var(--accent),#c4830f);border-radius:20px;display:inline-flex;align-items:center;justify-content:center;font-size:30px;margin-bottom:16px;box-shadow:0 8px 28px rgba(232,160,32,.4)}
.fg{margin-bottom:16px}
.fg label{display:block;font-size:12px;color:var(--muted);font-weight:600;margin-bottom:7px;letter-spacing:.5px;text-transform:uppercase}
.err-box{background:rgba(239,67,67,.1);border:1px solid rgba(239,67,67,.3);border-radius:9px;padding:10px 14px;color:#f87171;font-size:13px;text-align:center;margin-top:12px}
/* HEADER */
header{position:sticky;top:0;z-index:50;background:rgba(7,9,15,.92);backdrop-filter:blur(16px);border-bottom:1px solid var(--border);padding:12px 28px;display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
.hbrand{display:flex;align-items:center;gap:12px}
.hicon{width:40px;height:40px;background:linear-gradient(135deg,var(--accent),#c4830f);border-radius:11px;display:flex;align-items:center;justify-content:center;font-size:18px}
.htitle{font-size:17px;font-weight:800}
.hsub{font-size:11px;color:var(--muted)}
.hright{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.badge{border-radius:8px;padding:5px 13px;font-size:12px;font-weight:700}
.badge-gold{background:rgba(232,160,32,.12);border:1px solid rgba(232,160,32,.3);color:var(--accent)}
.badge-blue{background:rgba(59,127,245,.12);border:1px solid rgba(59,127,245,.3);color:var(--blue)}
/* TABS */
.tabs-bar{padding:18px 28px 0}
.tabs{display:inline-flex;gap:2px;background:var(--card);border:1px solid var(--border);border-radius:12px;padding:4px}
.tab{padding:9px 20px;border:none;border-radius:9px;background:transparent;color:var(--muted);font-family:'Outfit',sans-serif;font-size:13px;font-weight:600;cursor:pointer;transition:.2s}
.tab.active{background:var(--card2);color:var(--text);box-shadow:0 2px 8px rgba(0,0,0,.4)}
/* MAIN */
main{max-width:1200px;margin:0 auto;padding:28px 28px 80px;position:relative;z-index:1}
/* STATS */
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:14px;margin-bottom:30px}
.stat{background:var(--card);border:1px solid var(--border);border-radius:16px;padding:20px 22px;position:relative;overflow:hidden}
.stat::before{content:'';position:absolute;top:0;left:0;right:0;height:2px}
.stat-gold::before{background:linear-gradient(90deg,var(--accent),transparent)}
.stat-blue::before{background:linear-gradient(90deg,var(--blue),transparent)}
.stat-green::before{background:linear-gradient(90deg,var(--green),transparent)}
.stat-purple::before{background:linear-gradient(90deg,var(--purple),transparent)}
.stat-n{font-size:30px;font-weight:900}
.stat-l{font-size:12px;color:var(--muted);margin-top:4px}
.stat-gold .stat-n{color:var(--accent)}
.stat-blue .stat-n{color:var(--blue)}
.stat-green .stat-n{color:var(--green)}
.stat-purple .stat-n{color:var(--purple)}
.sec-hd{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:20px;flex-wrap:wrap;gap:12px}
.sec-title{font-size:20px;font-weight:800}
.sec-sub{color:var(--muted);font-size:13px;margin-top:3px}
/* TABLE */
.tbl-wrap{background:var(--card);border:1px solid var(--border);border-radius:18px;overflow:hidden;margin-bottom:24px}
.tbl-head{padding:16px 20px;border-bottom:1px solid var(--border);display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
table{width:100%;border-collapse:collapse}
th{padding:11px 16px;font-size:11px;font-weight:700;color:var(--muted);text-align:left;border-bottom:1px solid var(--border);letter-spacing:.6px;text-transform:uppercase;white-space:nowrap}
td{padding:12px 16px;font-size:13px;border-bottom:1px solid rgba(26,39,64,.5);vertical-align:middle}
tr:last-child td{border-bottom:none}
tr:hover td{background:rgba(255,255,255,.012)}
.sdot{width:7px;height:7px;border-radius:50%;display:inline-block;margin-right:6px;vertical-align:middle}
.dg{background:var(--green);box-shadow:0 0 6px var(--green)}
.dr{background:var(--red)}
.dy{background:var(--accent);box-shadow:0 0 6px var(--accent)}
.chips{display:flex;flex-wrap:wrap;gap:4px;max-width:280px}
.chip{font-size:10px;padding:2px 8px;border-radius:20px;font-weight:700;white-space:nowrap}
/* MODAL */
.modal-bg{position:fixed;inset:0;background:rgba(0,0,0,.75);z-index:100;display:flex;align-items:center;justify-content:center;padding:16px;backdrop-filter:blur(6px)}
.modal{background:var(--card);border:1px solid var(--border);border-radius:22px;padding:34px;width:100%;max-width:600px;max-height:92vh;overflow-y:auto;animation:up .3s ease;position:relative}
.modal-close{position:absolute;top:16px;right:16px;background:rgba(255,255,255,.06);border:1px solid var(--border);border-radius:8px;width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--muted);font-size:16px}
.modal-close:hover{color:var(--text)}
.modal h2{font-size:20px;font-weight:800;margin-bottom:24px;padding-right:40px}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.prog-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:10px;max-height:240px;overflow-y:auto}
.prog-check{display:flex;align-items:center;gap:8px;background:var(--card2);border:1px solid var(--border);border-radius:9px;padding:9px 12px;cursor:pointer;transition:.15s;font-size:13px;font-weight:500}
.prog-check:hover{border-color:var(--accent)}
.prog-check input[type=checkbox]{width:16px;height:16px;accent-color:var(--accent);cursor:pointer;flex-shrink:0}
.modal-footer{display:flex;gap:10px;margin-top:26px;justify-content:flex-end;border-top:1px solid var(--border);padding-top:20px}
.sdiv{font-size:11px;font-weight:700;color:var(--muted);letter-spacing:.8px;text-transform:uppercase;margin:20px 0 12px;padding-bottom:8px;border-bottom:1px solid var(--border)}
/* CLIENT */
.client-header{background:var(--card);border:1px solid var(--border);border-radius:18px;padding:24px 28px;margin-bottom:28px;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:16px}
.progs-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(270px,1fr));gap:18px}
.prog-card{background:var(--card);border:1px solid var(--border);border-radius:18px;padding:26px;transition:.25s}
.prog-card:hover{transform:translateY(-5px);box-shadow:0 20px 50px rgba(0,0,0,.4)}
.pc-ico{width:50px;height:50px;border-radius:14px;display:flex;align-items:center;justify-content:center;font-weight:900;font-size:15px;flex-shrink:0}
.cred-box{background:var(--card2);border:1px solid var(--border);border-radius:12px;padding:14px;margin-bottom:14px}
.cred-row{display:flex;justify-content:space-between;align-items:center;padding:5px 0}
.cred-row+.cred-row{border-top:1px solid var(--border);margin-top:5px;padding-top:10px}
.cred-lbl{font-size:11px;color:var(--muted);font-weight:600;text-transform:uppercase}
.cred-val{font-size:12px;font-weight:600;direction:ltr;display:flex;align-items:center;gap:6px;max-width:180px}
.cred-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:130px}
.cpbtn{background:none;border:none;cursor:pointer;font-size:13px;color:var(--muted);padding:2px 4px;border-radius:4px;transition:.15s}
.cpbtn:hover{color:var(--text)}
.openbtn{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;padding:12px;border:none;border-radius:11px;font-family:'Outfit',sans-serif;font-size:14px;font-weight:700;cursor:pointer;text-decoration:none;transition:.15s}
.openbtn:hover{filter:brightness(1.1);transform:translateY(-2px)}
/* PROG SETTINGS */
.prog-settings-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:16px}
/* TOAST */
.toast{position:fixed;bottom:28px;left:50%;transform:translateX(-50%) translateY(80px);background:var(--card2);border:1px solid var(--border);border-radius:12px;padding:12px 22px;font-size:14px;font-weight:600;z-index:999;transition:.3s;white-space:nowrap;box-shadow:0 8px 32px rgba(0,0,0,.4)}
.toast.show{transform:translateX(-50%) translateY(0)}
.toast-success{border-color:rgba(22,199,132,.4);color:var(--green)}
.toast-error{border-color:rgba(239,67,67,.4);color:var(--red)}
.device-badge{font-size:11px;padding:2px 8px;border-radius:20px;font-weight:700}
.device-win{background:rgba(59,127,245,.15);color:var(--blue)}
.device-and{background:rgba(22,199,132,.15);color:var(--green)}
.device-none{background:rgba(85,96,112,.15);color:var(--muted)}
@media(max-width:700px){header{padding:10px 14px}main{padding:16px 14px 60px}.grid2{grid-template-columns:1fr}th,td{padding:9px 10px;font-size:12px}.tabs-bar{padding:12px 14px 0}.modal{padding:24px 18px}}
</style>
</head>
<body>
<div id="toast" class="toast"></div>

<!-- LOGIN -->
<div id="login">
  <div class="login-box">
    <div style="text-align:center;margin-bottom:32px">
      <div class="login-icon">🔧</div>
      <h1 style="font-size:24px;font-weight:800">AutoTech Panel</h1>
      <p style="color:var(--muted);font-size:14px;margin-top:4px">Panneau de gestion technique</p>
    </div>
    <div class="fg"><label>Nom d'utilisateur</label><input id="l-user" placeholder="Utilisateur" autocomplete="off"></div>
    <div class="fg"><label>Mot de passe</label><input id="l-pass" type="password" placeholder="••••••••"></div>
    <button class="btn btn-gold" style="width:100%;padding:14px;font-size:15px;margin-top:6px;justify-content:center" onclick="doLogin()">Se connecter →</button>
    <div id="l-err" class="err-box hidden"></div>
  </div>
</div>

<!-- HEADER -->
<header id="hdr" class="hidden">
  <div class="hbrand">
    <div class="hicon">🔧</div>
    <div><div class="htitle">AutoTech Panel</div><div class="hsub">webdata.zkautoscan.fr</div></div>
  </div>
  <div class="hright">
    <div class="badge badge-gold" id="h-role">—</div>
    <div class="badge badge-blue" id="h-user">—</div>
    <button class="btn btn-ghost btn-sm" onclick="doLogout()">Déconnexion</button>
  </div>
</header>

<!-- TABS -->
<div id="admin-tabs" class="tabs-bar hidden">
  <div class="tabs">
    <button class="tab active" onclick="showTab('clients',this)">👥 Clients</button>
    <button class="tab" onclick="showTab('programs',this)">🔧 Programmes</button>
    <button class="tab" onclick="showTab('accounts',this)">🔑 Comptes</button>
    <button class="tab" onclick="showTab('settings',this)">⚙️ Paramètres</button>
  </div>
</div>

<main id="app" class="hidden">

  <!-- CLIENTS TAB -->
  <div id="tab-clients">
    <div class="stats" id="admin-stats"></div>
    <div class="sec-hd">
      <div><div class="sec-title">👥 Gestion des clients</div><div class="sec-sub">Ajoutez et gérez chaque client</div></div>
      <button class="btn btn-gold" onclick="openAddModal()">+ Ajouter un client</button>
    </div>
    <div class="tbl-wrap">
      <div class="tbl-head">
        <span style="font-weight:700;font-size:14px">Liste des clients</span>
        <input placeholder="🔍 Rechercher..." oninput="filterClients(this.value)" style="max-width:200px;padding:8px 14px;font-size:13px">
      </div>
      <div style="overflow-x:auto"><table>
        <thead><tr><th>Statut</th><th>Nom</th><th>Utilisateur</th><th>Programmes</th><th>Appareil</th><th>Expiration</th><th>Actions</th></tr></thead>
        <tbody id="clients-tbody"></tbody>
      </table></div>
    </div>
  </div>

  <!-- PROGRAMS TAB -->
  <div id="tab-programs" class="hidden">
    <div class="sec-hd">
      <div><div class="sec-title">🔧 Programmes</div><div class="sec-sub">Ajoutez autant de programmes que vous voulez</div></div>
      <button class="btn btn-gold" onclick="openAddProgModal()">+ Ajouter</button>
    </div>
    <div class="prog-settings-grid" id="prog-list-admin"></div>
  </div>

  <!-- ACCOUNTS TAB -->
  <div id="tab-accounts" class="hidden">
    <div class="sec-hd">
      <div><div class="sec-title">🔑 Identifiants</div><div class="sec-sub">Modifiez les identifiants de chaque programme</div></div>
      <button class="btn btn-gold" onclick="saveAccSettings()">💾 Sauvegarder tout</button>
    </div>
    <div class="prog-settings-grid" id="acc-settings-grid"></div>
  </div>

  <!-- SETTINGS TAB -->
  <div id="tab-settings" class="hidden">
    <div class="sec-title" style="margin-bottom:20px">⚙️ Paramètres Admin</div>
    <div style="background:var(--card);border:1px solid var(--border);border-radius:18px;padding:28px;max-width:420px">
      <h3 style="font-size:16px;font-weight:700;margin-bottom:20px">🔒 Changer le mot de passe admin</h3>
      <div class="fg"><label>Ancien mot de passe</label><input id="s-old" type="password" placeholder="••••••••"></div>
      <div class="fg"><label>Nouveau mot de passe</label><input id="s-new" type="password" placeholder="••••••••"></div>
      <div class="fg"><label>Confirmer</label><input id="s-conf" type="password" placeholder="••••••••"></div>
      <button class="btn btn-gold" onclick="changePass()">Modifier</button>
    </div>
  </div>

  <!-- CLIENT VIEW -->
  <div id="client-view" class="hidden">
    <div class="client-header">
      <div>
        <h2 style="font-size:22px;font-weight:800">Bonjour, <span id="cv-name"></span> 👋</h2>
        <p style="color:var(--muted);font-size:13px;margin-top:4px">Votre abonnement est actif</p>
      </div>
      <div style="display:flex;gap:12px;flex-wrap:wrap">
        <div style="background:var(--card2);border:1px solid var(--border);border-radius:10px;padding:8px 16px;font-size:13px">
          <span style="color:var(--muted);font-size:11px;display:block">Expiration</span>
          <strong id="cv-expiry" style="color:var(--green)">—</strong>
        </div>
        <div style="background:var(--card2);border:1px solid var(--border);border-radius:10px;padding:8px 16px;font-size:13px">
          <span style="color:var(--muted);font-size:11px;display:block">Appareil</span>
          <strong id="cv-device" style="color:var(--accent)">—</strong>
        </div>
      </div>
    </div>
    <div class="progs-grid" id="cv-progs"></div>
  </div>

</main>

<!-- ADD/EDIT CLIENT MODAL -->
<div id="modal-bg" class="modal-bg hidden" onclick="if(event.target===this)closeModal()">
  <div class="modal">
    <button class="modal-close" onclick="closeModal()">✕</button>
    <h2 id="modal-title">Ajouter un client</h2>
    <div class="sdiv">Informations du compte</div>
    <div class="grid2">
      <div class="fg"><label>Nom complet</label><input id="m-name" placeholder="Jean Dupont"></div>
      <div class="fg"><label>Nom d'utilisateur</label><input id="m-user" placeholder="jean123"></div>
    </div>
    <div class="grid2">
      <div class="fg"><label>Mot de passe</label><input id="m-pass" type="password" placeholder="••••••••"></div>
      <div class="fg"><label>Date d'expiration</label><input id="m-exp" type="date"></div>
    </div>
    <div class="sdiv">Programmes autorisés</div>
    <div style="display:flex;gap:8px;margin-bottom:10px">
      <button class="btn btn-ghost btn-sm" onclick="selAll(true)">✅ Tout</button>
      <button class="btn btn-ghost btn-sm" onclick="selAll(false)">❌ Aucun</button>
    </div>
    <div class="prog-grid" id="prog-checkboxes"></div>
    <div class="modal-footer">
      <button class="btn btn-ghost" onclick="closeModal()">Annuler</button>
      <button class="btn btn-gold" onclick="saveClient()">💾 Enregistrer</button>
    </div>
  </div>
</div>

<!-- ADD/EDIT PROGRAM MODAL -->
<div id="prog-modal-bg" class="modal-bg hidden" onclick="if(event.target===this)closeProgModal()">
  <div class="modal" style="max-width:480px">
    <button class="modal-close" onclick="closeProgModal()">✕</button>
    <h2 id="prog-modal-title">Ajouter un programme</h2>
    <div class="fg"><label>Nom</label><input id="pm-name" placeholder="Mitchell Prodemand"></div>
    <div class="grid2">
      <div class="fg"><label>Icône</label><input id="pm-icon" placeholder="M" maxlength="4"></div>
      <div class="fg"><label>Couleur</label><input id="pm-color" type="color" value="#3b7ff5" style="height:42px;padding:4px 8px;cursor:pointer"></div>
    </div>
    <div class="fg"><label>Catégorie</label>
      <select id="pm-cat"><option>Diagnostic</option><option>Données techniques</option><option>Pièces détachées</option><option>Transmission</option><option>Manuel d'atelier</option><option>Autre</option></select>
    </div>
    <div class="fg"><label>URL</label><input id="pm-url" placeholder="https://exemple.com" type="url"></div>
    <div class="fg"><label>Utilisateur / Email</label><input id="pm-user" placeholder="user@exemple.com"></div>
    <div class="fg"><label>Mot de passe</label><input id="pm-pass" type="password" placeholder="••••••••"></div>
    <div class="modal-footer">
      <button class="btn btn-ghost" onclick="closeProgModal()">Annuler</button>
      <button class="btn btn-gold" onclick="saveProgram()">💾 Enregistrer</button>
    </div>
  </div>
</div>

<script>
const API = 'api.php';
let PROGRAMS = [];
let CLIENTS  = [];
let editingClientId = null;
let editingProgId   = null;
let currentRole = null;
let deviceId = getDeviceId();

function getDeviceId() {
    let id = localStorage.getItem('atk_device');
    if (!id) { id = 'DEV_' + Math.random().toString(36).substr(2,12).toUpperCase() + '_' + Date.now(); localStorage.setItem('atk_device', id); }
    return id;
}

function toast(msg, type='success') {
    const t = document.getElementById('toast');
    t.textContent = msg; t.className = `toast toast-${type} show`;
    setTimeout(() => t.classList.remove('show'), 2800);
}

async function api(data) {
    const fd = new FormData();
    Object.entries(data).forEach(([k,v]) => fd.append(k, v));
    const r = await fetch(API, {method:'POST', body:fd});
    return r.json();
}

async function doLogin() {
    const u = document.getElementById('l-user').value.trim();
    const p = document.getElementById('l-pass').value.trim();
    const err = document.getElementById('l-err');
    if (!u||!p) { err.textContent='Veuillez remplir tous les champs'; err.classList.remove('hidden'); return; }
    const res = await api({action:'login', username:u, password:p, device_id:deviceId, device_type:getDeviceType()});
    if (res.success) {
        err.classList.add('hidden');
        document.getElementById('login').style.opacity='0';
        setTimeout(() => { document.getElementById('login').style.display='none'; boot(res); }, 350);
    } else {
        err.textContent = res.message || 'Erreur de connexion';
        err.classList.remove('hidden');
        document.getElementById('l-pass').value='';
    }
}

function getDeviceType() {
    return /android/i.test(navigator.userAgent) ? 'android' : 'windows';
}

async function doLogout() {
    await api({action:'logout'});
    location.reload();
}

async function boot(user) {
    document.getElementById('hdr').classList.remove('hidden');
    document.getElementById('app').classList.remove('hidden');
    document.getElementById('h-user').textContent = '👤 ' + user.username;
    currentRole = user.role;
    const res = await api({action:'get_programs'});
    PROGRAMS = res.programs || [];
    if (user.role === 'admin') {
        document.getElementById('h-role').textContent = '🛡 Admin';
        document.getElementById('admin-tabs').classList.remove('hidden');
        showTab('clients');
        loadStats(); loadClients();
    } else {
        document.getElementById('h-role').textContent = '⭐ Client';
        document.getElementById('client-view').classList.remove('hidden');
        document.getElementById('cv-name').textContent = user.name;
        document.getElementById('cv-expiry').textContent = user.expiry || '—';
        document.getElementById('cv-device').textContent = getDeviceType() === 'android' ? '📱 Android' : '💻 Windows';
        renderClientView(user.programs || []);
    }
}

function showTab(t, btn) {
    ['tab-clients','tab-programs','tab-accounts','tab-settings','client-view'].forEach(id => document.getElementById(id).classList.add('hidden'));
    document.getElementById('tab-'+t).classList.remove('hidden');
    document.querySelectorAll('.tab').forEach(el => el.classList.remove('active'));
    if (btn) btn.classList.add('active');
    else { const tabs = document.querySelectorAll('.tab'); if(tabs[0]) tabs[0].classList.add('active'); }
    if (t==='programs') renderProgAdmin();
    if (t==='accounts') renderAccSettings();
}

async function loadStats() {
    const r = await api({action:'get_stats'});
    document.getElementById('admin-stats').innerHTML = `
      <div class="stat stat-gold"><div class="stat-n">${r.total}</div><div class="stat-l">Total clients</div></div>
      <div class="stat stat-green"><div class="stat-n">${r.active}</div><div class="stat-l">Actifs</div></div>
      <div class="stat stat-blue"><div class="stat-n">${r.expired}</div><div class="stat-l">Expirés</div></div>
      <div class="stat stat-purple"><div class="stat-n">${r.programs}</div><div class="stat-l">Programmes</div></div>`;
}

async function loadClients() {
    const r = await api({action:'get_clients'});
    CLIENTS = r.clients || [];
    renderClients(CLIENTS);
}

function filterClients(q) {
    const f = CLIENTS.filter(c => c.username.includes(q) || c.name.includes(q));
    renderClients(f);
}

function isExpired(exp) { return exp && new Date(exp) < new Date(); }
function daysleft(exp) { if(!exp) return null; return Math.ceil((new Date(exp)-new Date())/(864e5)); }
function hexA(hex,a) { const r=parseInt(hex.slice(1,3),16),g=parseInt(hex.slice(3,5),16),b=parseInt(hex.slice(5,7),16); return `rgba(${r},${g},${b},${a})`; }

function renderClients(list) {
    const tb = document.getElementById('clients-tbody');
    if (!list.length) { tb.innerHTML='<tr><td colspan="7" style="text-align:center;color:var(--muted);padding:32px">Aucun client</td></tr>'; return; }
    tb.innerHTML = list.map(u => {
        const exp = isExpired(u.expiry);
        const dl  = daysleft(u.expiry);
        const soon = dl !== null && dl <= 7 && !exp;
        const chips = (u.programs||[]).slice(0,4).map(pid => {
            const p = PROGRAMS.find(x=>x.pid===pid);
            return p ? `<span class="chip" style="background:${hexA(p.color,.15)};color:${p.color}">${p.name}</span>` : '';
        }).join('') + ((u.programs||[]).length>4 ? `<span class="chip" style="background:var(--card2);color:var(--muted)">+${u.programs.length-4}</span>` : '');
        const devBadge = u.device_locked
            ? `<span class="device-badge ${u.device_type==='android'?'device-and':'device-win'}">${u.device_type==='android'?'📱 Android':'💻 Windows'}</span>`
            : `<span class="device-badge device-none">Non verrouillé</span>`;
        return `<tr>
          <td><span class="sdot ${exp?'dr':soon?'dy':'dg'}"></span><span style="font-size:12px;${exp?'color:var(--red)':soon?'color:var(--accent)':''}">${exp?'Expiré':soon?dl+'j':'Actif'}</span></td>
          <td style="font-weight:700">${u.name}</td>
          <td style="font-family:monospace;color:var(--muted);font-size:12px">${u.username}</td>
          <td><div class="chips">${chips||'—'}</div></td>
          <td>${devBadge}${u.device_locked?` <button class="btn btn-ghost btn-sm" style="margin-top:4px" onclick="resetDevice(${u.id})">🔄 Reset</button>`:''}</td>
          <td style="font-size:12px;color:${exp?'var(--red)':soon?'var(--accent)':'var(--muted)'}">${u.expiry||'—'}</td>
          <td style="white-space:nowrap">
            <button class="btn btn-blue btn-sm" onclick="openEditModal(${u.id})">✏️</button>
            <button class="btn btn-red btn-sm" onclick="delClient(${u.id},'${u.name}')">🗑</button>
          </td></tr>`;
    }).join('');
}

function buildCheckboxes(selected=[]) {
    return PROGRAMS.map(p => `
      <label class="prog-check">
        <input type="checkbox" value="${p.pid}" ${selected.includes(p.pid)?'checked':''}>
        <span style="display:flex;align-items:center;gap:6px">
          <span style="font-size:11px;padding:1px 6px;border-radius:4px;background:${hexA(p.color,.15)};color:${p.color};font-weight:700">${p.icon}</span>
          ${p.name}
        </span>
      </label>`).join('');
}
function selAll(v) { document.querySelectorAll('#prog-checkboxes input[type=checkbox]').forEach(el=>el.checked=v); }

function openAddModal() {
    editingClientId = null;
    document.getElementById('modal-title').textContent = 'Ajouter un client';
    ['m-name','m-user','m-exp'].forEach(id=>document.getElementById(id).value='');
    document.getElementById('m-pass').value='';
    document.getElementById('prog-checkboxes').innerHTML = buildCheckboxes();
    document.getElementById('modal-bg').classList.remove('hidden');
}

function openEditModal(id) {
    const u = CLIENTS.find(c=>c.id==id);
    if (!u) return;
    editingClientId = id;
    document.getElementById('modal-title').textContent = 'Modifier : ' + u.name;
    document.getElementById('m-name').value = u.name;
    document.getElementById('m-user').value = u.username;
    document.getElementById('m-pass').value = '';
    document.getElementById('m-exp').value  = u.expiry || '';
    document.getElementById('prog-checkboxes').innerHTML = buildCheckboxes(u.programs||[]);
    document.getElementById('modal-bg').classList.remove('hidden');
}
function closeModal() { document.getElementById('modal-bg').classList.add('hidden'); }

async function saveClient() {
    const name = document.getElementById('m-name').value.trim();
    const username = document.getElementById('m-user').value.trim();
    const password = document.getElementById('m-pass').value.trim();
    const expiry = document.getElementById('m-exp').value;
    const programs = JSON.stringify([...document.querySelectorAll('#prog-checkboxes input:checked')].map(el=>el.value));
    if (!name||!username||((!editingClientId)&&!password)) { toast('Champs requis manquants','error'); return; }
    const data = {action: editingClientId?'edit_client':'add_client', name, username, password, expiry, programs};
    if (editingClientId) data.id = editingClientId;
    const r = await api(data);
    if (r.success) { toast(r.message); closeModal(); loadClients(); loadStats(); }
    else toast(r.message||'Erreur','error');
}

async function delClient(id, name) {
    if (!confirm('Supprimer "'+name+'" ?')) return;
    const r = await api({action:'delete_client', id});
    if (r.success) { toast('Client supprimé'); loadClients(); loadStats(); }
}

async function resetDevice(id) {
    const r = await api({action:'reset_device', id});
    if (r.success) { toast('Appareil réinitialisé ✅'); loadClients(); }
}

// PROGRAMS ADMIN
function renderProgAdmin() {
    const grid = document.getElementById('prog-list-admin');
    grid.innerHTML = PROGRAMS.map(p => `
      <div style="background:var(--card);border:1px solid var(--border);border-radius:16px;padding:20px;border-top:3px solid ${p.color}">
        <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:12px">
          <div style="display:flex;align-items:center;gap:10px">
            <div style="width:42px;height:42px;border-radius:11px;background:${hexA(p.color,.15)};color:${p.color};display:flex;align-items:center;justify-content:center;font-weight:900;font-size:14px">${p.icon}</div>
            <div><div style="font-weight:700;font-size:15px">${p.name}</div><div style="font-size:11px;color:var(--muted)">${p.category}</div></div>
          </div>
          <div style="display:flex;gap:6px">
            <button class="btn btn-blue btn-sm" onclick="openEditProgModal(${p.id})">✏️</button>
            <button class="btn btn-red btn-sm" onclick="delProg(${p.id},'${p.name}')">🗑</button>
          </div>
        </div>
        <div style="font-size:12px;color:var(--muted);font-family:monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">${p.url}</div>
      </div>`).join('');
}

function openAddProgModal() {
    editingProgId = null;
    document.getElementById('prog-modal-title').textContent = 'Ajouter un programme';
    ['pm-name','pm-icon','pm-url','pm-user','pm-pass'].forEach(id=>document.getElementById(id).value='');
    document.getElementById('pm-color').value='#3b7ff5';
    document.getElementById('pm-cat').value='Diagnostic';
    document.getElementById('prog-modal-bg').classList.remove('hidden');
}
function openEditProgModal(id) {
    const p = PROGRAMS.find(x=>x.id==id); if(!p) return;
    editingProgId = id;
    document.getElementById('prog-modal-title').textContent = 'Modifier : ' + p.name;
    document.getElementById('pm-name').value = p.name;
    document.getElementById('pm-icon').value = p.icon;
    document.getElementById('pm-color').value = p.color;
    document.getElementById('pm-cat').value = p.category;
    document.getElementById('pm-url').value = p.url;
    document.getElementById('pm-user').value = p.username;
    document.getElementById('pm-pass').value = p.password;
    document.getElementById('prog-modal-bg').classList.remove('hidden');
}
function closeProgModal() { document.getElementById('prog-modal-bg').classList.add('hidden'); }

async function saveProgram() {
    const name = document.getElementById('pm-name').value.trim();
    const url  = document.getElementById('pm-url').value.trim();
    if (!name||!url) { toast('Nom et URL requis','error'); return; }
    const data = {
        action: editingProgId ? 'edit_program' : 'add_program',
        name, icon: document.getElementById('pm-icon').value.trim()||name.slice(0,2).toUpperCase(),
        color: document.getElementById('pm-color').value,
        category: document.getElementById('pm-cat').value,
        url, prog_user: document.getElementById('pm-user').value.trim(),
        prog_pass: document.getElementById('pm-pass').value.trim(),
    };
    if (editingProgId) data.id = editingProgId;
    const r = await api(data);
    if (r.success) {
        toast(r.message);
        closeProgModal();
        const res = await api({action:'get_programs'});
        PROGRAMS = res.programs || [];
        renderProgAdmin(); loadStats();
    } else toast(r.message||'Erreur','error');
}

async function delProg(id, name) {
    if (!confirm('Supprimer "'+name+'" ?')) return;
    const r = await api({action:'delete_program', id});
    if (r.success) {
        toast('Programme supprimé');
        const res = await api({action:'get_programs'});
        PROGRAMS = res.programs || [];
        renderProgAdmin(); loadStats();
    }
}

// ACCOUNTS SETTINGS
function renderAccSettings() {
    document.getElementById('acc-settings-grid').innerHTML = PROGRAMS.map((p,i) => `
      <div style="background:var(--card);border:1px solid var(--border);border-radius:16px;padding:22px;border-top:3px solid ${p.color}">
        <div style="display:flex;align-items:center;gap:10px;margin-bottom:16px">
          <div style="width:42px;height:42px;border-radius:11px;background:${hexA(p.color,.15)};color:${p.color};display:flex;align-items:center;justify-content:center;font-weight:900;font-size:13px;flex-shrink:0">${p.icon}</div>
          <div style="font-weight:700;font-size:15px">${p.name}</div>
        </div>
        <div class="fg"><label>URL</label><input id="as-url-${p.id}" value="${p.url}"></div>
        <div class="fg"><label>Utilisateur</label><input id="as-user-${p.id}" value="${p.username}"></div>
        <div class="fg"><label>Mot de passe</label><input id="as-pass-${p.id}" value="${p.password}" type="password"></div>
        <button class="btn btn-blue btn-sm" style="margin-top:4px" onclick="saveOneProg(${p.id})">💾 Sauvegarder</button>
      </div>`).join('');
}

async function saveOneProg(id) {
    const p = PROGRAMS.find(x=>x.id==id); if(!p) return;
    const data = {
        action:'edit_program', id,
        name:p.name, icon:p.icon, color:p.color, category:p.category,
        url: document.getElementById('as-url-'+id).value.trim(),
        prog_user: document.getElementById('as-user-'+id).value.trim(),
        prog_pass: document.getElementById('as-pass-'+id).value.trim(),
    };
    const r = await api(data);
    if (r.success) { toast(p.name+' sauvegardé ✅'); const res=await api({action:'get_programs'}); PROGRAMS=res.programs||[]; }
    else toast('Erreur','error');
}

async function saveAccSettings() {
    for (const p of PROGRAMS) await saveOneProg(p.id);
    toast('Tous les identifiants sauvegardés ✅');
}

// CLIENT VIEW
function renderClientView(progIds) {
    const progs = PROGRAMS.filter(p => progIds.includes(p.pid));
    const grid = document.getElementById('cv-progs');
    if (!progs.length) { grid.innerHTML='<div style="text-align:center;color:var(--muted);margin-top:60px;grid-column:1/-1">Aucun programme activé. Contactez l\'administrateur.</div>'; return; }
    grid.innerHTML = progs.map(p => `
      <div class="prog-card" style="border-top:3px solid ${p.color}">
        <div style="display:flex;align-items:center;gap:14px;margin-bottom:18px">
          <div class="pc-ico" style="background:${hexA(p.color,.15)};color:${p.color}">${p.icon}</div>
          <div><div style="font-size:16px;font-weight:700">${p.name}</div><div style="font-size:11px;color:var(--muted)">${p.category}</div></div>
        </div>
        <div class="cred-box">
          <div class="cred-row">
            <span class="cred-lbl">Utilisateur</span>
            <span class="cred-val"><span class="cred-text">${p.username||'—'}</span>${p.username?`<button class="cpbtn" onclick="cp('${p.username}',this)">📋</button>`:''}
            </span>
          </div>
          <div class="cred-row">
            <span class="cred-lbl">Mot de passe</span>
            <span class="cred-val" id="pv-${p.pid}"><span class="cred-text ptext">••••••••</span>
              <button class="cpbtn" onclick="tv('${p.pid}','${p.password}',this)">👁️</button>
              ${p.password?`<button class="cpbtn" onclick="cp('${p.password}',this)">📋</button>`:''}
            </span>
          </div>
        </div>
        <a href="${p.url}" target="_blank" class="openbtn" style="background:${p.color};color:${['#e8a020','#16c784','#84cc16','#f97316'].includes(p.color)?'#000':'#fff'}">
          🔗 Ouvrir ${p.name}
        </a>
      </div>`).join('');
}

function cp(txt,btn) { navigator.clipboard.writeText(txt).then(()=>{ btn.textContent='✅'; setTimeout(()=>btn.textContent='📋',1500); }); }
function tv(id,pass,btn) {
    const el=document.querySelector(`#pv-${id} .ptext`);
    if(btn.dataset.show){ el.textContent='••••••••'; btn.dataset.show=''; btn.textContent='👁️'; }
    else{ el.textContent=pass; btn.dataset.show='1'; btn.textContent='🙈'; }
}

async function changePass() {
    const old=document.getElementById('s-old').value;
    const nw=document.getElementById('s-new').value;
    const cf=document.getElementById('s-conf').value;
    if (nw!==cf) { toast('Les mots de passe ne correspondent pas','error'); return; }
    const r = await api({action:'change_admin_pass', old_pass:old, new_pass:nw});
    if (r.success) { toast('Mot de passe modifié ✅'); ['s-old','s-new','s-conf'].forEach(id=>document.getElementById(id).value=''); }
    else toast(r.message||'Erreur','error');
}

document.getElementById('l-pass').addEventListener('keydown',e=>{ if(e.key==='Enter') doLogin(); });
document.getElementById('l-user').addEventListener('keydown',e=>{ if(e.key==='Enter') document.getElementById('l-pass').focus(); });

// Auto-check session
(async()=>{ const r=await api({action:'check'}); if(r.logged){ const res=await api({action:'get_programs'}); PROGRAMS=res.programs||[]; boot(r); } })();
</script>
</body>
</html>
