// Main Migronis app – routing + state + tweaks

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "heroVariant": "ai",
  "glass": "balanced",
  "palette": "ivory"
}/*EDITMODE-END*/;

function App() {
  const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
  const [lang, setLangState] = React.useState('ru');
  const [route, setRouteState] = React.useState({ name: 'home' });
  const [aiOpen, setAIOpen] = React.useState(false);
  const [aiQuery, setAIQuery] = React.useState('');
  const [quizOpen, setQuizOpen] = React.useState(false);
  const [callbackOpen, setCallbackOpen] = React.useState(false);
  const [callbackPreset, setCallbackPreset] = React.useState(null);
  // Mock user state for visual auth flow (no real backend wiring).
  const [user, setUser] = React.useState(null);
  const openCallback = (preset) => { setCallbackPreset(preset || null); setCallbackOpen(true); };
  const handleLogin  = (u) => setUser(u);
  const handleLogout = () => { setUser(null); setRouteState({ name: 'home' }); };

  // Preserve scroll position across language swaps – lock the visible anchor
  // (top-most element under the header) and re-align after content reflows.
  const setLang = (newLang) => {
    if (newLang === lang) return;
    const headerOffset = 80;
    // Find an anchor element close to the top of the viewport
    const candidates = document.querySelectorAll('main section, header');
    let anchorEl = null;
    let anchorOffset = 0;
    for (const el of candidates) {
      const rect = el.getBoundingClientRect();
      if (rect.bottom > headerOffset) {
        anchorEl = el;
        anchorOffset = rect.top;
        break;
      }
    }
    setLangState(newLang);
    if (anchorEl) {
      // Wait for React to commit + fonts to settle, then re-anchor
      requestAnimationFrame(() => requestAnimationFrame(() => {
        const newTop = anchorEl.getBoundingClientRect().top + window.scrollY;
        window.scrollTo({ top: newTop - anchorOffset, behavior: 'instant' });
      }));
    }
  };

  // Lightweight history stack so the Back button can return to the previous
  // route rather than always dumping the user on Home. Skipped if the new
  // route equals the current one or only changes scrollTo on the same name.
  const [routeHistory, setRouteHistory] = React.useState([]);
  const setRoute = (r) => {
    setRouteState((cur) => {
      if (r && cur && (cur.name !== r.name || cur.id !== r.id)) {
        setRouteHistory((h) => [...h.slice(-19), cur]);
      }
      return r;
    });
    if (r.scrollTo) {
      // wait a tick for the section to render
      setTimeout(() => {
        const el = document.getElementById(r.scrollTo);
        if (el) window.scrollTo({ top: el.offsetTop - 100, behavior: 'smooth' });
      }, 50);
    } else {
      window.scrollTo({ top: 0, behavior: 'instant' });
    }
  };
  const goBack = () => {
    setRouteHistory((h) => {
      if (h.length === 0) {
        setRouteState({ name: 'home' });
        return [];
      }
      const prev = h[h.length - 1];
      setRouteState(prev);
      window.scrollTo({ top: 0, behavior: 'instant' });
      return h.slice(0, -1);
    });
  };
  // Expose globally so screen-level components can use it without prop drilling.
  window.__goBack = goBack;

  const openAI = (q) => {
    setAIQuery(q || '');
    setAIOpen(true);
  };

  // Apply palette + glass attributes to <html>
  React.useEffect(() => {
    document.documentElement.dataset.palette = t.palette;
    document.documentElement.dataset.glass = t.glass;
  }, [t.palette, t.glass]);

  return (
    <>
      {/* SEO / AEO / GEO – structured data per route */}
      <window.SchemaInjector route={route} lang={lang} />

      {/* Ambient gradient blobs (legacy – neutralised by Borderless styles.css) */}
      <div className="amb-blobs">
        <div className="amb-blob amb-1" />
        <div className="amb-blob amb-2" />
        <div className="amb-blob amb-3" />
      </div>

      <window.Header
        lang={lang} setLang={setLang}
        route={route} setRoute={setRoute}
        openAI={() => openAI()}
        openCallback={() => openCallback()}
        user={user} onLogout={handleLogout}
      />

      <main>
        {route.name === 'home' && (
          <>
            <window.Hero lang={lang} heroVariant={t.heroVariant}
                         setRoute={setRoute} openAI={openAI}
                         openCallback={() => openCallback()} />

            <window.ProgramsSections lang={lang} setRoute={setRoute} featured={true} />

            {/* Consultation form – moved up: after programs, before tools (Nastya) */}
            <window.CTABanner lang={lang} openCallback={() => openCallback()}
              variant="light"
              kicker={lang === 'ru' ? 'Первый шаг' : 'First step'}
              title={lang === 'ru'
                ? <>Начнём с <em>бесплатной консультации</em></>
                : <>Start with a <em>free consultation</em></>}
              body={lang === 'ru'
                ? 'Полчаса по видео. Вы рассказываете о своём запросе — наш юрист анализирует ваш бюджет и состав семьи и рассказывает о подходящих под ваш кейс вариантах. Этот разговор вас ни к чему не обязывает.'
                : 'Half an hour over video. You describe your request — our lawyer reviews your budget and family and walks you through the options that fit. The call commits you to nothing.'} />

            <window.ToolsSection
              lang={lang} setRoute={setRoute}
              openAI={openAI}
              openQuiz={() => setQuizOpen(true)}
              openCallback={openCallback}
            />

            {/* CTA after tools – "Заинтересовала программа?" */}
            <window.CTABanner lang={lang} openCallback={() => openCallback()}
              variant="dark"
              kicker={lang === 'ru' ? 'Обсудим детали' : 'Discuss details'}
              title={lang === 'ru'
                ? <>Заинтересовала <em>программа</em>?</>
                : <>A <em>program</em> caught your eye?</>}
              body={lang === 'ru'
                ? 'Обсудите её на 30-минутном звонке с нашим юристом. Задавайте любые вопросы, это бесплатно.'
                : 'Discuss it on a 30-minute call with our lawyer. Ask anything — it\'s free.'} />

            <window.HowItWorks lang={lang} />

            {/* Lifestyle photo break – bridge to "live here" */}
            <window.PhotoBreak
              src="https://images.unsplash.com/photo-1583847268964-b28dc8f51f92?w=2400&q=80&auto=format&fit=crop"
              eyebrow={lang === 'ru' ? '– Места, куда едут жить' : '– Places people live'}
              title={lang === 'ru' ? 'Жить здесь' : 'Live here'}
              height={460}
              position="center"
              overlay={0.28}
            />

            {/* Six destination cities slider */}
            <window.CitiesShowcase lang={lang} setRoute={setRoute} />

            {/* Teaser pair: Переезд + Инвестиции */}
            <window.HomeTeasers lang={lang} setRoute={setRoute} />

            <window.TeamSection lang={lang} setRoute={setRoute} />

            {/* Segments – per Nastya: "Кто наши клиенты?", 6 categories with CTA exits */}
            <window.SlabBreak
              light
              eyebrow={lang === 'ru' ? 'Шесть типов клиентов' : 'Six client types'}
              title={lang === 'ru' ? <>Кто наши <em>клиенты</em>?</> : <>Who are our <em>clients</em>?</>}
              kicker={lang === 'ru' ? 'У каждого – свой сценарий' : 'Each with their own playbook'}
              body={lang === 'ru'
                ? 'У клиентов Migronis разные задачи. Кто-то ищет место для жизни семьи, кто-то готовит «план Б», кто-то приходит за налоговой оптимизацией. Нам есть, что предложить каждому.'
                : 'Migronis clients arrive with different goals. Some look for a place to live with their family, some build a "Plan B", some optimise tax. We have an answer for each.'}
              items={[
                { title: lang === 'ru' ? 'Семьи'             : 'Families',         body: lang === 'ru' ? 'Ищут новое место для жизни с детьми' : 'Looking for a new place to live with children',                            cta: lang === 'ru' ? 'Программы для семей'     : 'Family programs' },
                { title: lang === 'ru' ? 'Лайфстайл-экспаты'  : 'Lifestyle expats', body: lang === 'ru' ? 'Выбирают страну под свой образ жизни' : 'Pick a country to match their lifestyle',                                cta: lang === 'ru' ? 'Программы для экспатов'   : 'Expat programs' },
                { title: lang === 'ru' ? 'Номады'             : 'Digital nomads',   body: lang === 'ru' ? 'Хотят работать удалённо из страны с приятным климатом и налогами' : 'Want to work remotely from a country with a good climate and taxes', cta: lang === 'ru' ? 'Программы для номадов'    : 'Nomad programs' },
                { title: lang === 'ru' ? 'Стратеги' : 'Strategists',                body: lang === 'ru' ? 'Понимают: один паспорт = риск. У них всегда есть план Б' : 'They know: one passport = a risk. They always keep a plan B', cta: lang === 'ru' ? 'Программы под план Б' : 'Plan B programs' },
                { title: lang === 'ru' ? 'Инвесторы'           : 'Investors',         body: lang === 'ru' ? 'Выбирают сочетание выгодных инвестиций и сильного паспорта' : 'Combine smart investments with a strong passport',          cta: lang === 'ru' ? 'Программы для инвесторов' : 'Investor programs' },
                { title: lang === 'ru' ? 'Предприниматели'      : 'Entrepreneurs',     body: lang === 'ru' ? 'Обращаются, чтобы оптимизировать налоги' : 'Come to optimise their tax footprint',                                cta: lang === 'ru' ? 'Программы для бизнеса'    : 'Business programs' },
              ]}
              onItemSelect={(i) => {
                // Segments 0-2 lean RBI (family/expats/nomads – live somewhere).
                // Segments 3-5 lean CBI (Plan B / investors / entrepreneurs – passport/tax).
                setRoute({ name: i < 3 ? 'residency' : 'citizenship' });
              }}
            />

            <window.VideoStoriesSection lang={lang} setRoute={setRoute} />

            {/* CTA-3 · After case stories */}
            <window.CTABanner lang={lang} openCallback={() => openCallback()}
              variant="dark"
              kicker={lang === 'ru' ? 'Обсудим ваш кейс' : 'Discuss your case'}
              title={lang === 'ru'
                ? <>А какой кейс <em>у вас</em>? Давайте разберём</>
                : <>And what's <em>your</em> case? Let's work it out</>}
              body={lang === 'ru'
                ? 'Забронируйте звонок с нашим юристом, чтобы узнать варианты под вашу ситуацию. Бесплатно.'
                : 'Book a call with our lawyer to learn the options for your situation. Free of charge.'} />

            <div data-accent="orange">
              <window.TrustSection lang={lang} />
            </div>

            <window.FaqSection lang={lang} />

            {/* CTA-4 · End of page – final */}
            <window.CTABanner lang={lang} openCallback={() => openCallback()}
              variant="light"
              kicker={lang === 'ru' ? 'Готовы начать?' : 'Ready to start?'}
              title={lang === 'ru'
                ? <>Начните с <em>бесплатного звонка</em></>
                : <>Start with a <em>free call</em></>}
              body={lang === 'ru'
                ? '30 минут с юристом Migronis. Получите чёткое понимание сроков, бюджета и следующих шагов.'
                : '30 minutes with a Migronis lawyer. Walk away with a clear timeline, budget and next steps.'} />
          </>
        )}
        {route.name === 'program' && (
          <window.ProgramDetail programId={route.id} lang={lang} setRoute={setRoute} />
        )}
        {route.name === 'citizenship' && (
          <window.CitizenshipPage lang={lang} setRoute={setRoute}
                                  openAI={openAI} openCallback={openCallback} />
        )}
        {route.name === 'residency' && (
          <window.ResidencyPage lang={lang} setRoute={setRoute}
                                openAI={openAI} openCallback={openCallback} />
        )}
        {route.name === 'relocate' && (
          <window.RelocatePage lang={lang} setRoute={setRoute} openCallback={openCallback} />
        )}
        {route.name === 'invest' && (
          <window.InvestPage lang={lang} setRoute={setRoute} openCallback={openCallback} />
        )}
        {route.name === 'apply' && (
          <window.ApplicationFlow lang={lang} setRoute={setRoute}
                                  initialProgramId={route.programId}
                                  openCallback={openCallback} />
        )}
        {route.name === 'auth' && (
          <window.AuthScreen lang={lang} setRoute={setRoute} onLogin={handleLogin} />
        )}
        {route.name === 'dashboard' && (
          user
            ? <window.Dashboard lang={lang} setRoute={setRoute} openAI={openAI} user={user} />
            : <window.AuthScreen lang={lang} setRoute={setRoute} onLogin={handleLogin} />
        )}
        {route.name === 'compare' && (
          <window.ComparePage lang={lang} setRoute={setRoute} initialKind={route.kind}
                              openCallback={openCallback} />
        )}
        {route.name === 'about' && (
          <window.AboutPage lang={lang} setRoute={setRoute} openCallback={openCallback} />
        )}
      </main>

      <window.Footer lang={lang} setRoute={setRoute} />

      {/* Modals */}
      <window.AIChatModal open={aiOpen} onClose={() => setAIOpen(false)}
                          lang={lang} initialQuery={aiQuery}
                          openCallback={() => openCallback()} />

      <window.CallbackModal open={callbackOpen}
                            onClose={() => setCallbackOpen(false)}
                            lang={lang}
                            preset={callbackPreset} />

      {/* Quiz modal */}
      {quizOpen && (
        <div
          onClick={() => setQuizOpen(false)}
          style={{
            position: 'fixed', inset: 0, zIndex: 100,
            background: 'rgba(0,0,0,0.5)',
            backdropFilter: 'blur(12px)', WebkitBackdropFilter: 'blur(12px)',
            display: 'grid', placeItems: 'center',
            padding: 24, animation: 'fade-up .2s var(--ease-out)',
          }}>
          <div onClick={(e) => e.stopPropagation()} style={{
            width: 'min(640px, 100%)',
            background: 'var(--bg)',
            border: '1px solid var(--border-strong)',
            position: 'relative',
          }}>
            <button onClick={() => setQuizOpen(false)}
              aria-label="Close"
              style={{
                position: 'absolute', top: 12, right: 12, zIndex: 2,
                width: 36, height: 36,
                background: 'transparent', border: '1px solid var(--border)',
                color: 'var(--fg)', fontSize: 20, cursor: 'pointer',
              }}>×</button>
            <window.HeroQuiz lang={lang}
              setRoute={(r) => { setQuizOpen(false); setRoute(r); }}
              openCallback={() => { setQuizOpen(false); openCallback(); }} />
          </div>
        </div>
      )}

      {/* Sticky mobile CTA – appears after ~65% viewport scroll */}
      <window.StickyCTA lang={lang} openCallback={() => openCallback()} />

      {/* Floating AI launcher – always-available navigator */}
      {!aiOpen && (
        <button onClick={() => openAI()}
          aria-label="Open Migronis AI"
          className="ai-fab"
          style={{
            position: 'fixed', bottom: 20, right: 20, zIndex: 90,
            width: 56, height: 56, borderRadius: 0,
            background: '#191C1F',
            border: '1px solid #191C1F', cursor: 'pointer',
            boxShadow: '0 8px 24px rgba(0,0,0,0.18)',
            display: 'grid', placeItems: 'center',
            color: '#FFFFFF',
            fontFamily: 'var(--f-sans)', fontSize: 22, fontWeight: 700, letterSpacing: '-0.02em',
            transition: 'transform .25s var(--ease-out)',
          }}
          onMouseEnter={(e) => e.currentTarget.style.transform = 'translateY(-2px)'}
          onMouseLeave={(e) => e.currentTarget.style.transform = 'translateY(0)'}>
          M
          <span style={{
            position: 'absolute', top: 6, right: 6,
            width: 8, height: 8,
            background: '#1F4A2E', boxShadow: '0 0 0 2px #191C1F',
          }} />
        </button>
      )}

      {/* Tweaks panel */}
      <TweaksPanel title="Tweaks">
        <TweakSection label="Hero variant" />
        <TweakRadio label="Layout" value={t.heroVariant}
                    options={[
                      { value: 'map', label: 'Map' },
                      { value: 'quiz', label: 'Quiz' },
                      { value: 'ai', label: 'AI' },
                    ]}
                    onChange={(v) => setTweak('heroVariant', v)} />

        <TweakSection label="Glass intensity" />
        <TweakRadio label="Blur" value={t.glass}
                    options={[
                      { value: 'subtle', label: 'Subtle' },
                      { value: 'balanced', label: 'Balanced' },
                      { value: 'heavy', label: 'Heavy' },
                    ]}
                    onChange={(v) => setTweak('glass', v)} />

        <TweakSection label="Palette" />
        <TweakRadio label="Theme" value={t.palette}
                    options={[
                      { value: 'ivory', label: 'Ivory' },
                      { value: 'charcoal', label: 'Charcoal' },
                      { value: 'gold', label: 'Gold' },
                    ]}
                    onChange={(v) => setTweak('palette', v)} />

        <TweakSection label="Jump to screen" />
        <TweakButton label="→ Home" onClick={() => setRoute({ name: 'home' })} />
        <TweakButton label="→ Program detail (Grenada)" onClick={() => setRoute({ name: 'program', id: 'grenada' })} />
        <TweakButton label="→ Application flow" onClick={() => setRoute({ name: 'apply' })} />
        <TweakButton label="→ Auth (sign-in / sign-up)" onClick={() => setRoute({ name: 'auth' })} />
        <TweakButton label="→ Personal dashboard" onClick={() => setRoute({ name: 'dashboard' })} />
        <TweakButton label="→ Compare programs" onClick={() => setRoute({ name: 'compare' })} />

        <TweakSection label="Modals & mock state" />
        <TweakButton label="↗ Open callback modal" onClick={() => openCallback()} />
        <TweakButton label="↗ Open AI chat" onClick={() => openAI()} />
        <TweakButton label={user ? `Logout (${user.name.split(' ')[0]})` : 'Mock-login as Anna L.'}
                     onClick={() => user ? handleLogout() : handleLogin({ name: 'Anna Letayeva', email: 'anna@migronis.demo', provider: 'mock' })} />
      </TweaksPanel>
    </>
  );
}

const rootEl = document.getElementById('root');
ReactDOM.createRoot(rootEl).render(<App />);
