const { useState, useEffect } = React;

// Apply tweaks to <html>
const applyTweaks = (t) => {
  const el = document.documentElement;
  el.setAttribute("data-card", t.cardStyle);
  el.setAttribute("data-cyan", t.cyanDepth);
  el.setAttribute("data-sidebar", t.sidebarSide);
  el.setAttribute("data-font", t.fontFamily);
  el.setAttribute("data-density", t.density);
  el.setAttribute("data-dark", String(!!t.darkMode));
};

const Seg = ({ value, options, onChange }) => (
  <div className="tweak-seg">
    {options.map(o => (
      <button key={o.v} className={value === o.v ? "on" : ""} onClick={() => onChange(o.v)}>{o.l}</button>
    ))}
  </div>
);

const TweaksPanel = ({ active, tweaks, setTweaks }) => {
  const set = (k, v) => setTweaks({ ...tweaks, [k]: v });
  return (
    <div className={"tweaks" + (active ? " on" : "")}>
      <h5>TWEAKS <span className="badge">DESIGN</span></h5>
      <div className="tweak-row">
        <label>カードの角丸</label>
        <Seg value={tweaks.cardStyle} onChange={v => set("cardStyle", v)}
          options={[{v:"square",l:"直線"},{v:"rounded",l:"標準"},{v:"soft",l:"丸め"}]}/>
      </div>
      <div className="tweak-row">
        <label>シアンの濃さ</label>
        <Seg value={tweaks.cyanDepth} onChange={v => set("cyanDepth", v)}
          options={[{v:"light",l:"淡い"},{v:"balanced",l:"標準"},{v:"bold",l:"濃い"}]}/>
      </div>
      <div className="tweak-row">
        <label>サイドバー位置</label>
        <Seg value={tweaks.sidebarSide} onChange={v => set("sidebarSide", v)}
          options={[{v:"left",l:"左"},{v:"right",l:"右"}]}/>
      </div>
      <div className="tweak-row">
        <label>日本語フォント</label>
        <Seg value={tweaks.fontFamily} onChange={v => set("fontFamily", v)}
          options={[{v:"gothic",l:"ゴシック"},{v:"mincho",l:"明朝"},{v:"maru",l:"丸ゴ"}]}/>
      </div>
      <div className="tweak-row">
        <label>記事カードの密度</label>
        <Seg value={tweaks.density} onChange={v => set("density", v)}
          options={[{v:"compact",l:"詰め"},{v:"comfortable",l:"標準"},{v:"airy",l:"ゆったり"}]}/>
      </div>
      <div className="tweak-row switch">
        <label style={{margin:0}}>ダークモード</label>
        <button className={"tweak-switch" + (tweaks.darkMode ? " on" : "")} onClick={() => set("darkMode", !tweaks.darkMode)}/>
      </div>
    </div>
  );
};

const App = () => {
  const D = window.BLOG_DATA;
  const [tweaks, setTweaks] = useState(window.TWEAKS);
  const [editActive, setEditActive] = useState(false);

  useEffect(() => { applyTweaks(tweaks); }, [tweaks]);

  // Edit-mode protocol
  useEffect(() => {
    const handler = (e) => {
      const d = e.data || {};
      if (d.type === "__activate_edit_mode") setEditActive(true);
      else if (d.type === "__deactivate_edit_mode") setEditActive(false);
    };
    window.addEventListener("message", handler);
    window.parent.postMessage({ type: "__edit_mode_available" }, "*");
    return () => window.removeEventListener("message", handler);
  }, []);

  // Persist tweaks via host
  const updateTweaks = (next) => {
    setTweaks(next);
    try {
      window.parent.postMessage({ type: "__edit_mode_set_keys", edits: next }, "*");
    } catch {}
  };

  return (
    <React.Fragment>
      <Announce/>
      <Header nav={D.nav}/>
      <Hero/>
      <CategoryStrip cats={D.categories}/>
      <div className="container">
        <main className="main">
          <Pickup items={D.pickup}/>
          <ArticlesSection articles={D.articles}/>
        </main>
        <aside className="sidebar">
          <ProfileWidget p={D.profile}/>
          <CtaWidget/>
          <CategoriesWidget cats={D.categories}/>
          <RankingWidget items={D.ranking}/>
          <NewsletterWidget/>
        </aside>
      </div>
      <Footer/>
      <TweaksPanel active={editActive} tweaks={tweaks} setTweaks={updateTweaks}/>
    </React.Fragment>
  );
};

ReactDOM.createRoot(document.getElementById("root")).render(<App/>);
