// Kiosk router + prototype controls.

// ── palette presets ────────────────────────────────────────────
const PALETTES = {
  sage: {
    label: 'Sage · warm paper',
    swatch: ['#1F5A4F', '#F4F1EA', '#15140F'],
    vars: {
      'bg': '#F4F1EA', 'bg-2': '#ECE7DA', 'bg-3': '#DED7C5',
      'paper': '#FBFAF6', 'paper-2': '#FFFFFF',
      'ink': '#15140F', 'ink-2': '#3E3A33', 'ink-3': '#6E685D',
      'muted': '#9A9388', 'line': '#DDD7C8', 'line-2': '#CFC8B8',
      'accent': '#1F5A4F', 'accent-2': '#2A7B6A', 'accent-soft': '#D6E5DF',
    },
  },
  clinical: {
    label: 'Clinical · cool blue',
    swatch: ['#0E5E7A', '#F1F4F7', '#0F1419'],
    vars: {
      'bg': '#F1F4F7', 'bg-2': '#E5EAEF', 'bg-3': '#D2DBE3',
      'paper': '#FAFBFC', 'paper-2': '#FFFFFF',
      'ink': '#0F1419', 'ink-2': '#2A3340', 'ink-3': '#5B6573',
      'muted': '#92989F', 'line': '#DCE1E6', 'line-2': '#C5CCD3',
      'accent': '#0E5E7A', 'accent-2': '#1378A0', 'accent-soft': '#D1E4ED',
    },
  },
  terracotta: {
    label: 'Bone · terracotta',
    swatch: ['#A8513D', '#F3EEE3', '#1E1611'],
    vars: {
      'bg': '#F3EEE3', 'bg-2': '#EBE3D0', 'bg-3': '#D9C9AE',
      'paper': '#FBF6EB', 'paper-2': '#FFFCF5',
      'ink': '#1E1611', 'ink-2': '#42342A', 'ink-3': '#7A6B57',
      'muted': '#A1937C', 'line': '#DDD0B6', 'line-2': '#C5B595',
      'accent': '#A8513D', 'accent-2': '#BC6650', 'accent-soft': '#EFD5C9',
    },
  },
  indigo: {
    label: 'Frost · indigo',
    swatch: ['#4F3FB3', '#F2F1F6', '#13111C'],
    vars: {
      'bg': '#F2F1F6', 'bg-2': '#E7E5EE', 'bg-3': '#D5D1E0',
      'paper': '#FAFAFC', 'paper-2': '#FFFFFF',
      'ink': '#13111C', 'ink-2': '#322E45', 'ink-3': '#605872',
      'muted': '#928CA1', 'line': '#DEDAE6', 'line-2': '#C8C2D4',
      'accent': '#4F3FB3', 'accent-2': '#6655C8', 'accent-soft': '#DDD7F0',
    },
  },
};

function applyPalette(name) {
  const p = PALETTES[name] || PALETTES.sage;
  const root = document.documentElement;
  Object.entries(p.vars).forEach(([k, v]) => root.style.setProperty(`--${k}`, v));
}

const KIOSK_TWEAKS = /*EDITMODE-BEGIN*/{
  "palette": "sage"
}/*EDITMODE-END*/;

function KioskTweaks() {
  const [t, setTweak] = useTweaks(KIOSK_TWEAKS);
  React.useEffect(() => { applyPalette(t.palette); }, [t.palette]);
  return (
    <TweaksPanel title="Tweaks">
      <TweakSection label="Color system"/>
      <TweakColor
        label="Palette"
        value={PALETTES[t.palette]?.swatch || PALETTES.sage.swatch}
        options={Object.values(PALETTES).map(p => p.swatch)}
        onChange={(swatch) => {
          const key = Object.keys(PALETTES).find(k => PALETTES[k].swatch === swatch);
          if (key) setTweak('palette', key);
        }}
      />
      <div style={{ fontSize: 11, color: '#9C9686', padding: '2px 4px 6px', lineHeight: 1.5 }}>
        {PALETTES[t.palette]?.label}
      </div>
    </TweaksPanel>
  );
}

const SCREENS = [
  { k:'idle',     label:'01 Idle' },
  { k:'choice',   label:'02 Welcome' },
  { k:'signin',   label:'03 Sign in' },
  { k:'register', label:'04 Register' },
  { k:'briefing', label:'05 Briefing' },
  { k:'consent',  label:'06 Consent' },
  { k:'quiz',     label:'07 Questions' },
  { k:'position', label:'08 Position' },
  { k:'capture',  label:'09 Photos' },
  { k:'voice',    label:'10 Voice' },
  { k:'breath',   label:'11 Breath' },
  { k:'done',     label:'12 Done' },
];

function KioskApp() {
  const [screen, setScreen] = React.useState('idle');
  const [user, setUser] = React.useState({ name: 'Priya' });

  // Keyboard nav for the prototype (arrow keys)
  React.useEffect(() => {
    function onKey(e) {
      const idx = SCREENS.findIndex(s => s.k === screen);
      if (e.key === 'ArrowRight') setScreen(SCREENS[Math.min(idx + 1, SCREENS.length - 1)].k);
      else if (e.key === 'ArrowLeft') setScreen(SCREENS[Math.max(idx - 1, 0)].k);
    }
    window.addEventListener('keydown', onKey);
    return () => window.removeEventListener('keydown', onKey);
  }, [screen]);

  const go = (k) => setScreen(k);

  const view = (() => {
    switch (screen) {
      case 'idle':     return <IdleScreen onBegin={() => go('choice')} />;
      case 'choice':   return <ChoiceScreen onReturning={() => go('signin')} onNew={() => go('register')} />;
      case 'signin':   return <SignInScreen onAuthed={(u) => { setUser(u); go('briefing'); }} onBack={() => go('choice')} />;
      case 'register': return <RegisterScreen onDone={(u) => { setUser(u); go('briefing'); }} onBack={() => go('choice')} />;
      case 'briefing': return <WelcomeScreen name={user.name} onBegin={() => go('consent')} onBack={() => go('choice')} />;
      case 'consent':  return <ConsentScreen onAgree={() => go('quiz')} onBack={() => go('briefing')} />;
      case 'quiz':     return <QuestionnaireScreen onDone={() => go('position')} onBack={() => go('consent')} />;
      case 'position': return <PositionScreen onReady={() => go('capture')} onBack={() => go('quiz')} />;
      case 'capture':  return <PhotoCaptureScreen onDone={() => go('voice')} onBack={() => go('position')} />;
      case 'voice':    return <VoiceScreen onDone={() => go('breath')} onBack={() => go('capture')} />;
      case 'breath':   return <BreathScreen onDone={() => go('done')} onBack={() => go('voice')} />;
      case 'done':     return <DoneScreen name={user.name} onFinish={() => go('idle')} />;
      default: return null;
    }
  })();

  return (
    <div className="swap enter" key={screen} data-screen-label={screen}>
      {view}
    </div>
  );
}

function ProtoBar() {
  const [cur, setCur] = React.useState('idle');
  React.useEffect(() => {
    // Watch the route in KioskApp by observing the screen element's data-screen-label
    const screen = document.getElementById('screen');
    if (!screen) return;
    const obs = new MutationObserver(() => {
      const swap = screen.querySelector('[data-screen-label]');
      if (swap) setCur(swap.dataset.screenLabel);
    });
    obs.observe(screen, { childList: true, subtree: true, attributes: true, attributeFilter: ['data-screen-label'] });
    return () => obs.disconnect();
  }, []);

  return (
    <>
      <span className="lbl">Screens</span>
      <div className="nav">
        {SCREENS.map(s => (
          <button key={s.k} className={cur === s.k ? 'cur' : ''} onClick={() => {
            // Re-dispatch through React state by simulating a key. Easiest: use a custom event.
            window.dispatchEvent(new CustomEvent('proto-goto', { detail: s.k }));
          }} title={s.label}>{s.label}</button>
        ))}
      </div>
      <span className="lbl">←  → to navigate</span>
    </>
  );
}

// Lift goto handler into KioskApp via a small bridge component
function KioskAppWithBridge() {
  const [screen, setScreen] = React.useState('idle');
  const [user, setUser] = React.useState({ name: 'Priya' });

  React.useEffect(() => {
    function onGoto(e) { setScreen(e.detail); }
    function onKey(e) {
      const idx = SCREENS.findIndex(s => s.k === screen);
      if (e.key === 'ArrowRight') setScreen(SCREENS[Math.min(idx + 1, SCREENS.length - 1)].k);
      else if (e.key === 'ArrowLeft') setScreen(SCREENS[Math.max(idx - 1, 0)].k);
    }
    window.addEventListener('proto-goto', onGoto);
    window.addEventListener('keydown', onKey);
    return () => { window.removeEventListener('proto-goto', onGoto); window.removeEventListener('keydown', onKey); };
  }, [screen]);

  const go = (k) => setScreen(k);

  const view = (() => {
    switch (screen) {
      case 'idle':     return <IdleScreen onBegin={() => go('choice')} />;
      case 'choice':   return <ChoiceScreen onReturning={() => go('signin')} onNew={() => go('register')} />;
      case 'signin':   return <SignInScreen onAuthed={(u) => { setUser(u); go('briefing'); }} onBack={() => go('choice')} />;
      case 'register': return <RegisterScreen onDone={(u) => { setUser(u); go('briefing'); }} onBack={() => go('choice')} />;
      case 'briefing': return <WelcomeScreen name={user.name} onBegin={() => go('consent')} onBack={() => go('choice')} />;
      case 'consent':  return <ConsentScreen onAgree={() => go('quiz')} onBack={() => go('briefing')} />;
      case 'quiz':     return <QuestionnaireScreen onDone={() => go('position')} onBack={() => go('consent')} />;
      case 'position': return <PositionScreen onReady={() => go('capture')} onBack={() => go('quiz')} />;
      case 'capture':  return <PhotoCaptureScreen onDone={() => go('voice')} onBack={() => go('position')} />;
      case 'voice':    return <VoiceScreen onDone={() => go('breath')} onBack={() => go('capture')} />;
      case 'breath':   return <BreathScreen onDone={() => go('done')} onBack={() => go('voice')} />;
      case 'done':     return <DoneScreen name={user.name} onFinish={() => go('idle')} />;
      default: return null;
    }
  })();

  return (
    <div className="swap enter" key={screen} data-screen-label={screen}>
      {view}
    </div>
  );
}

ReactDOM.createRoot(document.getElementById('screen')).render(<KioskAppWithBridge/>);
ReactDOM.createRoot(document.getElementById('protobar')).render(<ProtoBar/>);
ReactDOM.createRoot(document.getElementById('tweaks-root')).render(<KioskTweaks/>);
