// Interactive product preview: a working chat with model switching, history, prompts.

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

// Demo responses keyed by PROVIDER id (so all variants of a provider share style).
const DEMO_RESPONSES = {
  openai: {
    'идеи':
`Вот 5 идей подкаста про технологии:

1. «До и после релиза» — путь продукта от прототипа до запуска.
2. «Первый коммит» — самые первые строки кода известных проектов.
3. «Тихие герои» — инженеры за кулисами больших сервисов.
4. «Мы это удалили» — фичи, которые команды решились убрать.
5. «Один день стажёра» — взгляд изнутри на онбординг.`,
    default:
`Конечно, помогу. Уточни контекст, аудиторию и желаемый тон — соберу под задачу.`,
  },
  anthropic: {
    'идеи':
`Подскажу 5 направлений и сразу скажу, какое сильнее.

1. «До и после релиза».
2. «Письма основателям».
3. «Тихие герои».
4. «Один разговор» — часовое интервью без шаблонных вопросов.
5. «Архив решений».

Сам выбрал бы «Архив решений» — плотно и с нервом.`,
    default:
`Хороший вопрос. Прежде чем отвечать, уточню контекст и аудиторию — иначе тон промахнётся.`,
  },
  deepseek: {
    'код':
`Готово. Компактно и быстро:

\`\`\`python
def count_vowels(s: str) -> int:
    return sum(1 for c in s.lower() if c in "аеёиоуыэюяaeiou")
\`\`\`

O(n), памяти O(1). Для диакритики добавь \`unicodedata.normalize\`.`,
    default:
`Опиши задачу абзацем и приведи пример входа/выхода — отдам решение и оценю сложность.`,
  },
  xai: {
    default:
`Кидай суть одной фразой — отвечу без воды. Или дам три варианта от простого к интересному.`,
  },
  google: {
    default:
`Готов работать текстом, таблицей или разбирать изображение. Что именно нужно? Файл — прикрепляй.`,
  },
};

const SAMPLE_HISTORY = [
  'TypeScript-версия моего Python-кода',
  'План подкаста про технологии',
  'Письмо инвестору с краткой сутью',
  'Сравнение Claude и GPT для длинных текстов',
  'Идеи логотипа для AI-стартапа',
  'Конспект статьи про трансформеры',
];

function pickResponse(model, text) {
  const block = DEMO_RESPONSES[model.provider] || DEMO_RESPONSES.openai;
  const t = text.toLowerCase();
  if (/код|python|функц|алгоритм|typescript/.test(t))
    return block['код'] || DEMO_RESPONSES.deepseek['код'];
  if (/идея|подкаст|варианты/.test(t))
    return block['идеи'] || block.default;
  return block.default;
}

function renderBubble(text) {
  // Render simple code fence ```lang ... ```
  const parts = text.split(/```(\w*)\n([\s\S]*?)```/g);
  const out = [];
  for (let i = 0; i < parts.length; i++) {
    if (i % 3 === 0) {
      // plain text
      const t = parts[i];
      if (t) out.push(<span key={i}>{t}</span>);
    } else if (i % 3 === 1) {
      // language label, skip — used by next iter
    } else {
      const code = parts[i];
      out.push(<pre key={i}>{code}</pre>);
    }
  }
  return out;
}

const ProductPreview = () => {
  const [activeModel, setActiveModel] = useState('deepseek-v4-pro');
  const initialDeepseek = useMemo(
    () => window.MODELS.find(m => m.id === 'deepseek-v4-pro'),
    []
  );
  const [messages, setMessages] = useState(() => [
    {
      role: 'user',
      text: 'Напиши функцию на Python, которая считает количество гласных в строке.',
    },
    {
      role: 'bot',
      model: 'deepseek-v4-pro',
      text: pickResponse(initialDeepseek, 'код'),
    },
  ]);
  const [draft, setDraft] = useState('');
  const [thinking, setThinking] = useState(false);
  const scrollRef = useRef(null);
  const textareaRef = useRef(null);

  const model = useMemo(() => window.MODELS.find(m => m.id === activeModel), [activeModel]);

  useEffect(() => {
    if (scrollRef.current) {
      scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
    }
  }, [messages, thinking]);

  // Auto-resize textarea
  useEffect(() => {
    const el = textareaRef.current;
    if (el) {
      el.style.height = 'auto';
      el.style.height = Math.min(el.scrollHeight, 120) + 'px';
    }
  }, [draft]);

  const send = (text) => {
    const value = (text ?? draft).trim();
    if (!value || thinking) return;
    const userMsg = { role: 'user', text: value };
    setMessages(prev => [...prev, userMsg]);
    setDraft('');
    setThinking(true);
    const delay = 900 + Math.random() * 700;
    setTimeout(() => {
      setMessages(prev => [...prev, {
        role: 'bot',
        model: activeModel,
        text: pickResponse(model, value),
      }]);
      setThinking(false);
    }, delay);
  };

  const onKey = (e) => {
    if (e.key === 'Enter' && !e.shiftKey) {
      e.preventDefault();
      send();
    }
  };

  const onPickModel = (id) => {
    setActiveModel(id);
  };

  const onNewChat = () => {
    setMessages([
      { role: 'bot', model: activeModel, text: 'Новый чат. О чём поговорим?' },
    ]);
  };

  return (
    <section id="preview" className="reveal">
      <div className="container">
        <div className="section-head">
          <span className="eyebrow"><span className="dot"></span>демо</span>
          <h2 className="h-section">Так это работает</h2>
          <p className="lead">
            Попробуй прямо здесь — переключи модель, выбери пример запроса
            или напиши свой. Интерфейс точно такой же, как в продукте.
          </p>
        </div>

        <div className="preview-frame">
          <div className="preview-glow"></div>
          <div className="app">

            {/* LEFT — sidebar */}
            <div className="panel-left">
              <button
                className="btn btn-ghost btn-sm"
                style={{ justifyContent: 'flex-start', height: 38, fontSize: 13 }}
                onClick={onNewChat}
              >
                <Icon name="plus" size={14}/> Новый чат
              </button>

              <div style={{
                display: 'flex', alignItems: 'center', gap: 8,
                padding: '8px 10px', borderRadius: 10,
                background: 'rgba(255,255,255,0.03)', border: '1px solid var(--line)',
                fontSize: 12, color: 'var(--ink-2)',
              }}>
                <Icon name="search" size={13} />
                <span>Поиск по чатам</span>
              </div>

              <div className="sb-section">Модели</div>
              {window.PROVIDER_REPS.map(m => (
                <div
                  key={m.id}
                  className={`sb-item ${m.id === activeModel ? 'active' : ''}`}
                  onClick={() => onPickModel(m.id)}
                >
                  <span className="swatch" style={{
                    background: 'rgba(255,255,255,0.04)',
                    border: '1px solid var(--line)',
                    display: 'inline-flex', alignItems: 'center', justifyContent: 'center',
                  }}>
                    <window.ModelMark model={m} size={14} />
                  </span>
                  <span className="name">{m.family}</span>
                  {m.id === activeModel && (
                    <span className="ic"><Icon name="check" size={14}/></span>
                  )}
                </div>
              ))}

              <div className="sb-section" style={{ marginTop: 8 }}>История</div>
              <div style={{ display: 'flex', flexDirection: 'column', gap: 2, overflowY: 'auto', minHeight: 0 }}>
                {SAMPLE_HISTORY.map((h, i) => (
                  <div key={i} className="sb-history-item">{h}</div>
                ))}
              </div>

              <div style={{ marginTop: 'auto', paddingTop: 14, borderTop: '1px solid var(--line)' }}>
                <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
                  <div style={{
                    width: 32, height: 32, borderRadius: 10,
                    background: 'linear-gradient(135deg, #2a3550, #3b4a73)',
                    color: '#cfd9ff', fontFamily: 'var(--font-mono)',
                    display: 'flex', alignItems: 'center', justifyContent: 'center',
                    fontSize: 12, fontWeight: 600,
                  }}>AG</div>
                  <div style={{ flex: 1, minWidth: 0 }}>
                    <div style={{ fontSize: 13, fontWeight: 500 }}>Гость</div>
                    <div style={{ fontSize: 11, color: 'var(--ink-3)' }}>демо-режим</div>
                  </div>
                  <Icon name="sliders" size={14}/>
                </div>
              </div>
            </div>

            {/* CENTER — chat */}
            <div className="panel-main">
              <div className="chat-header">
                <div className="model-switch">
                  {window.PROVIDER_REPS.map(m => (
                    <button
                      key={m.id}
                      className={m.provider === model.provider ? 'active' : ''}
                      onClick={() => onPickModel(m.id)}
                    >
                      {m.family}
                    </button>
                  ))}
                </div>
                <div style={{ display: 'flex', gap: 6 }}>
                  <button className="btn btn-ghost btn-sm" style={{ height: 36, padding: '0 12px' }}>
                    <Icon name="copy" size={13}/> Поделиться
                  </button>
                  <button className="btn btn-ghost btn-sm" style={{ height: 36, padding: '0 12px' }}>
                    <Icon name="sliders" size={13}/>
                  </button>
                </div>
              </div>

              <div className="chat-scroll" ref={scrollRef}>
                {messages.map((m, i) => {
                  const mod = m.role === 'bot' ? window.MODELS.find(x => x.id === m.model) : null;
                  return (
                    <div key={i} className={`msg ${m.role}`}>
                      <div className="avatar" style={mod ? {
                        background: 'rgba(255,255,255,0.04)',
                        border: '1px solid var(--line)',
                        color: mod.markColor,
                      } : undefined}>
                        {m.role === 'user' ? 'Ты' : (mod ? <window.ModelMark model={mod} size={18}/> : 'AI')}
                      </div>
                      <div style={{ display: 'flex', flexDirection: 'column' }}>
                        {mod && (
                          <div className="bot-meta">
                            <span className="swatch" style={{ background: mod.accent }}></span>
                            {mod.name} · модель
                          </div>
                        )}
                        <div className="bubble">{renderBubble(m.text)}</div>
                        {m.role === 'bot' && (
                          <div style={{ display: 'flex', gap: 6, marginTop: 8, color: 'var(--ink-3)' }}>
                            <button className="btn btn-ghost btn-sm" style={{ height: 28, padding: '0 10px', fontSize: 11 }}>
                              <Icon name="copy" size={11}/> Копировать
                            </button>
                            <button className="btn btn-ghost btn-sm" style={{ height: 28, padding: '0 10px', fontSize: 11 }}>
                              <Icon name="refresh" size={11}/> Ещё ответ
                            </button>
                          </div>
                        )}
                      </div>
                    </div>
                  );
                })}
                {thinking && (
                  <div className="msg bot">
                    <div className="avatar" style={{
                      background: 'rgba(255,255,255,0.04)',
                      border: '1px solid var(--line)',
                      color: model.markColor,
                    }}><window.ModelMark model={model} size={18}/></div>
                    <div>
                      <div className="bot-meta">
                        <span className="swatch" style={{ background: model.accent }}></span>
                        {model.name} · думает…
                      </div>
                      <div className="bubble">
                        <span className="typing-dots"><span></span><span></span><span></span></span>
                      </div>
                    </div>
                  </div>
                )}
              </div>

              <div className="composer">
                <div className="composer-inner">
                  <textarea
                    ref={textareaRef}
                    rows={1}
                    placeholder={`Спросить у ${model.name}…`}
                    value={draft}
                    onChange={e => setDraft(e.target.value)}
                    onKeyDown={onKey}
                  />
                  <button
                    className={`send-btn ${thinking ? 'stop' : ''}`}
                    onClick={() => thinking ? null : send()}
                    disabled={!draft.trim() && !thinking}
                    aria-label="send"
                  >
                    <Icon name={thinking ? 'stop' : 'send'} size={16}/>
                  </button>
                </div>
                <div className="composer-toolbar">
                  <span className="tool"><Icon name="attach" size={12}/> Файл</span>
                  <span className="tool"><Icon name="globe" size={12}/> Поиск</span>
                  <span className="tool"><Icon name="mic" size={12}/> Голос</span>
                  <span className="hint">⏎ отправить · ⇧⏎ перенос</span>
                </div>
              </div>
            </div>

            {/* RIGHT — examples panel */}
            <div className="panel-right">
              <div>
                <div className="sb-section" style={{ padding: 0, marginBottom: 12 }}>Примеры запросов</div>
                <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
                  {window.PROMPTS.map(p => (
                    <button
                      key={p.text}
                      className="prompt-chip"
                      onClick={() => send(p.text)}
                    >
                      <span className="pl">{p.label}</span>
                      {p.text}
                    </button>
                  ))}
                </div>
              </div>
              <div style={{
                marginTop: 'auto',
                padding: 16, borderRadius: 14,
                background: 'linear-gradient(135deg, rgba(91,140,255,0.12), rgba(160,107,255,0.08))',
                border: '1px solid rgba(91,140,255,0.25)',
              }}>
                <div className="eyebrow" style={{ marginBottom: 10 }}><span className="dot"></span>совет</div>
                <div style={{ fontSize: 13, lineHeight: 1.5, color: 'var(--ink-1)' }}>
                  Хочешь сравнить ответы? Задай тот же вопрос разным моделям —
                  они отвечают по-разному.
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </section>
  );
};

// ---------- Mobile section ----------
const MobileSection = () => (
  <section id="mobile">
    <div className="container">
      <div className="section-head">
        <span className="eyebrow"><span className="dot"></span>мобильно</span>
        <h2 className="h-section">И в кармане — тоже.</h2>
        <p className="lead">
          На телефоне всё работает так же быстро: модели в одном свайпе,
          подсказки под рукой, нижняя навигация для одного большого пальца.
        </p>
      </div>
      <div className="mobile-wrap">
        <div className="phone">
          <div className="phone-screen">
            <div className="notch"></div>
            <div className="phone-status">
              <span>9:41</span>
              <div className="right">
                <span style={{ opacity: 0.9 }}>●●●●</span>
                <span style={{ opacity: 0.9 }}>5G</span>
              </div>
            </div>
            <div className="mob-top">
              <div>
                <div className="title">AI-хаб</div>
                <div className="model">
                  <span style={{ width: 8, height: 8, borderRadius: 2, background: '#4d6bfe' }}></span>
                  DeepSeek · код
                </div>
              </div>
              <div style={{
                width: 36, height: 36, borderRadius: 12,
                background: 'rgba(255,255,255,0.05)', border: '1px solid var(--line)',
                display: 'flex', alignItems: 'center', justifyContent: 'center',
              }}>
                <Icon name="plus" size={16}/>
              </div>
            </div>
            <div className="mob-models">
              {window.MODELS.filter(m => !m.soon).map((m, i) => (
                <div key={m.id} className={`mob-model ${i === 2 ? 'active' : ''}`}>
                  <span style={{ width: 10, height: 10, borderRadius: 3, background: `linear-gradient(135deg, ${m.gradient[0]}, ${m.gradient[1]})` }}></span>
                  {m.name}
                </div>
              ))}
            </div>
            <div className="mob-chat">
              <div className="mob-msg user">Перепиши этот код Python в TypeScript</div>
              <div className="mob-msg bot">
                Готово, вот версия с типами:
                <div style={{
                  marginTop: 6, padding: '8px 10px',
                  background: 'rgba(0,0,0,0.4)', borderRadius: 8,
                  fontFamily: 'var(--font-mono)', fontSize: 11, color: '#cfe3ff',
                }}>
                  function sum(a: number, b: number) {`{`}<br/>
                  &nbsp;&nbsp;return a + b;<br/>
                  {`}`}
                </div>
              </div>
              <div className="mob-msg user">А теперь объясни типы</div>
            </div>
            <div className="mob-suggest">
              <div className="chip">Сделать короче</div>
              <div className="chip">Добавить тесты</div>
              <div className="chip">Объяснить</div>
            </div>
            <div className="mob-composer">
              <input placeholder="Сообщение…" readOnly />
              <button className="mob-send"><Icon name="send" size={14}/></button>
            </div>
            <div className="mob-nav">
              {window.MOBILE_NAV.map((it, i) => (
                <div key={it.id} className={`item ${i === 0 ? 'active' : ''}`}>
                  <span className="ic"><Icon name={it.icon} size={20}/></span>
                  {it.label}
                </div>
              ))}
            </div>
          </div>
        </div>
        <div>
          <div className="eyebrow" style={{ marginBottom: 16 }}><span className="dot"></span>iOS · Android · Web</div>
          <h3 className="h-section" style={{ fontSize: 'clamp(28px, 3vw, 40px)', marginBottom: 16 }}>
            Один прогресс,<br/>пять устройств.
          </h3>
          <p className="lead" style={{ marginBottom: 28, maxWidth: 460 }}>
            Начинаешь чат на ноутбуке, продолжаешь в дороге с телефона.
            История синхронизируется в фоне — никаких «потерял переписку».
          </p>
          <div style={{ display: 'grid', gridTemplateColumns: 'repeat(2, 1fr)', gap: 12, maxWidth: 460 }}>
            <div style={{ padding: 18, borderRadius: 14, background: 'rgba(255,255,255,0.03)', border: '1px solid var(--line)' }}>
              <div style={{ fontFamily: 'var(--font-mono)', fontSize: 11, letterSpacing: '0.08em', color: 'var(--ink-3)' }}>СВАЙП</div>
              <div style={{ marginTop: 6, fontSize: 15, fontWeight: 500 }}>Смена модели</div>
            </div>
            <div style={{ padding: 18, borderRadius: 14, background: 'rgba(255,255,255,0.03)', border: '1px solid var(--line)' }}>
              <div style={{ fontFamily: 'var(--font-mono)', fontSize: 11, letterSpacing: '0.08em', color: 'var(--ink-3)' }}>FACE ID</div>
              <div style={{ marginTop: 6, fontSize: 15, fontWeight: 500 }}>Личная история</div>
            </div>
            <div style={{ padding: 18, borderRadius: 14, background: 'rgba(255,255,255,0.03)', border: '1px solid var(--line)' }}>
              <div style={{ fontFamily: 'var(--font-mono)', fontSize: 11, letterSpacing: '0.08em', color: 'var(--ink-3)' }}>OFFLINE</div>
              <div style={{ marginTop: 6, fontSize: 15, fontWeight: 500 }}>Кеш ответов</div>
            </div>
            <div style={{ padding: 18, borderRadius: 14, background: 'rgba(255,255,255,0.03)', border: '1px solid var(--line)' }}>
              <div style={{ fontFamily: 'var(--font-mono)', fontSize: 11, letterSpacing: '0.08em', color: 'var(--ink-3)' }}>ВИДЖЕТ</div>
              <div style={{ marginTop: 6, fontSize: 15, fontWeight: 500 }}>Быстрый запрос</div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </section>
);

Object.assign(window, { ProductPreview, MobileSection });
