// ============================================================
// FORME AESTHETICS — Shared components
// ============================================================
const { useState, useEffect, useRef, useCallback, useMemo } = React;

// ─── Router primitives ─────────────────────────────────────
function useHashRoute() {
  const get = () => {
    const h = window.location.hash.replace(/^#/, '');
    return h || '/';
  };
  const [path, setPath] = useState(get);
  useEffect(() => {
    const onHash = () => {
      setPath(get());
      window.scrollTo({ top: 0, behavior: 'instant' });
    };
    window.addEventListener('hashchange', onHash);
    if (!window.location.hash) window.location.hash = '/';
    return () => window.removeEventListener('hashchange', onHash);
  }, []);
  return path;
}

function Link({ to, children, className, onClick, ...rest }) {
  const handle = (e) => {
    e.preventDefault();
    if (window.location.hash === '#' + to) return;
    window.location.hash = to;
    if (onClick) onClick(e);
  };
  return (
    <a href={'#' + to} className={className} onClick={handle} {...rest}>
      {children}
    </a>
  );
}

// ─── Logo mark ─────────────────────────────────────────────
function Brand({ subtle }) {
  return (
    <Link to="/" className="brand" aria-label="Forme Aesthetics, home">
      <span className="brand-mark">F</span>
      <span className="brand-word">
        Forme
        <small>Aesthetics · Mayfair</small>
      </span>
    </Link>
  );
}

// ─── Nav ───────────────────────────────────────────────────
function Nav({ path, onOpenMobile }) {
  return (
    <header className="nav">
      <div className="shell nav-inner">
        <Brand />
        <nav className="nav-links">
          {ROUTES.map(r => (
            <Link key={r.path} to={r.path}
              className={'nav-link ' + (path === r.path ? 'active' : '')}>
              {r.label}
            </Link>
          ))}
        </nav>
        <div className="nav-cta">
          <Link to="/book" className="btn btn-forest">
            Book a consultation <span className="arrow" />
          </Link>
          <button className="hamburger" onClick={onOpenMobile} aria-label="Open menu">
            <span />
          </button>
        </div>
      </div>
    </header>
  );
}

// ─── Mobile overlay ────────────────────────────────────────
function MobileOverlay({ open, onClose }) {
  useEffect(() => {
    if (open) document.body.style.overflow = 'hidden';
    else document.body.style.overflow = '';
    return () => { document.body.style.overflow = ''; };
  }, [open]);

  return (
    <div className={'mobile-overlay ' + (open ? 'open' : '')} aria-hidden={!open}>
      <div className="mobile-overlay-head">
        <Brand />
        <button className="close-x" onClick={onClose} aria-label="Close menu">
          <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.2">
            <line x1="4" y1="4" x2="20" y2="20" />
            <line x1="20" y1="4" x2="4" y2="20" />
          </svg>
        </button>
      </div>
      <div className="mobile-overlay-links">
        {ROUTES.map(r => (
          <Link key={r.path} to={r.path}
            className="mobile-overlay-link"
            onClick={onClose}>
            <span className="num">{r.num}</span>
            <span>{r.label}</span>
          </Link>
        ))}
        <Link to="/book" className="mobile-overlay-link" onClick={onClose}>
          <span className="num">07</span>
          <span className="italic" style={{ color: 'var(--gold-deep)' }}>Book</span>
        </Link>
      </div>
      <div className="mobile-overlay-foot">
        <div className="caption">14 Mount Street · Mayfair · London W1K 2RJ</div>
        <div className="caption">+44 20 7946 0421</div>
      </div>
    </div>
  );
}

// ─── Footer ────────────────────────────────────────────────
function Footer() {
  return (
    <footer className="footer">
      <div className="shell">
        <div className="footer-grid">
          <div>
            <div style={{ display: 'flex', alignItems: 'center', gap: 14, marginBottom: 18 }}>
              <span className="brand-mark" aria-hidden="true">F</span>
              <span className="brand-word">Forme<small>Aesthetics · Mayfair</small></span>
            </div>
            <p style={{ fontSize: 14, lineHeight: 1.7, maxWidth: '34ch', color: 'var(--ink-soft)' }}>
              A clinic of considered beauty. Mount Street, Mayfair — by appointment only.
            </p>
            <div style={{ marginTop: 24, display: 'flex', gap: 16 }}>
              {['Instagram', 'TikTok', 'Pinterest', 'Journal'].map(s => (
                <a key={s} href="#" className="caption" style={{ borderBottom: '1px solid var(--hairline)' }}>{s}</a>
              ))}
            </div>
          </div>
          <div>
            <h4>Practice</h4>
            <ul>
              <li><Link to="/services">All treatments</Link></li>
              <li><Link to="/about">Our philosophy</Link></li>
              <li><Link to="/gallery">Gallery</Link></li>
              <li><Link to="/faq">Frequently asked</Link></li>
              <li><Link to="/book">Book a consultation</Link></li>
            </ul>
          </div>
          <div>
            <h4>Visit</h4>
            <ul>
              <li>14 Mount Street</li>
              <li>Mayfair, London W1K 2RJ</li>
              <li style={{ marginTop: 12 }}>Tue – Fri · 10 – 19</li>
              <li>Saturday · 10 – 17</li>
              <li>By appointment only</li>
            </ul>
          </div>
          <div>
            <h4>Contact</h4>
            <ul>
              <li><a href="tel:+442079460421">+44 20 7946 0421</a></li>
              <li><a href="mailto:concierge@formeaesthetics.london">concierge@<br/>formeaesthetics.london</a></li>
              <li style={{ marginTop: 12 }}><Link to="/contact">Press &amp; enquiries</Link></li>
            </ul>
          </div>
        </div>
        <div className="footer-bottom">
          <span>© 2026 Forme Aesthetics Ltd. · Registered in England</span>
          <span>CQC · GMC · BCAM · JCCP</span>
        </div>
      </div>
    </footer>
  );
}

// ─── Image placeholder ─────────────────────────────────────
function Placeholder({ tone = 'warm', label, style, ratio, className = '' }) {
  const aspect = ratio ? { aspectRatio: ratio } : null;
  return (
    <div className={`ph ${tone} ${className}`} style={{ ...aspect, ...style }}>
      {label && <span className="ph-label">{label}</span>}
    </div>
  );
}

// ─── Eyebrow with rule ─────────────────────────────────────
function Eyebrow({ children, gold, num }) {
  return (
    <div style={{ display: 'flex', alignItems: 'center', gap: 18 }}>
      <span style={{ height: 1, width: 40, background: gold ? 'var(--gold)' : 'var(--ink-soft)', opacity: 0.6 }} />
      <span className={'eyebrow ' + (gold ? 'gold' : '')}>
        {num && <span style={{ marginRight: 14 }}>{num}</span>}
        {children}
      </span>
    </div>
  );
}

// ─── Press band ─────────────────────────────────────────────
function PressBand() {
  return (
    <div className="press-band">
      {PRESS.map((p) => (
        <div key={p.name} className="press-logo">
          <span className="label">{p.label}</span>
          {p.name}
        </div>
      ))}
    </div>
  );
}

// ─── Accordion ─────────────────────────────────────────────
function Accordion({ items, defaultOpen = -1 }) {
  const [open, setOpen] = useState(defaultOpen);
  return (
    <div>
      {items.map((it, i) => (
        <div key={i} className={'acc-item ' + (open === i ? 'open' : '')}>
          <button className="acc-trigger"
            onClick={() => setOpen(open === i ? -1 : i)}
            aria-expanded={open === i}>
            <span>{it.q}</span>
            <span className="acc-indicator" aria-hidden="true" />
          </button>
          <div className="acc-panel">
            <div className="acc-panel-inner">{it.a}</div>
          </div>
        </div>
      ))}
    </div>
  );
}

// ─── Service card ─────────────────────────────────────────
function ServiceCard({ s }) {
  return (
    <article className="svc-card">
      <span className="gold-border"><span /></span>
      <Placeholder tone={s.image} className="image" />
      <div className="caption" style={{ marginBottom: 12, color: 'var(--gold-deep)' }}>{s.duration}</div>
      <h3 className="h3" style={{ marginBottom: 10 }}>{s.title}</h3>
      <p className="italic serif" style={{ color: 'var(--ink-soft)', fontSize: 17, marginBottom: 14 }}>
        {s.italic}
      </p>
      <p className="body">{s.body}</p>
      <div className="price-reveal">
        <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline' }}>
          <span className="caption">From</span>
          <span className="serif" style={{ fontSize: 24 }}>{s.price}</span>
        </div>
      </div>
    </article>
  );
}

// ─── Pricing table ─────────────────────────────────────────
function PricingTable({ services }) {
  return (
    <div>
      {services.map((s, i) => (
        <div className="pricing-row" key={i}>
          <div>
            <div className="name">{s.name}</div>
            <div className="desc">{s.desc}</div>
          </div>
          <div className="duration">{s.duration}</div>
          <div className="price">
            {s.price}
            {s.priceNote && <small>{s.priceNote}</small>}
          </div>
        </div>
      ))}
    </div>
  );
}

// ─── Page hero (compact) ───────────────────────────────────
function PageHero({ eyebrow, title, italic, lede, num }) {
  return (
    <section className="shell" style={{ paddingTop: 'clamp(64px, 9vw, 120px)', paddingBottom: 'clamp(40px, 6vw, 72px)' }}>
      <Eyebrow gold num={num}>{eyebrow}</Eyebrow>
      <h1 className="h1" style={{ marginTop: 32, maxWidth: '18ch' }}>
        {title}
        {italic && <><br/><em className="italic" style={{ color: 'var(--gold-deep)', fontWeight: 400 }}>{italic}</em></>}
      </h1>
      {lede && <p className="lede" style={{ marginTop: 32 }}>{lede}</p>}
      <hr className="rule-gold" style={{ marginTop: 56, width: '100%' }} />
    </section>
  );
}

Object.assign(window, {
  useHashRoute, Link, Brand, Nav, MobileOverlay, Footer,
  Placeholder, Eyebrow, PressBand, Accordion, ServiceCard, PricingTable, PageHero,
});
