/* Main app: assembles the board.
   Positions are computed once on mount from viewport size so the layout
   fits any screen. Drag positions stay in component state from there. */

const { useState: useStateApp, useEffect: useEffectApp, useMemo, useCallback: useCallbackApp } = React;

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "palette": "cream",
  "lang": "en"
} /*EDITMODE-END*/;

const PALETTES = [
{ id: "cream", name: "Krem", swatch: ["#efe9dc", "#e94f2e", "#f0ff3d"] },
{ id: "cobalt", name: "Kobalt", swatch: ["#ecebe2", "#2956d8", "#e9ff3d"] },
{ id: "forest", name: "Las", swatch: ["#eee9d8", "#2f6b3c", "#f0ff3d"] },
{ id: "ink", name: "Atrament", swatch: ["#131210", "#ff6a3d", "#e8ff45"] }];


/* Per-case wiring: a thumbnail image + a case-study id make a card clickable.
   Cases with a null id are not yet clickable. */
const CASE_THUMBS = ["uploads/1-case-study-thumbnail.jpg", "uploads/Thumbnail2.jpg", "uploads/Thumbnail.jpg"];
const CASE_IDS = ["mattereum", "blackkeycard", "flownow"];


function bringToTopFactory() {
  let z = 10;
  return () => ++z;
}

/* Position the board for the current viewport. Returns initial coords per element. */
function computeLayout() {
  const W = Math.max(window.innerWidth, 320);
  const H = Math.max(window.innerHeight, 600);

  const right = W;
  const bottom = H;

  // Viewport mode: under 900px we switch to a scrollable vertical layout
  // with section dividers. Above 900px we keep the hand-arranged board.
  const isMobile = W < 900;

  // Sizes (kept in sync with CSS) — case photo is now square (1:1)
  const caseW = 268;
  const caseH = 372; // ~ square photo + caption + bottom padding
  const polaroidW = 268;
  const contactW = 260;
  const stickyW = 200;

  // ── Case studies: a tight fanned STACK in the top-left corner.
  const caseAnchorX = 96;
  const caseAnchorY = 96;

  // ── Testimonials: 3 fanned cards in the bottom-left, each independently
  // draggable. Anchor is the back-left card; the others sit forward + offset.
  const tstackX = 64;
  const tstackBaseY = Math.max(bottom - 260 - 80, caseAnchorY + caseH + 24);

  return {
    isMobile,
    polaroid: { x: right - polaroidW - 56, y: 80, rot: 3.5 },
    contact: { x: right - contactW - 56, y: bottom - 240, rot: -2.5 },

    case1: { x: caseAnchorX + 0, y: caseAnchorY + 4, rot: -7 },
    case2: { x: caseAnchorX + 38, y: caseAnchorY + 18, rot: 4 },
    case3: { x: caseAnchorX + 72, y: caseAnchorY - 2, rot: -2 },

    testimonial1: { x: tstackX + 0, y: tstackBaseY + 24, rot: -8 },
    testimonial2: { x: tstackX + 36, y: tstackBaseY + 12, rot: 5 },
    testimonial3: { x: tstackX + 78, y: tstackBaseY + 0, rot: -2 },

    arrow: {
      labelX: W / 2,
      labelY: 38,
      tipX: caseAnchorX + caseW + 72 + 70,
      tipY: caseAnchorY + 6
    },
    showArrow: W >= 900,
    showStickies: W >= 900 && H >= 720
  };
}

function App() {
  const [layout, setLayout] = useStateApp(() => computeLayout());
  const [tweaks, setTweak] = useTweaks(TWEAK_DEFAULTS);
  const [openIdx, setOpenIdx] = useStateApp(null);
  const [openCaseId, setOpenCaseId] = useStateApp(null);
  const bringToTop = useMemo(bringToTopFactory, []);

  // Re-compute layout once per viewport-resize (debounced via rAF)
  useEffectApp(() => {
    let frame;
    const onResize = () => {
      cancelAnimationFrame(frame);
      frame = requestAnimationFrame(() => setLayout(computeLayout()));
    };
    window.addEventListener("resize", onResize);
    return () => window.removeEventListener("resize", onResize);
  }, []);

  // Apply palette via data attribute on <html>
  useEffectApp(() => {
    document.documentElement.dataset.palette = tweaks.palette;
  }, [tweaks.palette]);

  const t = I18N[tweaks.lang] || I18N.pl;

  // Long-form case studies for the current language. Only ids present here
  // are clickable; the modal opens for whichever id is set.
  const caseStudies = window.CASE_STUDIES && (window.CASE_STUDIES[tweaks.lang] || window.CASE_STUDIES.en) || {};
  const openStudy = openCaseId ? caseStudies[openCaseId] : null;
  const closeCase = useCallbackApp(() => setOpenCaseId(null), []);
  const caseModal = openStudy ?
  <CaseStudyModal
    study={openStudy}
    tocLabel={t.tocLabel}
    introLabel={t.introLabel}
    closeLabel={t.closeLabel}
    onClose={closeCase} /> :
  null;

  // Modal navigation — loops infinitely.
  const closeModal = useCallbackApp(() => setOpenIdx(null), []);
  const nextModal = useCallbackApp(() => {
    setOpenIdx((i) => i == null ? null : (i + 1) % t.testimonials.length);
  }, [t.testimonials.length]);
  const prevModal = useCallbackApp(() => {
    setOpenIdx((i) => i == null ? null : (i - 1 + t.testimonials.length) % t.testimonials.length);
  }, [t.testimonials.length]);

  // ── Shared pieces ─────────────────────────────────────────────
  const authorPolaroid =
  <Polaroid
    photo="assets/natalia-yockelle.jpg"
    caption={t.polaroidName}
    sub={t.polaroidSub}
    width={layout.isMobile ? 248 : 268} />;


  const centerpiece =
  <div className="centerpiece">
      <div className="headline">
        <span className="hl-swipe"></span>
        <span className="product">{t.product}</span>
        <span className="designer">{t.designer}</span>
      </div>
      <p className="hero-tagline">{t.heroTagline}</p>
    </div>;


  const chrome =
  <div className="chrome">
      <span>{t.chromeL}</span>
      <span style={{ display: "inline-flex", gap: 16, alignItems: "center" }}>
        {t.chromeR && <span>{t.chromeR}</span>}
        <span className="lang-toggle">
          <button
          className={tweaks.lang === "pl" ? "active" : ""}
          onClick={() => setTweak("lang", "pl")}>
            PL</button>
          <button
          className={tweaks.lang === "en" ? "active" : ""}
          onClick={() => setTweak("lang", "en")}>
            EN</button>
        </span>
      </span>
    </div>;


  const tweaksPanel =
  <TweaksPanel title="Tweaks">
      <TweakSection label={tweaks.lang === "pl" ? "Wygląd" : "Look"}>
        <TweakRow label={tweaks.lang === "pl" ? "Paleta" : "Palette"}>
          <div style={{ display: "flex", gap: 8 }}>
            {PALETTES.map((p) => {
            const on = tweaks.palette === p.id;
            return (
              <button
                key={p.id}
                type="button"
                onClick={() => setTweak("palette", p.id)}
                title={p.name}
                aria-label={p.name}
                style={{
                  width: 44, height: 28, padding: 0,
                  border: on ? "2px solid #111" : "1px solid rgba(0,0,0,.15)",
                  borderRadius: 6, cursor: "pointer", overflow: "hidden",
                  display: "flex", background: p.swatch[0],
                  boxShadow: on ? "0 0 0 2px rgba(255,255,255,.9) inset" : "none"
                }}>
                  <span style={{ flex: 1, background: p.swatch[0] }} />
                  <span style={{ width: 10, background: p.swatch[1] }} />
                  <span style={{ width: 10, background: p.swatch[2] }} />
                </button>);
          })}
          </div>
        </TweakRow>
        <TweakRadio
        label={tweaks.lang === "pl" ? "Język" : "Language"}
        value={tweaks.lang}
        options={[
        { value: "pl", label: "PL" },
        { value: "en", label: "EN" }]
        }
        onChange={(v) => setTweak("lang", v)} />
      </TweakSection>
    </TweaksPanel>;


  // ───────────── MOBILE / TABLET ─────────────
  if (layout.isMobile) {
    return (
      <React.Fragment>
        <div className="board mobile"></div>
        {chrome}

        <main className="mobile-main">
          <section className="hero-block" data-screen-label="01 Hero">
            <div className="hero-author">
              <StaticCard rotation={3}>{authorPolaroid}</StaticCard>
            </div>
            {centerpiece}
          </section>

          <SectionDivider label={t.sectionWork} />

          <section className="cases-stack" data-screen-label="02 Selected work">
            {t.cases.map((c, i) => {
              const caseId = CASE_IDS[i];
              const thumb = CASE_THUMBS[i];
              return (
                <StaticCard
                  key={c.n}
                  rotation={i % 2 === 0 ? -1.4 : 1.6}
                  className="case-wrap">
                  <CaseCard
                    n={c.n}
                    art={thumb ?
                    <img className="case-thumb" src={thumb} alt={c.title} draggable="false" /> :
                    <CaseArt palette={CASE_PALETTES[i].palette} label={CASE_PALETTES[i].label} />}
                    title={c.title}
                    meta={c.meta}
                    tags={c.tags}
                    tape={c.tape}
                    width="100%"
                    clickable={!!caseId}
                    onOpen={caseId ? () => setOpenCaseId(caseId) : undefined}
                    readLabel={t.readCase} />
                </StaticCard>);

            })}
          </section>

          <SectionDivider label={t.sectionTestimonials} />

          <section className="stickies-stack" data-screen-label="03 Testimonials">
            {t.testimonials.map((tt, i) =>
            <TestimonialCard
              key={i}
              testimonial={tt}
              color={tt.color}
              compact={true}
              readLabel={t.readMore}
              onRead={() => setOpenIdx(i)} />
            )}
          </section>

          <SectionDivider label={t.sectionContact} />

          <section className="contact-block" data-screen-label="04 Contact">
            <StaticCard rotation={-2}>
              <ContactNote
                title={t.contactTitle}
                labels={{ mail: t.labelMail, tel: t.labelTel, in: t.labelIn }}
                contact={CONTACT} />
            </StaticCard>
          </section>

          <div className="mobile-footnote">
            <span className="pulse"></span>
            <span>{t.available}</span>
          </div>
        </main>

        <TestimonialModal
          testimonials={t.testimonials}
          openIdx={openIdx}
          onClose={closeModal}
          onPrev={prevModal}
          onNext={nextModal}
          prevLabel={t.prevLabel}
          nextLabel={t.nextLabel}
          closeLabel={t.closeLabel} />

        {caseModal}

        {tweaksPanel}
      </React.Fragment>);

  }

  // ───────────── DESKTOP ─────────────
  return (
    <React.Fragment>
      <div className="board"></div>
      {chrome}
      {centerpiece}

      {layout.showArrow &&
      <SelectedWorkArrow
        label={t.selectedWork}
        labelX={layout.arrow.labelX}
        labelY={layout.arrow.labelY}
        tipX={layout.arrow.tipX}
        tipY={layout.arrow.tipY} />
      }

      <Card
        initial={{ x: layout.polaroid.x, y: layout.polaroid.y }}
        rotation={layout.polaroid.rot}
        z={5}
        bringToTop={bringToTop}>
        {authorPolaroid}
      </Card>

      <Card
        initial={{ x: layout.contact.x, y: layout.contact.y }}
        rotation={layout.contact.rot}
        z={4}
        bringToTop={bringToTop}>
        <ContactNote
          title={t.contactTitle}
          labels={{ mail: t.labelMail, tel: t.labelTel, in: t.labelIn }}
          contact={CONTACT} />
      </Card>

      <Card
        initial={{ x: layout.case1.x, y: layout.case1.y }}
        rotation={layout.case1.rot}
        z={7}
        bringToTop={bringToTop}>
        <CaseCard
          n={t.cases[0].n}
          art={CASE_THUMBS[0] ?
          <img className="case-thumb" src={CASE_THUMBS[0]} alt={t.cases[0].title} draggable="false" /> :
          <CaseArt palette={CASE_PALETTES[0].palette} label={CASE_PALETTES[0].label} />}
          title={t.cases[0].title}
          meta={t.cases[0].meta}
          tags={t.cases[0].tags}
          tape={t.cases[0].tape}
          clickable={!!CASE_IDS[0]}
          onOpen={CASE_IDS[0] ? () => setOpenCaseId(CASE_IDS[0]) : undefined}
          readLabel={t.readCase} />
      </Card>

      <Card
        initial={{ x: layout.case2.x, y: layout.case2.y }}
        rotation={layout.case2.rot}
        z={4}
        bringToTop={bringToTop}>
        <CaseCard
          n={t.cases[1].n}
          art={CASE_THUMBS[1] ?
          <img className="case-thumb" src={CASE_THUMBS[1]} alt={t.cases[1].title} draggable="false" /> :
          <CaseArt palette={CASE_PALETTES[1].palette} label={CASE_PALETTES[1].label} />}
          title={t.cases[1].title}
          meta={t.cases[1].meta}
          tags={t.cases[1].tags}
          tape={t.cases[1].tape}
          clickable={!!CASE_IDS[1]}
          onOpen={CASE_IDS[1] ? () => setOpenCaseId(CASE_IDS[1]) : undefined}
          readLabel={t.readCase} />
      </Card>

      <Card
        initial={{ x: layout.case3.x, y: layout.case3.y }}
        rotation={layout.case3.rot}
        z={5}
        bringToTop={bringToTop}>
        <CaseCard
          n={t.cases[2].n}
          art={CASE_THUMBS[2] ?
          <img className="case-thumb" src={CASE_THUMBS[2]} alt={t.cases[2].title} draggable="false" /> :
          <CaseArt palette={CASE_PALETTES[2].palette} label={CASE_PALETTES[2].label} />}
          title={t.cases[2].title}
          meta={t.cases[2].meta}
          tags={t.cases[2].tags}
          tape={t.cases[2].tape}
          clickable={!!CASE_IDS[2]}
          onOpen={CASE_IDS[2] ? () => setOpenCaseId(CASE_IDS[2]) : undefined}
          readLabel={t.readCase} />
      </Card>

      {layout.showStickies &&
      <React.Fragment>
          {t.testimonials.map((tt, i) => {
          // First testimonial (Kate) sits in the front slot and on top of the
          // stack; the last (Patrick) goes to the back. Slots/z run in reverse
          // of the array order so the array reads front-to-back.
          const n = t.testimonials.length;
          const layoutKey = `testimonial${n - i}`;
          const slot = layout[layoutKey];
          return (
            <Card
              key={i}
              initial={{ x: slot.x, y: slot.y }}
              rotation={slot.rot}
              z={2 + (n - 1 - i)}
              bringToTop={bringToTop}>
                <TestimonialCard
                testimonial={tt}
                color={tt.color}
                compact={true}
                readLabel={t.readMore}
                onRead={() => setOpenIdx(i)} />
              </Card>);

        })}
        </React.Fragment>
      }

      <TestimonialModal
        testimonials={t.testimonials}
        openIdx={openIdx}
        onClose={closeModal}
        onPrev={prevModal}
        onNext={nextModal}
        prevLabel={t.prevLabel}
        nextLabel={t.nextLabel}
        closeLabel={t.closeLabel} />

      {caseModal}

      {tweaksPanel}
    </React.Fragment>);

}

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