// Looks studio — explore Canvas colour, Headline style and Density, then SAVE
// looks you like to a shortlist and flip between them to compare. Everything
// persists to localStorage and applies by toggling body classes that
// variants.css + light.css act on. Portalled into <body> so it themes correctly.

const CANVASES = [
  { id: 'navy',     name: 'Control room', desc: 'Deep navy (default)', pill: 'Default', bg: '#0B2545', side: '#081B33', light: false },
  { id: 'graphite', name: 'Graphite',     desc: 'Cool charcoal',       bg: '#161B22', side: '#0E1116', light: false },
  { id: 'indigo',   name: 'Indigo',       desc: 'Deep indigo',         bg: '#141A40', side: '#0A0E2A', light: false },
  { id: 'light',    name: 'Daylight',     desc: 'White, navy menu',    bg: '#FFFFFF', side: '#0B2545', light: true },
];

// apply a look to <body>
function applyLook({ canvas, font, density }) {
  const b = document.body;
  b.classList.remove('theme-light', 'canvas-graphite', 'canvas-indigo');
  if (canvas === 'light') b.classList.add('theme-light');
  else if (canvas === 'graphite') b.classList.add('canvas-graphite');
  else if (canvas === 'indigo') b.classList.add('canvas-indigo');
  b.classList.toggle('font-sans', font === 'sans');
  b.classList.toggle('density-compact', density === 'compact');
}

function lookName({ canvas, font, density }) {
  const c = (CANVASES.find(x => x.id === canvas) || CANVASES[0]).name;
  return [c, font === 'sans' ? 'Modern' : 'Editorial', density === 'compact' ? 'Compact' : null].filter(Boolean).join(' · ');
}

function Choice({ on, onClick, preview, name, desc, pill }) {
  return (
    <button className={`ap-card ${on ? 'on' : ''}`} onClick={onClick}>
      {preview}
      <div className="ap-meta">
        <div className="ap-name">{name}{pill && <span className="ap-pill">{pill}</span>}</div>
        <div className="ap-desc">{desc}</div>
      </div>
      <span className="ap-check"><Icon name="check" /></span>
    </button>
  );
}

function Appearance() {
  const [open, setOpen] = React.useState(false);
  const [canvas, setCanvas] = React.useState(() => localStorage.getItem('opsmera-canvas') || 'light');
  const [font, setFont] = React.useState(() => localStorage.getItem('opsmera-font') || 'sans');
  const [density, setDensity] = React.useState(() => localStorage.getItem('opsmera-density') || 'compact');
  const [saved, setSaved] = React.useState(() => {
    try { return JSON.parse(localStorage.getItem('opsmera-shortlist') || '[]'); } catch (e) { return []; }
  });

  React.useEffect(() => {
    applyLook({ canvas, font, density });
    localStorage.setItem('opsmera-canvas', canvas);
    localStorage.setItem('opsmera-font', font);
    localStorage.setItem('opsmera-density', density);
  }, [canvas, font, density]);
  React.useEffect(() => { localStorage.setItem('opsmera-shortlist', JSON.stringify(saved)); }, [saved]);

  const current = { canvas, font, density };
  const currentName = lookName(current);
  const alreadySaved = saved.some(s => s.canvas === canvas && s.font === font && s.density === density);

  function saveLook() {
    if (alreadySaved) return;
    setSaved([...saved, { id: Date.now(), ...current }]);
  }
  function applySaved(s) { setCanvas(s.canvas); setFont(s.font); setDensity(s.density); }
  function removeSaved(id, e) { e.stopPropagation(); setSaved(saved.filter(s => s.id !== id)); }

  const pop = open ? ReactDOM.createPortal(
    <React.Fragment>
      <div className="appearance-scrim" onClick={() => setOpen(false)} />
      <div className="appearance-pop">
        <div className="ap-top">
          <div className="ap-h"><Icon name="sparkles" />Looks</div>
          <button className="ap-x" onClick={() => setOpen(false)}><Icon name="x" /></button>
        </div>
        <div className="ap-sub">Try a look, then save the ones you like to compare. Changes apply instantly and are remembered.</div>

        <div className="ap-group">
          <div className="ap-glab">Canvas colour</div>
          <div className="ap-cards">
            {CANVASES.map(c => (
              <Choice key={c.id} on={canvas === c.id} onClick={() => setCanvas(c.id)}
                name={c.name} desc={c.desc} pill={c.pill}
                preview={
                  <div className="mini-swatch">
                    <div className="sw-side" style={{ background: c.side }} />
                    <div className="sw-body" style={{ background: c.bg }}>
                      <div className="sw-dot" />
                      <div className="sw-bar" style={{ width: '80%', background: c.light ? 'rgba(11,37,69,.18)' : 'rgba(255,255,255,.22)' }} />
                      <div className="sw-bar" style={{ width: '55%', background: c.light ? 'rgba(11,37,69,.12)' : 'rgba(255,255,255,.14)' }} />
                    </div>
                  </div>
                } />
            ))}
          </div>
        </div>

        <div className="ap-group">
          <div className="ap-glab">Headline style</div>
          <div className="ap-cards">
            <Choice on={font === 'serif'} onClick={() => setFont('serif')} name="Editorial" desc="Elegant serif"
              preview={<div className="mini mini-type serif"><span>Aa</span></div>} />
            <Choice on={font === 'sans'} onClick={() => setFont('sans')} name="Modern" desc="Clean sans-serif"
              preview={<div className="mini mini-type sans"><span>Aa</span></div>} />
          </div>
        </div>

        <div className="ap-group">
          <div className="ap-glab">Density</div>
          <div className="ap-cards">
            <Choice on={density === 'comfortable'} onClick={() => setDensity('comfortable')} name="Comfortable" desc="Roomy spacing"
              preview={<div className="mini-density"><div className="dl" style={{ width: '90%' }} /><div className="dl" style={{ width: '70%' }} /></div>} />
            <Choice on={density === 'compact'} onClick={() => setDensity('compact')} name="Compact" desc="More on screen"
              preview={<div className="mini-density tight"><div className="dl" style={{ width: '90%' }} /><div className="dl" style={{ width: '78%' }} /><div className="dl" style={{ width: '60%' }} /></div>} />
          </div>
        </div>

        <div className="ap-shortlist">
          <div className="ap-glab">Shortlist</div>
          <div className="ap-saverow">
            <button className="btn btn-primary btn-sm ap-save" onClick={saveLook} disabled={alreadySaved}>
              <Icon name={alreadySaved ? 'check' : 'bookmark-plus'} />{alreadySaved ? 'Saved' : 'Save this look'}
            </button>
          </div>
          {saved.length === 0
            ? <div className="ap-empty">No saved looks yet. Tap "Save this look" to add the current one ({currentName}), then build a shortlist to compare.</div>
            : <div className="ap-saved">
                {saved.map(s => {
                  const active = s.canvas === canvas && s.font === font && s.density === density;
                  return (
                    <span key={s.id} className={`ap-look ${active ? 'active' : ''}`} onClick={() => applySaved(s)} title="Apply this look">
                      {lookName(s)}
                      <span className="rm" onClick={(e) => removeSaved(s.id, e)} title="Remove"><Icon name="x" /></span>
                    </span>
                  );
                })}
              </div>}
        </div>
      </div>
    </React.Fragment>, document.body) : null;

  return (
    <React.Fragment>
      <button className={`icon-btn ap-trigger ${open ? 'on' : ''}`} onClick={() => setOpen(o => !o)} title="Looks">
        <Icon name="sliders-horizontal" />
      </button>
      {pop}
    </React.Fragment>
  );
}
Object.assign(window, { Appearance });
