// KW Birlik Cockpit — Discovery Onboarding (4 phases)

const ONB_PHASES = { LOADING: 'loading', WELCOME: 'welcome', QUESTIONS: 'questions', PHASE_TRANS: 'phase-transition', COMPLETE: 'complete' };

// Real backend connection — window.KW geliyor api.js'ten.
// Eğer backend offline ise local mock'a düşer (ONB_QUESTIONS onboarding-data.js'ten).
if (!window.KW) {
  console.warn('[onboarding] window.KW not loaded — using local fallback');
  const _state = { answers: {} };
  window.KW = {
    online: false,
    async getOnboardingQuestions() { return window.ONB_QUESTIONS || []; },
    async getOnboardingState() {
      const answered = Object.values(_state.answers).filter(a => a.status === 'answered').length;
      const unknown  = Object.values(_state.answers).filter(a => a.status === 'unknown').length;
      const total = (window.ONB_QUESTIONS || []).length;
      return { totalQuestions: total, answered, unknown, pending: total - answered - unknown, isComplete: total > 0 && answered + unknown >= total, progressPct: total ? Math.round(((answered + unknown) / total) * 100) : 0 };
    },
    async answerOnboarding(qid, text) {
      const status = text.trim() === '.' ? 'unknown' : 'answered';
      _state.answers[qid] = { text, status };
      return { qid, status, state: await this.getOnboardingState() };
    }
  };
}

const PRIO_LABELS = { P0: 'Kritik', P1: 'Önemli', P2: 'Faydalı' };
const AGENT_LBL = {
  'cfo':'CFO','cmo':'CMO','cro':'CRO','cso':'CSO','ceo':'CEO','coo':'COO','cto':'CTO','chro':'CHRO',
  'gc':'General Counsel','mp':'Managing Partner','cos':'Chief of Staff',
  'd-iz':'Dir · İzmir','d-eg':'Dir · Eğitim','d-sa':'Dir · Satış','d-pa':'Dir · Pazarlama',
  // legacy / discovery-questions.md eski isimler
  'managing-partner':'Managing Partner','chief-of-staff':'Chief of Staff','general-counsel':'General Counsel',
  'director-recruiting':'Dir · Recruiting','director-training':'Dir · Eğitim',
  'director-data':'Dir · Veri','director-pr':'Dir · PR','director-risk':'Dir · Risk',
};

const SaveIndicator = ({ visible }) => (
  <div className={`onb-save ${visible ? 'visible' : ''}`}>
    <span className="check"><Icon name="check" size={10}/></span>
    Kaydedildi
  </div>
);

const ProgressBar = ({ answered, total = 40 }) => {
  // P0=10 (25%), P1=15 (37.5%), P2=15 (37.5%)
  const p0Done = Math.min(answered, 10);
  const p1Done = Math.min(Math.max(answered - 10, 0), 15);
  const p2Done = Math.min(Math.max(answered - 25, 0), 15);
  return (
    <div className="onb-progress">
      <div className="onb-progress-seg p0" style={{ flex: 10 }} title="P0 — Kritik · 10 soru"><span style={{ width: `${(p0Done/10)*100}%` }}/></div>
      <div className="onb-progress-seg p1" style={{ flex: 15 }} title="P1 — Önemli · 15 soru"><span style={{ width: `${(p1Done/15)*100}%` }}/></div>
      <div className="onb-progress-seg p2" style={{ flex: 15 }} title="P2 — Faydalı · 15 soru"><span style={{ width: `${(p2Done/15)*100}%` }}/></div>
    </div>
  );
};

const Welcome = ({ onStart, onSkip }) => (
  <div className="onb-card">
    <div className="onb-stagger">
      <div className="onb-emoji">✨</div>
      <h1 className="onb-display">Ekibinizle ilk tanışma.</h1>
      <p className="onb-lead">
        Sıradaki 30–45 dakikada cevaplayacağınız 40 soru, sıradan bir anket değil. Ekibinizin sizi, şirketinizi ve KW Birlik'in gerçek tablosunu öğrenmesi için temel bilgiler. Bunlar olmadan tavsiyeleri varsayım üzerinde kalır.
      </p>
      <hr className="onb-divider"/>
      <div>
        <div className="onb-label">Ekibiniz şunları öğrenmek istiyor</div>
        <div className="onb-promise-list">
          <div className="onb-promise">
            <b>CFO</b>
            <span>Hangi ofis kâr ediyor, EBITDA'nız neye dayanıyor, sermaye yapınız ne. Bilmeden size sayı vermek tahmindir — kararınızı tahmine yaslamayalım.</span>
          </div>
          <div className="onb-promise">
            <b>CRO</b>
            <span>320 danışmanınızdan kim hangi semtte güçlü, kim duraklamış, kim capper'a yakın. Bunları bilmeden "X kişiyi şu projeye katın" demek havada kalır.</span>
          </div>
          <div className="onb-promise">
            <b>CSO</b>
            <span>NJ taşınma planınız, EB-1A takviminiz, ABD pazarına nasıl gireceğiniz, hangi segmente konsantre olmak istediğiniz. Strateji bunlara göre şekillenecek.</span>
          </div>
          <div className="onb-promise">
            <b>CMO</b>
            <span>İzmir'deki konumlandırmanız, KW markasını nasıl kullandığınız, danışmanlarınızın kanalları nasıl yönettiği. Pazarlama önerileri bu zemine oturur.</span>
          </div>
          <div className="onb-promise">
            <b>CHRO</b>
            <span>Ekibinizdeki ritim, kim neyi taşıyor, kim yorgun, kim büyüyor. İK kararları sizin gerçek dinamiğinizden çıkmalı, klişeden değil.</span>
          </div>
          <div className="onb-promise">
            <b>Chief of Staff</b>
            <span>Günlük ritminiz, hangi saat hangi iş, neyi delege ediyor, neyi etmiyorsunuz. Sabah brief'iniz buna göre filtrelenecek.</span>
          </div>
        </div>
      </div>
      <div className="onb-meta-list">
        <div className="onb-meta-item"><span className="ico">🔒</span>Cevaplarınız sadece sizin ve AI ekibinizde kalır. KW International ile paylaşılmaz, dışarı çıkmaz.</div>
        <div className="onb-meta-item"><span className="ico">💡</span>Bir soruyu bilmiyor ya da düşünmemişseniz cevap olarak yalnızca <kbd style={{fontFamily:'inherit',padding:'1px 6px',background:'var(--bg-tinted)',borderRadius:4,border:'1px solid var(--separator)',fontSize:12}}>.</kbd> yazın — ekip bunu "araştırılacak" olarak işaretler, atlamaz.</div>
        <div className="onb-meta-item"><span className="ico">⏱️</span>~30–45 dakika sürer · istediğiniz an durabilir, kaldığınız yerden devam edersiniz.</div>
      </div>
      <div>
        <button className="onb-btn-primary" onClick={onStart}>Başlayalım <Icon name="arrow-up" size={14} style={{ transform: 'rotate(90deg)' }}/></button>
        <div className="onb-kbd-hint"><kbd>Enter</kbd> ile başlat</div>
        {onSkip && (
          <div style={{ marginTop: 18, textAlign: 'center' }}>
            <a
              onClick={onSkip}
              style={{ fontSize: 12.5, color: 'var(--text-tertiary)', cursor: 'pointer', textDecoration: 'none' }}
            >
              Şimdilik geç, sonra cevaplayayım →
            </a>
          </div>
        )}
      </div>
    </div>
  </div>
);

const Question = ({ q, idx, total, draft, setDraft, answered, onSubmit, onBack, saving, dir }) => {
  const taRef = React.useRef(null);
  const [idle, setIdle] = React.useState(false);
  const [contentClass, setContentClass] = React.useState('');

  React.useEffect(() => {
    setContentClass(dir === 'forward' ? 'enter-right' : 'enter-left');
    const t = setTimeout(() => setContentClass(''), 320);
    taRef.current?.focus();
    return () => clearTimeout(t);
  }, [q.id]);

  React.useEffect(() => {
    if (!draft.trim()) {
      const t = setTimeout(() => setIdle(true), 30000);
      return () => clearTimeout(t);
    } else {
      setIdle(false);
    }
  }, [draft]);

  const canSubmit = draft.trim().length > 0;
  const handleKey = (e) => {
    if (e.key === 'Enter' && (e.metaKey || e.ctrlKey || !e.shiftKey)) {
      e.preventDefault();
      if (canSubmit) onSubmit();
    }
  };

  return (
    <div className="onb-card">
      <ProgressBar answered={answered}/>
      <div className={`onb-q-content ${contentClass}`}>
        <div className={`onb-q-overline ${q.priority.toLowerCase()}`}>{q.priority} · {PRIO_LABELS[q.priority]}</div>
        <div className="onb-q-cat">{q.category}</div>
        <h1 className="onb-q-text">{q.question}</h1>
        {q.placeholder && <div className="onb-q-sub">{q.placeholder}</div>}
        <textarea
          ref={taRef}
          className={`onb-textarea ${idle ? 'idle' : ''}`}
          placeholder="Cevabınızı yazın…"
          value={draft}
          onChange={e => { setDraft(e.target.value); e.target.style.height='auto'; e.target.style.height = Math.min(e.target.scrollHeight, 280)+'px'; }}
          onKeyDown={handleKey}
          rows={3}
        />
        <div className="onb-helper">
          <div className="onb-helper-needs">
            <span style={{ color:'var(--text-tertiary)' }}>💡 Bunu</span>
            {q.needs.slice(0, 3).map(n => <span key={n} className="onb-need-pill">{AGENT_LBL[n] || n}</span>)}
            {q.needs.length > 3 && <span className="onb-need-pill">+{q.needs.length - 3}</span>}
            <span style={{ color:'var(--text-tertiary)' }}>bekliyor.</span>
          </div>
          <div className="onb-helper-tip">Bilmiyorsanız <kbd style={{fontFamily:'inherit',padding:'1px 5px',background:'var(--bg-elevated)',borderRadius:4,border:'1px solid var(--separator)',fontSize:11}}>.</kbd></div>
        </div>
      </div>
      <div className="onb-footer">
        <button className="onb-btn-ghost" onClick={onBack} disabled={idx === 0} style={{ opacity: idx === 0 ? 0.4 : 1 }}>
          <Icon name="chevron" size={14} style={{ transform:'rotate(180deg)' }}/> Geri
        </button>
        <div className="onb-counter">Soru {idx + 1}/{total}</div>
        <button className="onb-btn-primary" onClick={onSubmit} disabled={!canSubmit}>Devam <Icon name="chevron" size={14}/></button>
      </div>
      <div className="onb-kbd-hint" style={{ textAlign:'center' }}><kbd>⌘</kbd>+<kbd>Enter</kbd> ile gönder</div>
    </div>
  );
};

const PhaseTransition = ({ fromPhase, answered, onContinue }) => {
  const map = {
    P0: { icon:'🎯', title:'Kritik sorular tamamlandı.', body:'CFO, CRO, CSO ve Managing Partner artık sizin temel finansal ve stratejik resminizi biliyor. Bundan sonra önemli (P1) sorular — biraz daha derin, ama tartışılması gereken kararlar.', remaining:'~25 dakika', next:'15 önemli soru' },
    P1: { icon:'📊', title:'Önemli sorular tamamlandı.', body:'Ekibiniz operasyonel ve insan boyutunu da artık anladı. Son aşama: faydalı (P2) sorular — kişisel ritminiz, tercihleriniz, ekibin sizinle nasıl konuşacağını şekillendirir.', remaining:'~12 dakika', next:'15 faydalı soru' },
  };
  const m = map[fromPhase];
  return (
    <div className="onb-card">
      <ProgressBar answered={answered}/>
      <div className="onb-stagger" style={{ textAlign:'center' }}>
        <div><span className="onb-phase-icon">{m.icon}</span></div>
        <h1 className="onb-display" style={{ fontSize: 36 }}>{m.title}</h1>
        <p className="onb-lead" style={{ margin:'0 auto', maxWidth: 540 }}>{m.body}</p>
        <div className="onb-meta-list" style={{ marginTop: 28, alignItems:'center' }}>
          <div className="onb-meta-item" style={{ justifyContent:'center' }}><span className="ico">⏱️</span>Kalan süre: {m.remaining}</div>
          <div className="onb-meta-item" style={{ justifyContent:'center' }}><span className="ico">📊</span>Bir sonraki: {m.next}</div>
        </div>
        <div>
          <button className="onb-btn-primary" onClick={onContinue}>Devam et <Icon name="chevron" size={14}/></button>
          <div><button className="onb-tertiary-link" onClick={onContinue}>Mola ver, sonra dön</button></div>
        </div>
      </div>
    </div>
  );
};

const Complete = ({ stats, onEnter }) => (
  <div className="onb-card">
    <div className="onb-particles">
      {Array.from({ length: 5 }).map((_, i) => (
        <span key={i} className="onb-particle" style={{ left: `${15 + i*18}%`, animationDelay: `${i * 0.8}s`, background: ['#C8102E','#FF9F0A','#FFD60A','#FF4D6D','#C8102E'][i] }}/>
      ))}
    </div>
    <ProgressBar answered={40}/>
    <div className="onb-stagger" style={{ textAlign:'center', position:'relative' }}>
      <div><span className="onb-phase-icon" style={{ fontSize: 56 }}>✨</span></div>
      <h1 className="onb-display" style={{ fontSize: 48 }}>Tebrikler, Neşet Bey.</h1>
      <p className="onb-lead" style={{ margin:'0 auto', fontSize: 19, maxWidth: 520, color:'var(--text-primary)' }}>Ekibiniz artık sizi tanıyor.</p>
      <div className="onb-stats">
        <div className="onb-stats-cell">
          <div className="onb-stats-num">{stats.answered}</div>
          <div className="onb-stats-lbl">Cevaplandı</div>
        </div>
        <div className="onb-stats-cell">
          <div className="onb-stats-num">{stats.unknown}</div>
          <div className="onb-stats-lbl">Araştırılacak</div>
        </div>
        <div className="onb-stats-cell">
          <div className="onb-stats-num">{stats.minutes}<span style={{ fontSize: 18, fontWeight: 500, color:'var(--text-secondary)', marginLeft: 2 }}>dk</span></div>
          <div className="onb-stats-lbl">Süre</div>
        </div>
        <div className="onb-stats-foot">Bundan sonraki tüm tavsiye sizin gerçeklerinize dayanıyor.</div>
      </div>
      <p className="onb-lead" style={{ margin:'0 auto', maxWidth: 520, fontSize: 14 }}>Şu an arka planda CEO + CSO + CFO sizin cevaplarınızdan İlk 90-Gün Plan Taslağı'nı hazırlıyor. Birkaç dakika içinde Ana Sayfa'da sizi bekliyor olacak.</p>
      <div>
        <button className="onb-btn-primary" onClick={onEnter}>Cockpit'e gir <Icon name="chevron" size={14}/></button>
      </div>
    </div>
  </div>
);

const OnboardingWizard = ({ onComplete }) => {
  const [phase, setPhase] = React.useState(ONB_PHASES.LOADING);
  const [questions, setQuestions] = React.useState([]);
  const [idx, setIdx] = React.useState(0);
  const [drafts, setDrafts] = React.useState({});
  const [answered, setAnswered] = React.useState(0);
  const [unknown, setUnknown] = React.useState(0);
  const [saveVisible, setSaveVisible] = React.useState(false);
  const [dir, setDir] = React.useState('forward');
  const [transFrom, setTransFrom] = React.useState(null);
  const [showReturning, setShowReturning] = React.useState(false);
  const startedAt = React.useRef(Date.now());

  // Mount: gerçek backend state'inden initial values çek
  React.useEffect(() => {
    (async () => {
      try {
        const [qs, state] = await Promise.all([
          window.KW.getOnboardingQuestions(),
          window.KW.getOnboardingState(),
        ]);
        setQuestions(qs);
        setAnswered(state.answered || 0);
        setUnknown(state.unknown || 0);

        // Pre-fill drafts from existing answers
        const initialDrafts = {};
        for (const q of qs) {
          if (q.answer && q.answer.trim()) initialDrafts[q.id] = q.answer;
        }
        setDrafts(initialDrafts);

        if (state.isComplete) {
          // Onboarding zaten bitmiş — direkt cockpit'e
          if (onComplete) onComplete();
          return;
        }

        // Returning user (önceden cevap vermiş ama bitirmemiş)
        const isReturning = (state.answered + state.unknown) > 0;
        if (isReturning) {
          // İlk pending soruya jump
          const firstPendingIdx = qs.findIndex(q => q.status === 'pending');
          setIdx(firstPendingIdx >= 0 ? firstPendingIdx : 0);
          setPhase(ONB_PHASES.QUESTIONS);
          setShowReturning(true);
          setTimeout(() => setShowReturning(false), 4000);
        } else {
          // Yeni kullanıcı → welcome
          setPhase(ONB_PHASES.WELCOME);
        }
      } catch (err) {
        console.error('[onboarding] mount error:', err);
        setPhase(ONB_PHASES.WELCOME);
      }
    })();
  }, []);

  const flashSaved = () => {
    setSaveVisible(true);
    setTimeout(() => setSaveVisible(false), 1500);
  };

  const submitAnswer = async () => {
    const q = questions[idx];
    const text = (drafts[q.id] || '').trim();
    if (!text) return;
    try {
      const r = await window.KW.answerOnboarding(q.id, text);
      // Backend'den gelen authoritative state ile sync (local counter'a güvenme)
      if (r.state) {
        setAnswered(r.state.answered);
        setUnknown(r.state.unknown);
      }
      // Local question status'ünü de update et (Welcome'a dönmemek için)
      setQuestions(qs => qs.map(qq => qq.id === q.id ? { ...qq, answer: text, status: r.status } : qq));
      flashSaved();

      // Phase transitions on q10 → q11 and q25 → q26 (sadece daha önce gösterilmediyse)
      if (q.number === 10 && (r.state?.answered + r.state?.unknown) === 10) {
        setTransFrom('P0');
        setPhase(ONB_PHASES.PHASE_TRANS);
        return;
      }
      if (q.number === 25 && (r.state?.answered + r.state?.unknown) === 25) {
        setTransFrom('P1');
        setPhase(ONB_PHASES.PHASE_TRANS);
        return;
      }

      // Complete (backend authoritative)
      if (r.state?.isComplete) {
        setPhase(ONB_PHASES.COMPLETE);
        return;
      }

      // Sıradaki pending soruya git (eğer bu re-edit ise pending kalmamış olabilir → sıradaki indeks)
      const nextPendingIdx = questions.findIndex((qq, i) => i > idx && qq.status === 'pending');
      const nextIdx = nextPendingIdx >= 0 ? nextPendingIdx : Math.min(idx + 1, questions.length - 1);
      setDir('forward');
      setIdx(nextIdx);
    } catch (err) {
      console.error('[onboarding] submit error:', err);
      alert('Cevap kaydedilirken bir sorun oldu: ' + err.message);
    }
  };

  const goBack = () => {
    if (idx === 0) return;
    setDir('back');
    setIdx(i => i - 1);
  };

  const continueAfterTransition = () => {
    setDir('forward');
    setIdx(i => i + 1);
    setPhase(ONB_PHASES.QUESTIONS);
  };

  // Global keyboard
  React.useEffect(() => {
    const onKey = (e) => {
      if (phase === ONB_PHASES.WELCOME && e.key === 'Enter') {
        e.preventDefault();
        setPhase(ONB_PHASES.QUESTIONS);
      }
    };
    window.addEventListener('keydown', onKey);
    return () => window.removeEventListener('keydown', onKey);
  }, [phase]);

  const totalDone = answered + unknown;
  const stats = {
    answered,
    unknown,
    minutes: Math.max(1, Math.round((Date.now() - startedAt.current) / 60000))
  };

  const currentQ = questions[idx];

  // Phase değiştiğinde overlay'i en üste scroll yap — uzun kart üstten kesilmesin
  const overlayRef = React.useRef(null);
  React.useLayoutEffect(() => {
    if (overlayRef.current) {
      overlayRef.current.scrollTop = 0;
    }
  }, [phase, idx]);

  return (
    <div className="onb-overlay" ref={overlayRef}>
      {showReturning && <div className="onb-returning">Önceki oturumdan devam ediyorsunuz · Soru {idx + 1}</div>}
      <SaveIndicator visible={saveVisible}/>

      {phase === ONB_PHASES.LOADING && (
        <div className="onb-card" style={{ padding: 64, textAlign: 'center', color: 'var(--text-secondary)' }}>
          Hazırlanıyor…
        </div>
      )}

      {phase === ONB_PHASES.WELCOME && (
        <Welcome
          onStart={() => setPhase(ONB_PHASES.QUESTIONS)}
          onSkip={() => {
            try { (window.KW_STAGE || localStorage).setItem('kw_onboarding_skipped', 'true'); } catch {}
            if (onComplete) onComplete();
          }}
        />
      )}

      {phase === ONB_PHASES.QUESTIONS && currentQ && (
        <Question
          key={currentQ.id}
          q={currentQ}
          idx={idx}
          total={questions.length}
          draft={drafts[currentQ.id] || ''}
          setDraft={(v) => setDrafts(d => ({ ...d, [currentQ.id]: v }))}
          answered={totalDone}
          onSubmit={submitAnswer}
          onBack={goBack}
          dir={dir}
        />
      )}

      {phase === ONB_PHASES.QUESTIONS && !currentQ && (
        <div className="onb-card" style={{ padding: 48, textAlign: 'center' }}>
          <div style={{ fontSize: 36, marginBottom: 12 }}>⚠️</div>
          <h3 style={{ fontSize: 18, fontWeight: 600, marginBottom: 8, letterSpacing: '-0.015em' }}>
            Sorular yüklenemedi
          </h3>
          <p style={{ fontSize: 13.5, color: 'var(--text-secondary)', marginBottom: 20, lineHeight: 1.55 }}>
            Backend'le iletişim kurulamadı ya da sorular boş geldi. Sayfayı yenileyip tekrar deneyin.
          </p>
          <div style={{ display: 'flex', gap: 10, justifyContent: 'center' }}>
            <button className="onb-btn-primary" onClick={() => window.location.reload()}>Sayfayı yenile</button>
            <button
              className="onb-btn-ghost"
              onClick={() => {
                try { (window.KW_STAGE || localStorage).setItem('kw_onboarding_skipped', 'true'); } catch {}
                if (onComplete) onComplete();
              }}
            >Şimdilik geç</button>
          </div>
        </div>
      )}

      {phase === ONB_PHASES.PHASE_TRANS && (
        <PhaseTransition fromPhase={transFrom} answered={totalDone} onContinue={continueAfterTransition}/>
      )}

      {phase === ONB_PHASES.COMPLETE && <Complete stats={stats} onEnter={onComplete || (() => {})}/>}

      <OnboardingDevSkip onSkipAll={() => {
        try {
          const s = window.KW_STAGE || sessionStorage;
          s.setItem('kw_onboarding_skipped', 'true');
          s.setItem('kw_onboarding_done', 'true');
        } catch {}
        if (onComplete) onComplete();
      }}/>
    </div>
  );
};

// ─── DEV Skip — onboarding'i hızla geç (Fly preview testi için) ─────
// Sadece ?dev=1 ile gelen tab'da görünür. localStorage'a YAZMAZ — Babam'ın normal link'i temiz kalır.
const OnboardingDevSkip = ({ onSkipAll }) => {
  const isDev = (() => {
    try {
      // window.KW_IS_DEV global'i app.jsx'te set edildi
      if (window.KW_IS_DEV === true) return true;
      if (typeof location !== 'undefined' && new URLSearchParams(location.search).has('dev')) {
        sessionStorage.setItem('kw_dev_mode', '1');
        return true;
      }
    } catch {}
    return false;
  })();
  if (!isDev) return null;
  return (
    <div className="tutorial-dev-toolbar">
      <span className="label">DEV</span>
      <button className="tutorial-dev-btn danger" onClick={onSkipAll} title="Onboarding'i atla, direkt Cockpit'e">
        Onboarding atla ⤳
      </button>
    </div>
  );
};

window.OnboardingWizard = OnboardingWizard;
