/* Console partenaire — racine : session, accès, environnement Sandbox / Production, routage par le hash
   (#/page/param), coquille bureau ou mobile (< 820 px), thème clair/sombre, langue des exemples de code. */
const DROITS = {dev:['proprietaire','developpeur'], finance:['proprietaire','finance'], proprio:['proprietaire']};
const PAGES = {dash:Dash, ops:Ops, op:OpDetail, bal:Balances, conso:Conso, keys:Keys, logs:Logs, hooks:Hooks, devset:DevSettings, prod:Prod, team:Team, settings:Settings, help:Help};

function ConsoleApp(){
  const [jeton, setJeton] = React.useState(lireJeton());
  const [acces, setAcces] = React.useState(lireAcces);
  const [moi, setMoi] = React.useState(null), [erreurMoi, setErreurMoi] = React.useState(null);
  const [mode, setModeState] = React.useState(() => { try { return sessionStorage.getItem('lms_mode') === 'live' ? 'live' : 'test'; } catch(e){ return 'test'; } });
  const setMode = (m) => { setModeState(m); try { sessionStorage.setItem('lms_mode', m); } catch(e){} };
  const [dark, setDark] = useTheme(); const mob = useEstMobile(); const [li, setLi] = React.useState(0);
  const [tick, setTick] = React.useState(0); const rafraichir = React.useCallback(() => setTick(t => t + 1), []);
  const r0 = useRoute('dash'); const route = {page:ALIAS[r0.page] || r0.page, param:r0.param};
  const lien = acces.jeton && ['verifier-email','reinitialiser','invitation'].includes(acces.page);

  const rechargerMoi = React.useCallback(() => api('GET', 'moi').then(x => { setMoi(x); setErreurMoi(null); }).catch(e => { if(e.status !== 401) setErreurMoi(e); }), []);
  React.useEffect(() => { const f = () => { setJeton(null); setMoi(null); setAcces({page:'connexion'}); }; addEventListener('lms-deconnexion', f); return () => removeEventListener('lms-deconnexion', f); }, []);
  React.useEffect(() => { if(jeton && !lien) rechargerMoi(); }, [jeton]);
  React.useEffect(() => { if(!jeton) return; const t = setInterval(() => { rechargerMoi(); rafraichir(); }, 120000); return () => clearInterval(t); }, [jeton]);
  // Production verrouillée : on reste en sandbox
  React.useEffect(() => { if(moi && mode === 'live' && !moi.entreprise.production_ouverte) setMode('test'); }, [moi, mode]);
  const connecte = !!(jeton && moi && !lien);
  const [dossier] = useDonnees(() => connecte ? api('GET', 'dossier').catch(() => null) : Promise.resolve(null), [connecte, tick]);
  const notifs = useNotifs(connecte ? mode : null, tick);
  const sig = notifs.map(n => n.titre + (n.quand || '')).join('|');
  const [vu, setVu] = React.useState(() => { try { return localStorage.getItem('lms_notif_vu') || ''; } catch(e){ return ''; } });
  const marquerVu = () => { setVu(sig); try { localStorage.setItem('lms_notif_vu', sig); } catch(e){} };
  const quitter = async () => { try { await api('POST', 'auth/deconnexion'); } catch(e){} ecrireJeton(null); setJeton(null); setMoi(null); setAcces({page:'connexion'}); };
  const go = (page, param) => aller(page, param);

  let corps;
  const allerAcces = (p) => { if(lien || ['verifier-email','reinitialiser','invitation'].includes(acces.page)) nettoyerUrl(); setAcces({page:p}); };
  if(!jeton || lien){
    const a = acces.page;
    corps = a === 'docs' ? <Docs connected={false} go={k => allerAcces(k === '@signup' ? 'inscription' : 'connexion')}/>
      : a === 'inscription' ? <Inscription go={allerAcces}/>
      : a === 'oubli' ? <Oubli go={allerAcces}/>
      : a === 'verifier-email' ? <VerifierEmail jeton={acces.jeton} go={allerAcces}/>
      : a === 'reinitialiser' ? <Reinitialiser jeton={acces.jeton} go={allerAcces}/>
      : a === 'invitation' ? <InvitationAcces jeton={acces.jeton} go={allerAcces}/>
      : <Connexion onConnecte={() => { setJeton(lireJeton()); setAcces({page:'connexion'}); if(!location.hash || /^#\/?$/.test(location.hash)) aller('dash'); }} go={allerAcces}/>;
  } else if(!moi){
    corps = erreurMoi ? <div style={{height:'100%', display:'grid', placeItems:'center', padding:20}}><div style={{maxWidth:420, width:'100%'}}><ErreurCarte e={erreurMoi} recharger={rechargerMoi}/></div></div>
      : <div style={{height:'100%', display:'grid', placeItems:'center'}} role="status" aria-label="Chargement"><span className="kspin" style={{width:34, height:34, borderRadius:99, border:`3px solid ${V.line}`, borderTopColor:V.acc}}></span></div>;
  } else if(route.page === 'docs'){
    corps = <Docs connected id={route.param || 'start'} onPick={k => aller('docs', k)} onApp={() => aller('dash')} go={k => aller(k === '@signup' ? 'keys' : 'dash')}/>;
  } else {
    const P = PAGES[route.page] || Dash;
    const Shell = mob ? MobileShell : DesktopShell;
    corps = <Shell><div key={route.page + (route.param || '') + mode} style={{flex:1, minWidth:0, display:'flex'}}><P id={route.param} param={route.param}/></div></Shell>;
  }
  const ctx = {moi, rechargerMoi, dossier, mode, setMode, page:route.page, param:route.param, go, dark, setDark, quitter, rafraichir, tick,
    notifs, notifNouv:notifs.length > 0 && sig !== vu, marquerVu, peut:(d) => !!moi && (DROITS[d] || []).includes(moi.membre.role)};
  return <LangCtx.Provider value={[li, setLi]}><MobCtx.Provider value={mob}><AppCtx.Provider value={ctx}><Toasts>
    <div style={{width:'100%', height:'100%', position:'relative', fontFamily:V.body, color:V.ink, background:V.bg, overflow:'hidden'}}>{corps}</div>
  </Toasts></AppCtx.Provider></MobCtx.Provider></LangCtx.Provider>;
}
ReactDOM.createRoot(document.getElementById('app')).render(<ConsoleApp/>);
