// Main app — sidebar + sections
const { useState, useEffect, useRef, useMemo } = React;

function App() {
  const defaults = window.__TWEAK_DEFAULTS || { lang: "ja", theme: "light", accent: "blue" };
  const [tweaks, setTweak] = useTweaks(defaults);
  const [activeId, setActiveId] = useState("hero");
  const [showTweaks, setShowTweaks] = useState(false);

  const lang = tweaks.lang || "ja";
  const theme = tweaks.theme || "light";
  const t = window.CONTENT[lang];

  // Apply theme to <html>
  useEffect(() => {
    document.documentElement.setAttribute("data-theme", theme);
  }, [theme]);

  // Apply accent color
  useEffect(() => {
    const root = document.documentElement;
    const map = {
      blue:  { a: "#1f4e8c", a2: "#2d6cb8", soft: "#e7eef9" },
      teal:  { a: "#0e6e6b", a2: "#149491", soft: "#e0f2f1" },
      slate: { a: "#1e2a3a", a2: "#374a63", soft: "#e8ecf2" },
      navy:  { a: "#0f2a52", a2: "#1f4480", soft: "#e3eaf6" },
    };
    const c = map[tweaks.accent] || map.blue;
    root.style.setProperty("--accent", c.a);
    root.style.setProperty("--accent-2", c.a2);
    if (theme === "light") root.style.setProperty("--accent-soft", c.soft);
  }, [tweaks.accent, theme]);

  // Scroll spy
  useEffect(() => {
    const ids = t.nav.map(n => n.id);
    const handler = () => {
      const scrollY = window.scrollY + 200;
      let current = ids[0];
      for (const id of ids) {
        const el = document.getElementById(id);
        if (el && el.offsetTop <= scrollY) current = id;
      }
      setActiveId(current);
    };
    handler();
    window.addEventListener("scroll", handler, { passive: true });
    return () => window.removeEventListener("scroll", handler);
  }, [lang]);

  // Tweaks panel host protocol
  useEffect(() => {
    const onMsg = (e) => {
      if (!e.data) return;
      if (e.data.type === "__activate_edit_mode") setShowTweaks(true);
      if (e.data.type === "__deactivate_edit_mode") setShowTweaks(false);
    };
    window.addEventListener("message", onMsg);
    window.parent.postMessage({ type: "__edit_mode_available" }, "*");
    return () => window.removeEventListener("message", onMsg);
  }, []);

  const onNavClick = (e, id) => {
    e.preventDefault();
    const el = document.getElementById(id);
    if (!el) return;
    window.scrollTo({ top: id === "hero" ? 0 : el.offsetTop - 20, behavior: "smooth" });
  };

  return (
    <React.Fragment>
      <div className="app">
        <Sidebar t={t} activeId={activeId} onNavClick={onNavClick}
                 lang={lang} theme={theme}
                 setTweak={setTweak} />
        <main className="main">
          <Hero t={t} />
          <About t={t} />
          <Strengths t={t} />
          <Achievements t={t} />
          <Skills t={t} />
          <Career t={t} />
          <Research t={t} />
          <Leadership t={t} />
          <Activities t={t} />
          <Vision t={t} />
          <Works t={t} />
          <Footer t={t} />
        </main>
      </div>
      {showTweaks && (
        <TweaksPanel
          title="Tweaks"
          onClose={() => setShowTweaks(false)}
          initialPosition={{ right: 20, bottom: 20 }}
          width={300}
        >
          <TweakSection title="言語 / Language">
            <TweakRadio
              value={tweaks.lang}
              options={[{ value: "ja", label: "日本語" }, { value: "en", label: "English" }]}
              onChange={(v) => setTweak("lang", v)}
            />
          </TweakSection>
          <TweakSection title="表示 / Theme">
            <TweakRadio
              value={tweaks.theme}
              options={[{ value: "light", label: "Light" }, { value: "dark", label: "Dark" }]}
              onChange={(v) => setTweak("theme", v)}
            />
          </TweakSection>
          <TweakSection title="アクセント / Accent">
            <TweakRadio
              value={tweaks.accent}
              options={[
                { value: "blue", label: "Blue" },
                { value: "navy", label: "Navy" },
                { value: "teal", label: "Teal" },
                { value: "slate", label: "Slate" },
              ]}
              onChange={(v) => setTweak("accent", v)}
            />
          </TweakSection>
        </TweaksPanel>
      )}
    </React.Fragment>
  );
}

// ---------- Sidebar ----------
function Sidebar({ t, activeId, onNavClick, lang, theme, setTweak }) {
  return (
    <aside className="sidebar">
      <div className="brand">
        <div className="monogram">M</div>
        <div className="brand-text">
          <div className="label">{t.brand.label}</div>
          <div className="role">{t.brand.role}</div>
        </div>
      </div>

      <div>
        <div className="nav-section-label">Index</div>
        <nav className="nav">
          {t.nav.map(item => (
            <a key={item.id} href={`#${item.id}`}
               className={activeId === item.id ? "active" : ""}
               onClick={(e) => onNavClick(e, item.id)}>
              <span className="num">{item.num}</span>
              <span>{item.label}</span>
              {lang === "ja" && <span className="en">{item.en}</span>}
            </a>
          ))}
        </nav>
      </div>

      <div className="sidebar-footer">
        <div>
          <div className="sw-label">{t.sw.lang}</div>
          <div className="sw-row">
            <button className={`sw-btn ${lang === "ja" ? "active" : ""}`} onClick={() => setTweak("lang", "ja")}>JA</button>
            <button className={`sw-btn ${lang === "en" ? "active" : ""}`} onClick={() => setTweak("lang", "en")}>EN</button>
          </div>
        </div>
        <div>
          <div className="sw-label">{t.sw.theme}</div>
          <div className="sw-row">
            <button className={`sw-btn ${theme === "light" ? "active" : ""}`} onClick={() => setTweak("theme", "light")}>LIGHT</button>
            <button className={`sw-btn ${theme === "dark" ? "active" : ""}`} onClick={() => setTweak("theme", "dark")}>DARK</button>
          </div>
        </div>
      </div>
    </aside>
  );
}

// ---------- Hero ----------
function Hero({ t }) {
  return (
    <section id="hero" className="hero" data-screen-label="00 Hero">
      <div className="hero-eyebrow">{t.hero.eyebrow}</div>
      <h1 className="hero-catch">
        {t.hero.catch1}<br />
        <span className="accent">{t.hero.catch2}</span>
      </h1>
      <p className="hero-sub">{t.hero.sub}</p>
      <div className="hero-meta">
        {t.hero.meta.map((m, i) => (
          <div className="hero-meta-item" key={i}>
            <div className="k">{m.k}</div>
            <div className="v">{m.v}</div>
          </div>
        ))}
      </div>
      <div className="hero-scroll">{t.hero.scroll}</div>
    </section>
  );
}

// ---------- Section header helper ----------
function SectionHead({ num, en, title }) {
  return (
    <header className="section-head">
      <div className="section-num">{num}</div>
      <div className="section-title-block">
        <div className="section-en">{en}</div>
        <h2 className="section-title">{title}</h2>
      </div>
    </header>
  );
}

// ---------- About ----------
function About({ t }) {
  const s = t.sections.about;
  return (
    <section id="about" className="block" data-screen-label="01 About">
      <div className="container">
        <SectionHead num="— 01" en={s.en} title={s.title} />
        <div className="section-body">
          {s.body.map((p, i) => (
            <p key={i} className="lead" dangerouslySetInnerHTML={{ __html: p.replace(/「(.+?)」/g, '<strong>「$1」</strong>') }} />
          ))}
        </div>
      </div>
    </section>
  );
}

// ---------- Strengths ----------
function Strengths({ t }) {
  const s = t.sections.strengths;
  return (
    <section id="strengths" className="block" data-screen-label="02 Strengths">
      <div className="container">
        <SectionHead num="— 02" en={s.en} title={s.title} />
        <div className="section-body">
          <div className="strengths">
            {s.items.map((it, i) => (
              <div className="strength-row" key={i}>
                <div className="idx">0{i+1}</div>
                <div>
                  <h3>{it.h}</h3>
                  <p>{it.p}</p>
                </div>
              </div>
            ))}
          </div>
        </div>
      </div>
    </section>
  );
}

// ---------- Achievements ----------
function Achievements({ t }) {
  const s = t.sections.achievements;
  return (
    <section id="achievements" className="block" data-screen-label="03 Achievements">
      <div className="container">
        <SectionHead num="— 03" en={s.en} title={s.title} />
        <div className="section-body">
          <div className="stats">
            {s.stats.map((st, i) => (
              <div className="stat" key={i}>
                <div className="num">{st.num}{st.unit && <span className="unit">{st.unit}</span>}</div>
                <div className="label">{st.label}</div>
                <div className="sub">{st.sub}</div>
              </div>
            ))}
          </div>
          <p className="lead" style={{ marginTop: 24 }}>{s.extra}</p>
        </div>
      </div>
    </section>
  );
}

// ---------- Skills ----------
function Skills({ t }) {
  const s = t.sections.skills;
  return (
    <section id="skills" className="block" data-screen-label="04 Skills">
      <div className="container">
        <SectionHead num="— 04" en={s.en} title={s.title} />
        <div className="section-body">
          <div className="skills-grid">
            {s.cols.map((col, i) => (
              <div className="skill-col" key={i}>
                <h4>{col.h}</h4>
                <ul>
                  {col.items.map((it, j) => (
                    <li key={j}>
                      <span>{it.t}</span>
                      {it.b && <span className="badge">{it.b}</span>}
                    </li>
                  ))}
                </ul>
              </div>
            ))}
          </div>
        </div>
      </div>
    </section>
  );
}

// ---------- Career ----------
function Career({ t }) {
  const s = t.sections.career;
  return (
    <section id="career" className="block" data-screen-label="05 Career">
      <div className="container">
        <SectionHead num="— 05" en={s.en} title={s.title} />
        <div className="section-body">
          <div className="timeline">
            {s.rows.map((r, i) => (
              <div className="tl-row" key={i}>
                <div className="tl-year">{r.year}</div>
                <div className="tl-content">
                  <h3>{r.h}</h3>
                  <p>{r.p}</p>
                  {r.tag && <span className="tl-tag">★ {r.tag}</span>}
                </div>
              </div>
            ))}
          </div>
        </div>
      </div>
    </section>
  );
}

// ---------- Research ----------
function Research({ t }) {
  const s = t.sections.research;
  return (
    <section id="research" className="block" data-screen-label="06 Research">
      <div className="container">
        <SectionHead num="— 06" en={s.en} title={s.title} />
        <div className="section-body">
          {s.body.map((p, i) => <p key={i} className="lead">{p}</p>)}
        </div>
      </div>
    </section>
  );
}

// ---------- Leadership ----------
function Leadership({ t }) {
  const s = t.sections.leadership;
  return (
    <section id="leadership" className="block" data-screen-label="07 Leadership">
      <div className="container">
        <SectionHead num="— 07" en={s.en} title={s.title} />
        <div className="section-body">
          {s.cards.map((c, i) => (
            <div className="lead-card" key={i}>
              <h3>{c.h}<span className="role-tag">{c.tag}</span></h3>
              <p>{c.p}</p>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

// ---------- Activities ----------
function Activities({ t }) {
  const s = t.sections.activities;
  return (
    <section id="activities" className="block" data-screen-label="08 Activities">
      <div className="container">
        <SectionHead num="— 08" en={s.en} title={s.title} />
        <div className="section-body">
          <div className="activity-list">
            {s.items.map((it, i) => (
              <div className="activity" key={i}>
                <div className="text">{it.t}</div>
                <div className="figure">{it.f}</div>
              </div>
            ))}
          </div>
        </div>
      </div>
    </section>
  );
}

// ---------- Vision ----------
function Vision({ t }) {
  const s = t.sections.vision;
  return (
    <section id="vision" className="block" data-screen-label="09 Vision">
      <div className="container">
        <SectionHead num="— 09" en={s.en} title={s.title} />
        <div className="section-body">
          <p className="vision-quote">{s.quote}</p>
          <div className="vision-body">
            {s.body.map((p, i) => <p key={i}>{p}</p>)}
          </div>
        </div>
      </div>
    </section>
  );
}

// ---------- Works ----------
function Works({ t }) {
  const s = t.sections.works;
  return (
    <section id="works" className="block" data-screen-label="10 Works">
      <div className="container">
        <SectionHead num="— 10" en={s.en} title={s.title} />
        <div className="section-body">
          <div className="works-intro">
            <p className="lead" style={{ margin: 0 }}>{s.intro}</p>
            <span className="count">{s.count}</span>
          </div>
          <div className="works-grid">
            {s.items.map((w, i) => (
              <WorkCard key={i} work={w} viewLabel={s.view} />
            ))}
          </div>
        </div>
      </div>
    </section>
  );
}

function WorkCard({ work, viewLabel }) {
  const [loaded, setLoaded] = useState(false);
  const [inView, setInView] = useState(false);
  const ref = useRef(null);

  useEffect(() => {
    if (!ref.current) return;
    const obs = new IntersectionObserver((entries) => {
      entries.forEach(en => { if (en.isIntersecting) { setInView(true); obs.disconnect(); } });
    }, { rootMargin: "200px" });
    obs.observe(ref.current);
    return () => obs.disconnect();
  }, []);

  const urlDisplay = work.url.replace(/^https?:\/\//, "");

  return (
    <div className="work-card" ref={ref}>
      <div className={`work-frame ${loaded ? "loaded" : ""}`}>
        {inView && (
          <iframe
            src={work.url}
            loading="lazy"
            sandbox="allow-scripts allow-same-origin"
            referrerPolicy="no-referrer"
            onLoad={() => setLoaded(true)}
            title={work.title}
          />
        )}
        <div className="loading-shim">{loaded ? "" : "LOADING…"}</div>
      </div>
      <div className="work-meta">
        <h3>{work.title}</h3>
        <div className="url">{urlDisplay}</div>
        <div className="actions">
          <a href={work.url} target="_blank" rel="noopener noreferrer">{viewLabel}</a>
        </div>
      </div>
    </div>
  );
}

// ---------- Footer / Contact ----------
function Footer({ t }) {
  const s = t.sections.contact;
  return (
    <footer id="contact" className="footer" data-screen-label="11 Contact">
      <div className="container">
        <div className="deco-line"></div>
        <p className="footer-cta">{s.cta}</p>
        <div className="footer-links">
          <a href="https://github.com/snowbal" target="_blank" rel="noopener noreferrer">↗ {s.github}</a>
          <a href="https://www.youware.com/profile/Aw9sp4c0LGVAgUYZ0xH1w3He5xw1" target="_blank" rel="noopener noreferrer">↗ {s.youware}</a>
        </div>
        <div className="footer-fine">
          <span>© {s.copy}</span>
          <span>{s.focus}</span>
        </div>
      </div>
    </footer>
  );
}

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