// Main app — orchestrates the page + Tweaks panel.

const THEMES = [
  { key: "electric", label: "Electric", colors: ["#0a0a0a", "#d4ff3f", "#ffffff"] },
  { key: "violet",   label: "Violet",   colors: ["#0d0a1f", "#b58cff", "#f3edff"] },
  { key: "coral",    label: "Coral",    colors: ["#faf6f1", "#ff5d3c", "#181410"] },
  { key: "mint",     label: "Mint",     colors: ["#f6f8f4", "#0d6b4f", "#0c1612"] },
];

function ThemeChips({ value, onChange }) {
  return (
    <TweakRow label="Color theme">
      <div className="twk-chips" role="radiogroup">
        {THEMES.map(th => {
          const [hero, ...rest] = th.colors;
          const on = th.key === value;
          return (
            <button key={th.key} type="button" className="twk-chip" role="radio"
                    aria-checked={on} data-on={on ? "1" : "0"}
                    aria-label={th.label} title={th.label}
                    style={{ background: hero }}
                    onClick={() => onChange(th.key)}>
              <span>
                {rest.map((c, j) => <i key={j} style={{ background: c }} />)}
              </span>
            </button>
          );
        })}
      </div>
    </TweakRow>
  );
}

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "theme": "electric",
  "font": "modern",
  "hero": "score",
  "badge": "pill",
  "layout": "masonry"
}/*EDITMODE-END*/;

const REVIEWS = window.REVIEWS;
const SOURCES = window.SOURCES;

function App() {
  const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
  const [filter, setFilter] = React.useState("all");
  const [sort, setSort] = React.useState("newest");

  // Sync theme + font to <html> for CSS var swap
  React.useEffect(() => {
    document.documentElement.setAttribute("data-theme", t.theme);
    document.documentElement.setAttribute("data-font", t.font);
  }, [t.theme, t.font]);

  const counts = React.useMemo(() => {
    const c = {};
    for (const r of REVIEWS) c[r.source] = (c[r.source] || 0) + 1;
    return c;
  }, []);

  const visible = React.useMemo(() => {
    let arr = filter === "all" ? REVIEWS.slice() : REVIEWS.filter(r => r.source === filter);
    arr.sort((a, b) => {
      switch (sort) {
        case "oldest": return a.date.localeCompare(b.date);
        case "rating-high": return b.rating - a.rating || b.date.localeCompare(a.date);
        case "rating-low": return a.rating - b.rating || b.date.localeCompare(a.date);
        case "helpful": return b.helpful - a.helpful;
        default: return b.date.localeCompare(a.date);
      }
    });
    return arr;
  }, [filter, sort]);

  const renderHero = () => {
    if (t.hero === "quote") return <HeroQuote reviews={REVIEWS} badgeStyle={t.badge} />;
    if (t.hero === "stats") return <HeroStats badgeStyle={t.badge} />;
    return <HeroScore badgeStyle={t.badge} />;
  };

  const renderLayout = () => {
    if (t.layout === "grid") {
      return (
        <div className="layout-grid">
          {visible.map(r => <ReviewCard key={r.id} review={r} badgeStyle={t.badge} />)}
        </div>
      );
    }
    if (t.layout === "feed") {
      return (
        <div className="layout-feed">
          {visible.map(r => <ReviewCard key={r.id} review={r} badgeStyle={t.badge} variant="feed" />)}
        </div>
      );
    }
    if (t.layout === "list") {
      return (
        <div className="layout-list">
          {visible.map(r => <ListRow key={r.id} review={r} badgeStyle={t.badge} />)}
        </div>
      );
    }
    return (
      <div className="layout-masonry">
        {visible.map(r => <ReviewCard key={r.id} review={r} badgeStyle={t.badge} />)}
      </div>
    );
  };

  return (
    <>
      <div className="shell">
        <header className="nav">
          <div className="nav-brand">
            <span className="dot"></span>
            eitareviews<span style={{ color: "var(--ink-3)" }}>.com</span>
          </div>
          <nav className="nav-meta">
            <a href="#reviews">Reviews</a>
            <a href="#sources">Sources</a>
            <a href="https://e-ita.org" target="_blank" rel="noreferrer">e-ita.org ↗</a>
          </nav>
          <button className="nav-cta" onClick={() => window.open("https://e-ita.org", "_blank")}>
            Get your IDP →
          </button>
        </header>

        {renderHero()}

        <div className="section-head" id="reviews">
          <div className="left">
            <span className="eyebrow"><span className="bar" />ALL REVIEWS</span>
            <h2>What people are saying.</h2>
            <div className="count">{visible.length} of {REVIEWS.length} shown · sorted by {sort.replace("-", " ")}</div>
          </div>
        </div>

        <FilterBar
          active={filter} onChange={setFilter}
          sort={sort} onSort={setSort}
          counts={counts}
          layout={t.layout} onLayout={v => setTweak("layout", v)}
        />

        {renderLayout()}

        <footer className="foot">
          <div>© 2026 eitareviews.com — independent aggregator</div>
          <div style={{ display: "flex", gap: 24 }}>
            <a href="#">Methodology</a>
            <a href="#">Sources</a>
            <a href="https://e-ita.org" target="_blank" rel="noreferrer">Visit e-ita.org</a>
          </div>
        </footer>
      </div>

      <TweaksPanel title="Tweaks">
        <TweakSection label="Theme" />
        <ThemeChips value={t.theme} onChange={v => setTweak("theme", v)} />

        <TweakSection label="Typography" />
        <TweakSelect
          label="Font pairing"
          value={t.font}
          options={[
            { value: "modern",     label: "Modern · Geist" },
            { value: "editorial",  label: "Editorial · Instrument Serif" },
            { value: "techno",     label: "Techno · Space Grotesk" },
            { value: "industrial", label: "Industrial · Archivo" },
          ]}
          onChange={v => setTweak("font", v)}
        />

        <TweakSection label="Layout" />
        <TweakSelect
          label="Hero layout"
          value={t.hero}
          options={[
            { value: "score", label: "Aggregate score" },
            { value: "quote", label: "Quote carousel" },
            { value: "stats", label: "Stats grid" },
          ]}
          onChange={v => setTweak("hero", v)}
        />
        <TweakSelect
          label="Reviews layout"
          value={t.layout}
          options={[
            { value: "masonry", label: "Masonry" },
            { value: "grid",    label: "Uniform grid" },
            { value: "feed",    label: "Single column feed" },
            { value: "list",    label: "Dense list" },
          ]}
          onChange={v => setTweak("layout", v)}
        />

        <TweakSection label="Source badges" />
        <TweakRadio
          label="Style"
          value={t.badge}
          options={[
            { value: "pill",    label: "Pill" },
            { value: "outline", label: "Outline" },
            { value: "minimal", label: "Minimal" },
            { value: "dot",     label: "Dot" },
          ]}
          onChange={v => setTweak("badge", v)}
        />
      </TweaksPanel>
    </>
  );
}

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