/* global window, React */
/* nymo copy — Finnish first, English secondary */

const COPY = {
  fi: {
    nav: { how: "Miten?", employers: "Työnantajille", candidates: "Hakijoille", pilot: "Pilotti", cta: "Liity odotuslistalle" },
    hero: {
      slogan: "Palkkaa ihminen, älä CV:tä.",
      h1: "Vähemmän hakemuksia,",
      h1b: "parempia päätöksiä.",
      sub: "nymo muuttaa hakemuspinon selkeäksi listaksi. Hakija tekee profiilin kerran ja hakee töitä aina samalla profiililla. Työnantaja saa listan parhaista ehdokkaista perusteluineen sopivuusjärjestyksessä.",
      cta1: "Pyydä pilottia",
      cta2: "Liity odotuslistalle",
      figCap: "yksi profiili · monta polkua · yksi päätös",
      ratio: {
        label: "SUHDE",
        applicants: "100 hakemusta",
        top: "Kärki 4",
      },
    },
    marquee: ["saatavuus", "osaaminen", "sijainti", "kieli", "sertifikaatit", "vuorot", "työmatka", "palaute"],
    problem: {
      eyebrow: "001 · ongelma",
      h1a: "Sata hakemusta.",
      h1b: "Kymmenen tuntia arpomista.",
      h1c: "Silti epävarma päätös.",
      sub: "CV kertoo, missä joku on ollut. Se ei välttämättä kerro, sopiiko hän rooliin.",
      cards: [
        "Työnhakija täyttää samoja tietoja yhä uudelleen aloittaen joka kerta alusta.",
        "Työnantaja hukkuu hakemuksiin ja hyvät hakijat hukkuvat massaan.",
      ],
    },
    how: {
      eyebrow: "002 · miten nymo toimii",
      h1: "Kolme askelta.",
      steps: [
        { n: "01", h: "Hakija tekee profiilin kerran.", p: "Saatavuus, osaaminen, sijainti, kieli. Ei enää samoja lomakkeita." },
        { n: "02", h: "Työnantaja määrittelee roolin vaatimukset.", p: "Pakolliset ensin. Toivotut sen jälkeen." },
        { n: "03", h: "nymo tarkistaa, järjestää ja selittää. Sinä päätät.", p: "Perustelut jokaiselle suositukselle. Ei arvailua." },
      ],
    },
    cand: {
      eyebrow: "003 · hakijoille",
      h1: "Yksi profiili.",
      h1b: "Unohda loputtomat lomakkeet ja keskity hakemaan paikkoja, jotka vastaavat osaamistasi.",
      sub: "Näe miten saatavuutesi, osaamisesi ja toiveesi sopivat eri rooleihin. Saat selkeän palautteen siitä mitä mahdollisesti puuttuu. Tehdään työnhausta helppoa ja tehokasta.",
    },
    emp: {
      eyebrow: "004 · työnantajille",
      h1: "Keskity hakijaan,",
      h1b: "älä hakemukseen.",
      sub: "Ei arvailua. Ei uutta järjestelmää. Vain selkeä lista: kuka sopii, miksi sopii ja mitä puuttuu.",
    },
    mock: {
      profile: {
        header: "PROFIILI · valmis",
        name: "Aino K.",
        role: "Hakija · 2 v kokemus",
        rows: [
          ["Saatavilla", "Illat / vkl"],
          ["Osaaminen", "Asiakaspalvelu, kassa"],
          ["Sijainti", "Oulu · keskusta"],
          ["Kielet", "FI erinom · EN hyvä"],
        ],
        progress: "Profiili 92% valmis",
      },
      list: {
        eyebrow: "AVOIN ROOLI",
        role: "Myyjä, osa-aikainen",
        meta: "86 hakijaa · kärki 4",
        items: [
          { rank: "#01", name: "Veeti M.", score: 91, tag: "Pakolliset ✓" },
          { rank: "#02", name: "Sara K.", score: 86, tag: "Vahva sijainti" },
          { rank: "#03", name: "Omar H.", score: 78, tag: "Kielisopivuus" },
          { rank: "#04", name: "Liisa P.", score: 72, tag: "Pakolliset ✓" },
        ],
        active: 0,
      },
      detail: {
        eyebrow: "SUOSITUS · avattu",
        name: "Veeti M.",
        score: "91%",
        scoreLabel: "osuvuus",
        whyL: "Miksi sopii",
        why: [
          "Saatavilla vaadituissa vuoroissa",
          "Työmatka alle 25 min",
          "Asiakaspalvelukokemus",
          "Suomen kieli täyttyy",
        ],
        missL: "Mitä puuttuu",
        miss: ["Hygieniapassia ei vielä lisätty"],
        nextL: "Ehdotettu",
        cta: "Kutsu haastatteluun",
      },
    },
    pilot: {
      eyebrow: "005 · pilotti",
      h1: "Rakennetaan tämä yhdessä.",
      sub: "Etsimme 2–3 pilottikumppania kausi-, osa-aika- tai entry-level -rekrytointiin. Kokeile kevyesti nykyisten järjestelmiesi rinnalla ilman pitkää sopimusta.",
      cta: "Pyydä pilottia",
      fitL: "Sopii pilottiin",
      fitItems: ["Kausityö", "Osa-aika", "Entry-level", "Korkea volyymi"],
    },
    waitlist: {
      eyebrow: "006 · odotuslista",
      h1: "Kiinnostuitko?",
      sub: "Jätä sähköpostisi. Otamme yhteyttä pilotin lähestyessä.",
      placeholder: "sinun@sahkopostisi.fi",
      button: "Liity odotuslistalle",
      fine: "Ei roskapostia.",
      doneStamp: "ODOTUSLISTALLA ✓",
      doneMsg: "Kiitos. Otamme yhteyttä kun aika on oikea.",
    },
    footer: {
      tagline: "Vähemmän hakemuksia, parempia päätöksiä.",
      builtIn: "Rakennettu Oulussa.",
      links: [["#", "Tietosuoja"], ["#", "Evästeet"], ["#", "Ota yhteyttä"]],
      version: "v0.1 · OULU",
    },
  },

  en: {
    nav: { how: "How?", employers: "Employers", candidates: "Candidates", pilot: "Pilot", cta: "Join the waitlist" },
    hero: {
      slogan: "Hire a person, not a CV.",
      h1: "Fewer applications,",
      h1b: "better decisions.",
      sub: "nymo turns a pile of applications into a clear list. Candidates create one profile. Employers get a ranked shortlist with reasons.",
      cta1: "Request pilot",
      cta2: "Join the waitlist",
      figCap: "one profile · many paths · one decision",
      ratio: {
        label: "RATIO",
        applicants: "100 applicants",
        top: "Top 4",
      },
    },
    marquee: ["availability", "skills", "location", "language", "certificates", "shifts", "commute", "feedback"],
    problem: {
      eyebrow: "001 · the problem",
      h1a: "A hundred applications.",
      h1b: "Ten hours of guesswork.",
      h1c: "Still an uncertain decision.",
      sub: "A CV tells you where someone has been. It doesn't tell you whether they fit the role.",
      cards: [
        "Candidates fill in the same information over and over. Every time from scratch.",
        "Employers drown in applications. Good candidates stay hidden.",
      ],
    },
    how: {
      eyebrow: "002 · how nymo works",
      h1: "Three steps.",
      steps: [
        { n: "01", h: "Candidates create one profile.", p: "Availability, skills, location, language. No more repetitive forms." },
        { n: "02", h: "Employers define what the role needs.", p: "Must-haves first. Nice-to-haves after." },
        { n: "03", h: "nymo checks, ranks and explains. You decide.", p: "Reasoning for every recommendation. No guessing." },
      ],
    },
    cand: {
      eyebrow: "003 · for candidates",
      h1: "One profile.",
      h1b: "Apply to multiple roles. Never start from scratch again.",
      sub: "See how your availability, skills and preferences match different roles. Get clear feedback on what might be missing.",
    },
    emp: {
      eyebrow: "004 · for employers",
      h1: "Focus on the person,",
      h1b: "not the application.",
      sub: "No guessing. No new system. Just a clear list: who fits, why they fit and what's missing.",
    },
    mock: {
      profile: {
        header: "PROFILE · complete",
        name: "Aino K.",
        role: "Candidate · 2 yrs exp.",
        rows: [
          ["Available", "Eve / weekend"],
          ["Skills", "Customer service, POS"],
          ["Location", "Oulu · centre"],
          ["Languages", "FI fluent · EN good"],
        ],
        progress: "Profile 92% complete",
      },
      list: {
        eyebrow: "OPEN ROLE",
        role: "Sales assistant, p/t",
        meta: "86 candidates · top 4",
        items: [
          { rank: "#01", name: "Veeti M.", score: 91, tag: "Must-haves ✓" },
          { rank: "#02", name: "Sara K.", score: 86, tag: "Strong location" },
          { rank: "#03", name: "Omar H.", score: 78, tag: "Language fit" },
          { rank: "#04", name: "Liisa P.", score: 72, tag: "Must-haves ✓" },
        ],
        active: 0,
      },
      detail: {
        eyebrow: "RECOMMENDATION · open",
        name: "Veeti M.",
        score: "91%",
        scoreLabel: "match",
        whyL: "Why they fit",
        why: [
          "Available for required shifts",
          "Commute under 25 min",
          "Customer service experience",
          "Finnish requirement met",
        ],
        missL: "What's missing",
        miss: ["Hygiene passport not yet added"],
        nextL: "Suggested",
        cta: "Invite to interview",
      },
    },
    pilot: {
      eyebrow: "005 · pilot",
      h1: "Let's build this together.",
      sub: "We're looking for 2–3 pilot partners for seasonal, part-time or entry-level hiring. Try it lightly alongside your current systems, no long contracts.",
      cta: "Request pilot",
      fitL: "A fit for pilot",
      fitItems: ["Seasonal", "Part-time", "Entry-level", "High volume"],
    },
    waitlist: {
      eyebrow: "006 · waitlist",
      h1: "Interested?",
      sub: "Leave your email. We'll be in touch as the pilot approaches.",
      placeholder: "your@email.com",
      button: "Join the waitlist",
      fine: "No spam.",
      doneStamp: "ON THE LIST ✓",
      doneMsg: "Thanks. We'll be in touch when the time is right.",
    },
    footer: {
      tagline: "Hire a person, not a CV.",
      builtIn: "Fewer applications, better decisions. Built in Oulu.",
      links: [["#", "Privacy"], ["#", "Cookies"], ["#", "Contact"]],
      version: "v0.1 · OULU",
    },
  },
};

const LangContext = React.createContext({ lang: "fi", setLang: () => {}, t: COPY.fi });

function LangProvider({ children }) {
  const [lang, setLang] = React.useState(() => {
    try { return localStorage.getItem("nymo-lang") || "fi"; } catch (e) { return "fi"; }
  });
  React.useEffect(() => {
    try { localStorage.setItem("nymo-lang", lang); } catch (e) {}
    document.documentElement.lang = lang;
  }, [lang]);
  const value = React.useMemo(() => ({ lang, setLang, t: COPY[lang] }), [lang]);
  return <LangContext.Provider value={value}>{children}</LangContext.Provider>;
}

function useT() { return React.useContext(LangContext); }

function LangToggle() {
  const { lang, setLang } = useT();
  return (
    <div className="lang-toggle" role="group" aria-label="Language">
      <button
        className={"lang-btn " + (lang === "fi" ? "is-on" : "")}
        onClick={() => setLang("fi")}
        aria-pressed={lang === "fi"}
      >FI</button>
      <span className="lang-sep" aria-hidden="true">/</span>
      <button
        className={"lang-btn " + (lang === "en" ? "is-on" : "")}
        onClick={() => setLang("en")}
        aria-pressed={lang === "en"}
      >EN</button>
    </div>
  );
}

/* Inline wordmark for "nymo" — lowercase, Space Grotesk, single petrol dot.
   Used wherever a brand mark is needed. */
function NymoMark({ size = 26, dark = false }) {
  return (
    <span className={"nymo-mark " + (dark ? "is-dark" : "")} style={{ fontSize: size }} aria-label="nymo">
      <span>nymo</span><span className="nymo-mark-dot" aria-hidden="true"></span>
    </span>
  );
}

window.COPY = COPY;
window.LangContext = LangContext;
window.LangProvider = LangProvider;
window.useT = useT;
window.LangToggle = LangToggle;
window.NymoMark = NymoMark;
