// landing.jsx — landing page for Karolina Młyńczak
// Theme values are consumed via CSS custom properties on the scoped root.

const { useState, useEffect, useRef, useMemo } = React;

// ─── ICONS ──────────────────────────────────────────────────────────────
// Tiny geometric markers, never literal. Strokes are currentColor.
const Ico = {
  Leaf: ({ size = 18 }) => (
    <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.2" strokeLinecap="round" strokeLinejoin="round">
      <path d="M20 4c-7 0-14 5-14 12 0 2 1 3.5 2 4 6-3 11-9 12-16z" />
      <path d="M8 20c2-4 5-7 9-9" />
    </svg>
  ),
  Branch: ({ size = 18 }) => (
    <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.2" strokeLinecap="round">
      <path d="M3 21c4-6 9-11 18-18" />
      <path d="M11 13c1-2 3-3 5-3" />
      <path d="M7 17c1-2 3-3 5-3" />
    </svg>
  ),
  Wave: ({ size = 18 }) => (
    <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.2" strokeLinecap="round">
      <path d="M2 14c3-3 5-3 8 0s5 3 8 0 4-3 4-3" />
      <path d="M2 10c3-3 5-3 8 0s5 3 8 0 4-3 4-3" opacity=".5" />
    </svg>
  ),
  Dot: ({ size = 10 }) => (
    <svg width={size} height={size} viewBox="0 0 10 10"><circle cx="5" cy="5" r="3" fill="currentColor" /></svg>
  ),
  Arrow: ({ size = 14 }) => (
    <svg width={size} height={size} viewBox="0 0 14 14" fill="none" stroke="currentColor" strokeWidth="1.4" strokeLinecap="round" strokeLinejoin="round">
      <path d="M2 7h10" /><path d="M8 3l4 4-4 4" />
    </svg>
  ),
};

// ─── DECORATIVE ELEMENTS ────────────────────────────────────────────────
function HeroDecor() {
  return (
    <svg className="hero-decor" viewBox="0 0 600 700" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
      <defs>
        <linearGradient id="leafG" x1="0" y1="0" x2="1" y2="1">
          <stop offset="0%" stopColor="var(--accent)" stopOpacity="0.35" />
          <stop offset="100%" stopColor="var(--accent)" stopOpacity="0.05" />
        </linearGradient>
      </defs>
      <path d="M 40 660 Q 200 500 320 360 Q 420 250 540 80" stroke="var(--accent)" strokeWidth="0.8" fill="none" opacity="0.4" />
      <ellipse cx="180" cy="540" rx="48" ry="14" transform="rotate(-30 180 540)" fill="url(#leafG)" />
      <ellipse cx="290" cy="400" rx="56" ry="16" transform="rotate(-40 290 400)" fill="url(#leafG)" />
      <ellipse cx="410" cy="250" rx="42" ry="12" transform="rotate(-45 410 250)" fill="url(#leafG)" />
      <ellipse cx="500" cy="140" rx="38" ry="11" transform="rotate(-55 500 140)" fill="url(#leafG)" />
    </svg>
  );
}

function OrganicComposition() {
  return (
    <div className="organic organic-image">
      <img
        src="assets/gory.png"
        alt=""
        aria-hidden="true"
        loading="lazy"
        draggable="false"
      />
    </div>
  );
}


// ─── NAV ────────────────────────────────────────────────────────────────
function Nav({ rootId, onCta }) {
  const links = [
    ['o-mnie', 'O mnie'],
    ['obszary', 'Obszary wsparcia'],
    ['spotkanie', 'Spotkanie'],
    ['podejscie', 'Podejście'],
    ['kontakt', 'Kontakt'],
  ];
  const [active, setActive] = useState('');

  // Smooth scroll within the theme root (not the page) so the canvas wrapper
  // doesn't get pulled around. Falls back to native if no root.
  const handleClick = (e, id) => {
    e.preventDefault();
    const root = document.getElementById(rootId);
    if (!root) return;
    const target = root.querySelector(`[data-section="${id}"]`);
    if (!target) return;
    const scrollContainer = root.closest('[data-scroll-container]') || window;
    const top = target.getBoundingClientRect().top + (scrollContainer === window ? window.scrollY : scrollContainer.scrollTop) - 72;
    if (scrollContainer === window) {
      window.scrollTo({ top, behavior: 'smooth' });
    } else {
      scrollContainer.scrollTo({ top, behavior: 'smooth' });
    }
  };

  // active section highlight via intersection
  useEffect(() => {
    const root = document.getElementById(rootId);
    if (!root) return;
    const sections = root.querySelectorAll('[data-section]');
    const io = new IntersectionObserver(
      (entries) => {
        entries.forEach((e) => {
          if (e.isIntersecting) setActive(e.target.getAttribute('data-section'));
        });
      },
      { rootMargin: '-30% 0px -60% 0px', threshold: 0 }
    );
    sections.forEach((s) => io.observe(s));
    return () => io.disconnect();
  }, [rootId]);

  return (
    <nav className="nav">
      <a href="#" className="nav-brand" onClick={(e) => { e.preventDefault(); handleClick(e, 'hero'); }}>
        <span className="nav-mark" aria-hidden="true">
          <svg viewBox="0 0 24 24" width="22" height="22" fill="none" stroke="currentColor" strokeWidth="1.2" strokeLinecap="round">
            <path d="M12 3c-4 4-4 10 0 18" />
            <path d="M12 3c4 4 4 10 0 18" />
          </svg>
        </span>
        <span className="nav-name">
          <span className="nav-first">Karolina</span>
          <span className="nav-last">Młyńczak</span>
        </span>
      </a>
      <div className="nav-links">
        {links.map(([id, label]) => (
          <a key={id} href={`#${id}`} onClick={(e) => handleClick(e, id)} className={active === id ? 'is-active' : ''}>
            {label}
          </a>
        ))}
      </div>
      <button className="btn btn-primary nav-cta" onClick={onCta}>
        Umów konsultację
      </button>
    </nav>
  );
}

// ─── HERO ───────────────────────────────────────────────────────────────
function Hero({ rootId }) {
  const scrollTo = (id) => {
    const root = document.getElementById(rootId);
    if (!root) return;
    const target = root.querySelector(`[data-section="${id}"]`);
    if (!target) return;
    const sc = root.closest('[data-scroll-container]') || window;
    const top = target.getBoundingClientRect().top + (sc === window ? window.scrollY : sc.scrollTop) - 72;
    (sc === window ? window : sc).scrollTo({ top, behavior: 'smooth' });
  };
  return (
    <section className="hero" data-section="hero">
      <HeroDecor />
      <div className="hero-grid">
        <div className="hero-copy">
          <div className="eyebrow">
            <span className="eyebrow-dot" />
            Psycholog &middot; Kielce
          </div>
          <h1 className="display name-display">
            <span className="name-first">Karolina</span>
            <span className="name-last">Młyńczak</span>
          </h1>
          <p className="lead">
            Spokojna przestrzeń do <em>rozmowy</em>.<br />
            Wsparcie psychologiczne dla osób dorosłych.
          </p>
          <p className="hero-sub">
            Psycholog &middot; absolwentka UJK w&nbsp;Kielcach.<br />
            Uczestniczka Szkoły Psychoterapii&nbsp;Dialog — nurt&nbsp;integracyjno-systemowy.
          </p>
          <div className="hero-actions">
            <button className="btn btn-primary" onClick={() => scrollTo('kontakt')}>
              Umów konsultację
            </button>
            <button className="btn btn-ghost" onClick={() => scrollTo('o-mnie')}>
              Dowiedz się więcej <Ico.Arrow />
            </button>
          </div>
        </div>
        <div className="hero-visual">
          <OrganicComposition />
        </div>
      </div>
      <a href="#o-mnie" className="hero-scroll" onClick={(e) => { e.preventDefault(); scrollTo('o-mnie'); }} aria-label="Przewiń niżej">
        <span />
      </a>
    </section>
  );
}

// ─── O MNIE ─────────────────────────────────────────────────────────────
function About() {
  return (
    <section className="section about" data-section="o-mnie">
      <div className="section-head">
        <span className="kicker">01 — O mnie</span>
      </div>
      <div className="about-grid">
        <div className="about-text">
          <h2 className="h2">
            Z&nbsp;<em>uważnością</em> towarzyszę w&nbsp;odkrywaniu własnych przeżyć — co może wspierać głębsze zrozumienie siebie i&nbsp;rozwój.
          </h2>
          <p className="prose">
            Ukończyłam psychologię na&nbsp;Uniwersytecie Jana Kochanowskiego
            w&nbsp;Kielcach i&nbsp;jestem uczestniczką Szkoły Psychoterapii Dialog —
            w&nbsp;nurcie integracyjno-systemowym.
          </p>
          <p className="prose">
            Doświadczenie zdobywałam w&nbsp;poradni psychologiczno-pedagogicznej,
            a&nbsp;obecnie od&nbsp;trzech lat prowadzę wsparcie psychologiczne w&nbsp;ośrodku
            adopcyjnym — dla&nbsp;dzieci, młodzieży, dorosłych, par i&nbsp;rodzin.
            W&nbsp;swojej praktyce kieruję się Kodeksem Etyczno-Zawodowym Psychologa
            i&nbsp;regularnie poddaję swoją pracę superwizji.
          </p>
          <ul className="values">
            <li><span className="v-mark" aria-hidden="true" /> uważne towarzyszenie w&nbsp;Twoim tempie</li>
            <li><span className="v-mark" aria-hidden="true" /> dyskrecja i&nbsp;szacunek</li>
            <li><span className="v-mark" aria-hidden="true" /> rzetelność i&nbsp;etyka zawodowa</li>
          </ul>
        </div>
        <aside className="about-card">
          <div className="about-card-pad">
            <p className="quote-mark" aria-hidden="true">„</p>
            <p className="quote">
              Nie obiecuję szybkich efektów. Obiecuję obecność, uważność i&nbsp;rzetelną
              wspólną pracę nad&nbsp;tym, co dla&nbsp;Ciebie ważne.
            </p>
            <div className="about-stats">
              <div><strong>5+</strong><span>lat praktyki</span></div>
              <div><strong>Dialog</strong><span>szkoła psychoterapii</span></div>
              <div><strong>UJK</strong><span>Kielce · psychologia</span></div>
            </div>
          </div>
        </aside>
      </div>
    </section>
  );
}

// ─── OBSZARY WSPARCIA — pill chips, varied widths ───────────────────────
function Areas() {
  const items = [
    { label: 'trudności emocjonalne', size: 'lg' },
    { label: 'stres i przeciążenie', size: 'md' },
    { label: 'obniżony nastrój', size: 'md' },
    { label: 'lęk i napięcie', size: 'sm' },
    { label: 'kryzysy życiowe', size: 'md' },
    { label: 'trudności w relacjach', size: 'lg' },
    { label: 'lepsze rozumienie siebie', size: 'lg' },
    { label: 'samotność', size: 'sm' },
    { label: 'żałoba i strata', size: 'md' },
  ];
  return (
    <section className="section areas" data-section="obszary">
      <div className="section-head">
        <span className="kicker">02 — Obszary wsparcia</span>
        <h2 className="h2">
          Z&nbsp;czym przychodzą osoby, <br />
          z&nbsp;którymi się spotykam.
        </h2>
        <p className="section-lead">
          To nie zamknięta lista. Jeśli nie wiesz, czy to, czego doświadczasz, „pasuje" do tych słów —
          po prostu napisz, porozmawiamy.
        </p>
      </div>
      <div className="pill-cloud">
        {items.map((it, i) => (
          <button key={i} className={`pill pill-${it.size}`} type="button">
            <span className="pill-dot" aria-hidden="true" />
            {it.label}
          </button>
        ))}
      </div>
    </section>
  );
}

// ─── JAK WYGLĄDA SPOTKANIE ──────────────────────────────────────────────
function Meeting() {
  const steps = [
    {
      n: '01',
      title: 'Pierwsza konsultacja',
      body: 'Spotkanie, na którym opowiadasz, z czym przychodzisz. Wspólnie zastanawiamy się, czego potrzebujesz i jak mogę być pomocna. Pierwsze spotkanie trwa 50 minut.',
    },
    {
      n: '02',
      title: 'Atmosfera bezpieczeństwa',
      body: 'Wszystko, co mówisz, pozostaje między nami. Pracuję w atmosferze poufności, szacunku i uważności — bez oceniania, bez pośpiechu.',
    },
    {
      n: '03',
      title: 'Stacjonarnie lub online',
      body: 'Spotykamy się w gabinecie w Kielcach albo online — wybierz formę, która lepiej Ci pasuje. Sesje online prowadzę przez bezpieczną platformę wideo.',
    },
  ];
  return (
    <section className="section meeting" data-section="spotkanie">
      <div className="section-head">
        <span className="kicker">03 — Jak wygląda spotkanie</span>
        <h2 className="h2">
          Kameralnie, bez pośpiechu, <br />
          we&nbsp;własnym <em>tempie</em>.
        </h2>
      </div>
      <div className="steps">
        {steps.map((s, i) => (
          <article key={i} className="step">
            <div className="step-mark">{s.n}</div>
            <h3 className="h3">{s.title}</h3>
            <p className="prose">{s.body}</p>
          </article>
        ))}
      </div>
      <div className="meeting-meta">
        <div>
          <span className="meta-label">Czas sesji</span>
          <span className="meta-val">50 minut</span>
        </div>
        <div>
          <span className="meta-label">Cennik</span>
          <span className="meta-val">150&nbsp;zł / sesja</span>
        </div>
        <div>
          <span className="meta-label">Częstotliwość</span>
          <span className="meta-val">co tydzień lub co dwa</span>
        </div>
        <div>
          <span className="meta-label">Forma</span>
          <span className="meta-val">stacjonarnie &middot; online</span>
        </div>
      </div>
    </section>
  );
}

// ─── PODEJŚCIE ──────────────────────────────────────────────────────────
function Approach() {
  return (
    <section className="section approach" data-section="podejscie">
      <div className="approach-inner">
        <span className="kicker">04 — Podejście</span>
        <p className="approach-text">
          Pracuję w&nbsp;nurcie <em>integracyjno-systemowym</em>. Łączę różne perspektywy,
          żeby zobaczyć Ciebie w&nbsp;kontekście Twoich relacji, historii i&nbsp;sytuacji,
          w&nbsp;której jesteś dzisiaj.
        </p>
        <p className="approach-text muted">
          Moim sposobem pracy jest uważna rozmowa, prowadzona w&nbsp;Twoim tempie.
          Wspólnie staramy się zobaczyć i&nbsp;zrozumieć to, co przeżywasz, oraz znaleźć
          takie sposoby radzenia sobie, które będą dla Ciebie realne i&nbsp;trwałe.
          Jestem uczestniczką Szkoły Psychoterapii Dialog, swoją pracę regularnie
          superwizuję i&nbsp;kieruję się Kodeksem Etyczno-Zawodowym Psychologa.
        </p>
        <div className="approach-marks" aria-hidden="true">
          <span /><span /><span />
        </div>
      </div>
    </section>
  );
}

// ─── KONTAKT — form with validation ─────────────────────────────────────
function Contact() {
  const [form, setForm] = useState({ name: '', email: '', message: '', mode: 'stacjonarnie' });
  const [errors, setErrors] = useState({});
  const [touched, setTouched] = useState({});
  const [status, setStatus] = useState('idle'); // idle | sending | sent

  const validate = (f) => {
    const e = {};
    if (!f.name.trim()) e.name = 'Podaj swoje imię.';
    if (!f.email.trim()) e.email = 'Podaj adres e-mail.';
    else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(f.email)) e.email = 'Sprawdź poprawność adresu.';
    if (!f.message.trim()) e.message = 'Napisz kilka słów — to&nbsp;mi pomoże się przygotować.';
    else if (f.message.trim().length < 10) e.message = 'Dopisz proszę kilka słów więcej.';
    return e;
  };

  const onChange = (k, v) => {
    const next = { ...form, [k]: v };
    setForm(next);
    if (touched[k]) setErrors(validate(next));
  };
  const onBlur = (k) => {
    setTouched({ ...touched, [k]: true });
    setErrors(validate(form));
  };

  const submit = (e) => {
    e.preventDefault();
    const eobj = validate(form);
    setErrors(eobj);
    setTouched({ name: true, email: true, message: true });
    if (Object.keys(eobj).length) return;
    setStatus('sending');
    setTimeout(() => setStatus('sent'), 900);
  };

  if (status === 'sent') {
    return (
      <section className="section contact" data-section="kontakt">
        <div className="contact-success">
          <div className="success-mark"><Ico.Branch size={28} /></div>
          <h2 className="h2">Dziękuję za&nbsp;wiadomość.</h2>
          <p className="prose">
            Odezwę się w&nbsp;ciągu 24-48&nbsp;godzin, najczęściej tego samego dnia.
            Zaproponuję dogodny termin pierwszego spotkania.
          </p>
          <button className="btn btn-ghost" onClick={() => { setStatus('idle'); setForm({ name: '', email: '', message: '', mode: 'stacjonarnie' }); setTouched({}); setErrors({}); }}>
            Wyślij kolejną wiadomość
          </button>
        </div>
      </section>
    );
  }

  return (
    <section className="section contact" data-section="kontakt">
      <div className="section-head">
        <span className="kicker">05 — Kontakt</span>
        <h2 className="h2">
          Napisz, kiedy poczujesz, <br />
          że to dobry <em>moment</em>.
        </h2>
        <p className="section-lead">
          Pierwszy krok bywa najtrudniejszy. Zostaw wiadomość, a&nbsp;ja odezwę się
          w&nbsp;ciągu 24-48&nbsp;godzin.
        </p>
      </div>
      <div className="contact-grid">
        <form className="form" onSubmit={submit} noValidate>
          <div className={`field ${errors.name ? 'has-error' : ''}`}>
            <label htmlFor="f-name">Imię</label>
            <input
              id="f-name" type="text" value={form.name}
              onChange={(e) => onChange('name', e.target.value)}
              onBlur={() => onBlur('name')}
              placeholder="Jak mam do Ciebie pisać?"
              autoComplete="given-name"
            />
            {errors.name && <span className="field-error">{errors.name}</span>}
          </div>
          <div className={`field ${errors.email ? 'has-error' : ''}`}>
            <label htmlFor="f-email">E-mail</label>
            <input
              id="f-email" type="email" value={form.email}
              onChange={(e) => onChange('email', e.target.value)}
              onBlur={() => onBlur('email')}
              placeholder="adres@przyklad.pl"
              autoComplete="email"
            />
            {errors.email && <span className="field-error">{errors.email}</span>}
          </div>
          <fieldset className="field">
            <legend>Wolisz spotkać się</legend>
            <div className="radios">
              {['stacjonarnie', 'online', 'nie wiem jeszcze'].map((m) => (
                <label key={m} className={`radio ${form.mode === m ? 'is-checked' : ''}`}>
                  <input type="radio" name="mode" value={m} checked={form.mode === m} onChange={() => onChange('mode', m)} />
                  <span className="radio-mark" />
                  <span>{m}</span>
                </label>
              ))}
            </div>
          </fieldset>
          <div className={`field ${errors.message ? 'has-error' : ''}`}>
            <label htmlFor="f-msg">Wiadomość</label>
            <textarea
              id="f-msg" rows="5" value={form.message}
              onChange={(e) => onChange('message', e.target.value)}
              onBlur={() => onBlur('message')}
              placeholder="Możesz napisać kilka słów o tym, z czym przychodzisz — albo zostawić tę przestrzeń pustą, jeśli wolisz."
            />
            {errors.message && <span className="field-error" dangerouslySetInnerHTML={{ __html: errors.message }} />}
          </div>
          <button className="btn btn-primary form-submit" type="submit" disabled={status === 'sending'}>
            {status === 'sending' ? 'Wysyłam…' : 'Wyślij wiadomość'}
            {status !== 'sending' && <Ico.Arrow />}
          </button>
          <p className="form-note">
            Wiadomość trafi bezpośrednio do mnie. Nie używam jej do żadnej innej korespondencji.
          </p>
        </form>
        <aside className="contact-aside">
          <div className="contact-block">
            <span className="contact-label">E-mail</span>
            <a href="mailto:kontakt@karolinamlynczak.pl" className="contact-val">kontakt@karolinamlynczak.pl</a>
          </div>
          <div className="contact-block">
            <span className="contact-label">Telefon</span>
            <a href="tel:+48000000000" className="contact-val">+48 — — — — — —</a>
            <span className="contact-meta">odpowiadam SMS-em w&nbsp;ciągu dnia</span>
          </div>
          <div className="contact-block">
            <span className="contact-label">Gabinet</span>
            <span className="contact-val">Kielce, ul. — — —</span>
            <span className="contact-meta">spotkania w&nbsp;tygodniu, popołudniami</span>
          </div>
          <div className="contact-block">
            <span className="contact-label">Online</span>
            <span className="contact-val">bezpieczna platforma wideo</span>
            <span className="contact-meta">link do spotkania wysyłam dzień wcześniej</span>
          </div>
        </aside>
      </div>
    </section>
  );
}

// ─── FOOTER ─────────────────────────────────────────────────────────────
function Footer() {
  return (
    <footer className="footer">
      <div className="footer-row">
        <div className="footer-name">
          <span>Karolina Młyńczak</span>
          <span className="footer-role">psycholog · Kielce</span>
        </div>
        <div className="footer-meta">
          <span>Pracuję zgodnie z&nbsp;Kodeksem Etyczno-Zawodowym Psychologa.</span>
        </div>
        <div className="footer-copy">© {new Date().getFullYear()}</div>
      </div>
    </footer>
  );
}

// ─── ROOT ───────────────────────────────────────────────────────────────
function Landing({ rootId = 'app', theme, fonts }) {
  const cssVars = useMemo(() => {
    const v = {};
    Object.entries(theme).forEach(([k, val]) => { v[`--${k}`] = val; });
    if (fonts) {
      v['--font-display'] = fonts.display;
      v['--font-body'] = fonts.body;
    }
    return v;
  }, [theme, fonts]);

  const ctaScroll = () => {
    const root = document.getElementById(rootId);
    const target = root?.querySelector('[data-section="kontakt"]');
    if (!target) return;
    const sc = root.closest('[data-scroll-container]') || window;
    const top = target.getBoundingClientRect().top + (sc === window ? window.scrollY : sc.scrollTop) - 72;
    (sc === window ? window : sc).scrollTo({ top, behavior: 'smooth' });
  };

  return (
    <div id={rootId} className="theme theme-szalwia" style={cssVars}>
      <Nav rootId={rootId} onCta={ctaScroll} />
      <main>
        <Hero rootId={rootId} />
        <About />
        <Areas />
        <Meeting />
        <Approach />
        <Contact />
      </main>
      <Footer />
    </div>
  );
}

window.Landing = Landing;
