// ──────────────────────────── App root ────────────────────────────
// Convertito al Cupertino Enterprise Design System.
// Logica di navigazione/stato invariata: cambiano solo i valori d'accento
// (ora Apple System Colors) e il target dell'attributo data-theme (<html>).

// Accenti del design system — Apple System Colors (vedi tokens.css).
const ACCENT_OPTIONS = [
  { id: 'blue',   value: '#007AFF', label: 'Blu (sistema)' },
  { id: 'indigo', value: '#5856D6', label: 'Indaco' },
  { id: 'teal',   value: '#30B0C7', label: 'Teal' },
  { id: 'purple', value: '#AF52DE', label: 'Viola' },
];

// Ritorna la prima voce di menu visibile per un dato ruolo,
// specchiando la logica di visibleNav in shell.jsx.
const computeFirstSection = (role) => {
  const item = NAV.find(n => {
    if (role === 'Magazziniere' && (n.id === 'dashboard' || n.id === 'pos')) return false;
    return true;
  });
  return item?.id || 'dashboard';
};

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "accent": "#007AFF",
  "density": "comfortable",
  "theme": "light",
  "posLayout": "auto"
}/*EDITMODE-END*/;

const App = () => {
  const [session, setSession]         = useState(window.__SESSION__ ?? null); // ripristinata dal cookie (backend)
  const [activeStoreId, setActiveStoreId] = useState(STORE.id);
  const [operators, setOperators]     = useState(window.__OPERATORS__ ?? OPERATORS);

  // Top-level section + sub-state per section. Sezione iniziale in base al ruolo.
  const [section, setSection]         = useState(() => window.__SESSION__?.op?.role ? computeFirstSection(window.__SESSION__.op.role) : 'pos');
  const [articleId, setArticleId]     = useState(null);
  const [customerId, setCustomerId]   = useState(null);

  const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);

  useEffect(() => {
    document.documentElement.style.setProperty('--accent', t.accent);
    document.documentElement.style.setProperty('--accent-blue', t.accent);
    document.body.setAttribute('data-density', t.density);
    document.documentElement.setAttribute('data-theme', t.theme);
    document.body.setAttribute('data-pos-layout', t.posLayout);
  }, [t.accent, t.density, t.theme, t.posLayout]);

  // Permessi calcolati prima del conditional return (richiesto da Rules of Hooks)
  const rolePerms = session ? ((ROLES || []).find(r => r.id === session.op.role)?.permissions || {}) : {};
  const effectiveStoreId = (rolePerms.storeSwitcher === 'locked' && session?.op?.storeId)
    ? session.op.storeId
    : activeStoreId;
  const canDashboard    = session ? rolePerms.dashboard    !== false : true;
  const canPOS          = session ? rolePerms.pos          !== false : true;
  const canAcquisti     = session ? rolePerms.acquisti     !== false : true;
  const canImpostazioni = session ? rolePerms.impostazioni === true  : false;
  const canScadenzario  = session ? ['Admin','Manager','Area Manager','Negozio'].includes(session.op.role) : false;
  // Cassiere con canMagazzinoWrite ottiene accesso completo al magazzino
  const opFromList   = operators.find(op => op.id === session?.op?.id);
  const maggReadOnly = rolePerms.magazzino === 'read' && !opFromList?.canMagazzinoWrite;

  // Redirect di sicurezza: se per qualsiasi motivo la sezione corrente non è
  // nel menu del ruolo, torna alla prima voce valida.
  useEffect(() => {
    if (!session) return;
    const safe = computeFirstSection(session.op.role);
    if (!canPOS && section === 'pos') setSection(safe);
    if (!canDashboard && section === 'dashboard') setSection(safe);
  }, [session, canPOS, canDashboard, section]);

  // Schermata di login / blocco
  if (!session) {
    return (
      <LoginScreen
        // Dopo il login il cookie è impostato dal server: ricarico così la pagina
        // riceve __SESSION__ (il principal: negozio o persona) e il bootstrap pieno.
        onLogin={() => window.location.reload()}
      />
    );
  }

  const goTo = (sec) => {
    setArticleId(null);
    setCustomerId(null);
    setSection(sec);
  };

  // Navigazione globale tra sezioni: permette a qualunque vista (es. Anagrafiche)
  // di portare l'utente in un'altra sezione (Cassa, Acquisti, ...).
  // NB: assegnazione normale (NON un hook): questo punto è dopo i return anticipati
  // del gate di login, quindi un useEffect qui violerebbe le regole degli hook.
  window.__nav = goTo;

  // POS opera sempre su un negozio concreto (non 'all')
  const posStoreId = effectiveStoreId === 'all' ? STORE.id : effectiveStoreId;

  let view;
  switch (section) {
    case 'pos':
      view = (
        <AccessGate allowed={canPOS} section="pos" onDismiss={() => goTo('catalogo')} operators={operators}>
          <POS session={session} onOpenCassa={() => goTo('apertura')} onCloseCassa={() => goTo('eod')} activeStoreId={posStoreId}/>
        </AccessGate>
      );
      break;
    case 'catalogo':
      view = <CatalogoView
                articleId={articleId}
                onOpen={(id)=>setArticleId(id)}
                onBack={()=>setArticleId(null)}
                activeStoreId={effectiveStoreId}/>;
      break;
    case 'magazzino':
      view = <MagazzinoView activeStoreId={effectiveStoreId} readOnly={maggReadOnly}/>; break;
    case 'anagrafiche':
      view = <AnagraficheView
                customerId={customerId}
                onOpenCustomer={(id)=>setCustomerId(id)}
                onBack={()=>setCustomerId(null)}
                role={session.op.role}/>;
      break;
    case 'documenti':
      view = <DocumentiView role={session.op.role}/>; break;
    case 'eod':
      view = <EODView session={session} storeId={posStoreId} onClose={() => goTo('dashboard')} onEndSession={async () => { if (window.__API__) await window.__API__.logout(); window.location.reload(); }}/>; break;
    case 'apertura':
      view = <AperturaView session={session} storeId={posStoreId} onConferma={(f) => { setSession(prev => ({ ...prev, fondo: f })); goTo('dashboard'); }} onClose={() => goTo('dashboard')}/>; break;
    case 'acquisti':
      view = (
        <AccessGate allowed={canAcquisti} section="acquisti" onDismiss={() => goTo('catalogo')} operators={operators}>
          <AcquistiView activeStoreId={effectiveStoreId} session={session} onGoToCatalog={() => goTo('catalogo')}/>
        </AccessGate>
      );
      break;
    // 'impostazioni' non è più una sezione del menu: le impostazioni aziendali sono
    // nel pannello account (rotella → tab Azienda).
    case 'scadenzario':
      view = (
        <AccessGate allowed={canScadenzario} section="scadenzario" onDismiss={() => goTo('documenti')} operators={operators}>
          <ScadenzarioView/>
        </AccessGate>
      );
      break;
    case 'timbrature':
      view = <TimbraturePanel session={session} activeStoreId={posStoreId}/>; break;
    case 'utenti':
      view = <UserManagementPanel
                session={session}
                operators={operators}
                onClose={() => goTo(computeFirstSection(session.op.role))}
                onUpdateOperators={setOperators}/>;
      break;
    case 'dashboard':
    default:
      view = (
        <AccessGate allowed={canDashboard} section="dashboard" onDismiss={() => goTo('magazzino')} operators={operators}>
          <Dashboard onShortcut={goTo} session={session} activeStoreId={effectiveStoreId}/>
        </AccessGate>
      );
  }

  return (
    <div className="flex h-full overflow-hidden bg-canvas" data-screen-label={`Easy2Sell · ${section}`}>
      <Sidebar
        section={section}
        onNav={goTo}
        onOpenTweaks={() => window.postMessage({ type: '__activate_edit_mode' }, '*')}
        session={session}
        onLock={async () => { if (window.__API__) await window.__API__.logout(); window.location.reload(); }}
        activeStoreId={effectiveStoreId}
        onStoreChange={setActiveStoreId}
        onOpenUserPanel={() => goTo('utenti')}
      />
      <main className="flex-1 min-w-0 overflow-y-auto bg-canvas">
        {view}
      </main>

      <TweaksPanel title="Tweaks">
        <TweakSection label="Accento">
          <TweakColor
            label="Colore d'accento"
            value={t.accent}
            options={ACCENT_OPTIONS.map(o => o.value)}
            onChange={(v) => setTweak('accent', v)}
          />
        </TweakSection>
        <TweakSection label="Layout">
          <TweakRadio
            label="Densità tabelle"
            value={t.density}
            options={[
              { value: 'comfortable', label: 'Comoda (touch)' },
              { value: 'compact',     label: 'Compatta' },
            ]}
            onChange={(v) => setTweak('density', v)}
          />
          <TweakRadio
            label="Tema"
            value={t.theme}
            options={[
              { value: 'light', label: 'Chiaro' },
              { value: 'dark',  label: 'Scuro' },
            ]}
            onChange={(v) => setTweak('theme', v)}
          />
          <TweakSelect
            label="Layout Cassa"
            value={t.posLayout}
            options={[
              { value: 'auto',       label: 'Automatico (responsive)' },
              { value: 'horizontal', label: 'Desktop · orizzontale' },
              { value: 'vertical',   label: 'Tablet · verticale' },
            ]}
            onChange={(v) => setTweak('posLayout', v)}
          />
        </TweakSection>
        <TweakSection label="Navigazione">
          <TweakSelect
            label="Vai a sezione"
            value={section}
            options={[
              { value: 'dashboard',   label: 'Dashboard' },
              { value: 'pos',         label: 'Cassa (POS)' },
              { value: 'catalogo',    label: 'Catalogo' },
              { value: 'magazzino',   label: 'Magazzino' },
              { value: 'anagrafiche', label: 'Anagrafiche' },
              { value: 'documenti',   label: 'Documenti' },
            ]}
            onChange={(v) => goTo(v)}
          />
        </TweakSection>
      </TweaksPanel>
    </div>
  );
};

// Render delegato a boot-entry.jsx (vedi shared/jsx-order.json).
Object.assign(window, { App });
