// レッスン管理 — Claude API連携 + 問題履歴 + 先生の状態
// 話す演出・音声・表情アニメ

const { useState: useStateL, useEffect: useEffectL, useRef: useRefL, useCallback } = React;

// 単語ごとに文字を流し込むtypingフック（吹き出し用）
function useTypewriter(text, speedMs = 30) {
  const [shown, setShown] = useStateL('');
  useEffectL(() => {
    if (!text) { setShown(''); return; }
    setShown('');
    let i = 0;
    const id = setInterval(() => {
      i++;
      setShown(text.slice(0, i));
      if (i >= text.length) clearInterval(id);
    }, speedMs);
    return () => clearInterval(id);
  }, [text, speedMs]);
  return shown;
}

// 音声合成（ブラウザSpeechSynthesis）— talking演出と同期
function speak(text, enabled) {
  if (!enabled) return;
  if (typeof speechSynthesis === 'undefined') return;
  try {
    speechSynthesis.cancel();
    const u = new SpeechSynthesisUtterance(text);
    u.lang = 'ja-JP';
    u.rate = 1.05;
    u.pitch = 1.15;
    const voices = speechSynthesis.getVoices();
    const jp = voices.find(v => v.lang && v.lang.toLowerCase().startsWith('ja'));
    if (jp) u.voice = jp;
    speechSynthesis.speak(u);
  } catch (e) { /* ignore */ }
}

// ==== Claude 連携 ====
async function generateQuestion(subject, difficulty, history) {
  const recent = history.slice(-3).map(h => `Q: ${h.question}\nA: ${h.answer}\n${h.correct ? 'CORRECT' : 'INCORRECT'}`).join('\n\n');
  const prompt = `あなたは親しみやすい大人向け家庭教師です。短い問題を1問だけ作ってください。

科目/テーマ: ${subject}
難易度: ${difficulty}/5
${recent ? '最近の出題履歴:\n' + recent + '\n\n難易度や類似を踏まえ変化をつけて。' : ''}

以下の純粋なJSONのみで返答してください。説明や前置きは一切不要:
{
  "question": "問題文（1-2文・日本語）",
  "hint": "考え方のヒント（1文）",
  "answer": "想定される模範解答（短く）",
  "draw": {
    "title": "黒板見出し（6文字以内）",
    "lines": ["黒板に書く補助説明を配列で2-4行（各20文字以内）"]
  }
}`;

  try {
    const resp = await window.claude.complete(prompt);
    const m = resp.match(/\{[\s\S]*\}/);
    if (!m) throw new Error('no json');
    const parsed = JSON.parse(m[0]);
    return parsed;
  } catch (e) {
    console.warn('generateQuestion fallback', e);
    return {
      question: '2桁×2桁の暗算: 23 × 14 はいくつ？',
      hint: '分配法則で (20+3)×(10+4) に分けてみよう。',
      answer: '322',
      draw: { title: '分配法則', lines: ['23 × 14', '=(20+3)(10+4)', '=200+80+30+12', '=322'] }
    };
  }
}

async function evaluateAnswer(question, correctAnswer, userAnswer) {
  const prompt = `家庭教師として、学習者の回答を評価してください。

問題: ${question}
模範解答: ${correctAnswer}
学習者の回答: ${userAnswer}

以下のJSONのみで返答:
{
  "correct": true/false,
  "feedback": "1-2文の具体的フィードバック（日本語、暖かく）",
  "emotion": "praise|happy|hint|think のいずれか",
  "speak": "先生が口に出して話すセリフ（1-2文・日本語・自然な話し言葉）"
}`;

  try {
    const resp = await window.claude.complete(prompt);
    const m = resp.match(/\{[\s\S]*\}/);
    if (!m) throw new Error('no json');
    return JSON.parse(m[0]);
  } catch (e) {
    console.warn('evaluateAnswer fallback', e);
    const ok = String(userAnswer).trim() === String(correctAnswer).trim();
    return {
      correct: ok,
      feedback: ok ? 'バッチリです！考え方もあっていそうですね。' : '惜しい！もう一度だけ見直してみましょう。',
      emotion: ok ? 'praise' : 'hint',
      speak: ok ? 'お見事！その調子ですよ。' : 'うーん、もう少しかな。ヒントを見てみましょう。'
    };
  }
}

async function explainAnswer(question, correctAnswer, userAnswer, wasCorrect) {
  const prompt = `家庭教師として、下記の問題について丁寧な解説をしてください。

問題: ${question}
模範解答: ${correctAnswer}
学習者の回答: ${userAnswer}
正誤: ${wasCorrect ? '正解' : '不正解'}

${wasCorrect ? '学習者は正解しましたが、理解を深めるために背景・なぜそうなるか・関連する豆知識を添えて解説してください。' : '学習者の誤答の原因として考えられる勘違いに触れながら、やさしく考え方の筋道を示してください。'}

以下のJSONのみで返答:
{
  "explanation": "詳しい解説（3-5文・日本語・会話調）",
  "tip": "次に繋がる一言アドバイス（1文）"
}`;
  try {
    const resp = await window.claude.complete(prompt);
    const m = resp.match(/\{[\s\S]*\}/);
    if (!m) throw new Error('no json');
    return JSON.parse(m[0]);
  } catch (e) {
    console.warn('explainAnswer fallback', e);
    return {
      explanation: wasCorrect
        ? `${correctAnswer}で合っていましたね。この考え方はほかの問題でも応用がききます。`
        : `答えは「${correctAnswer}」でした。もう一度じっくり考えれば次は解けますよ。`,
      tip: '気になったら「詳しく」をもう一度押してみてね。',
    };
  }
}

// 単元を受けて「授業展開＋例題1問」を生成
async function generateLesson({ subject, grade, topic, context }) {
  const prompt = `あなたは優秀な家庭教師。学習者が「${context || topic}」を見て興味を持ち、次の単元を学びたいと言っています。

教科: ${subject || '一般'}
学年: ${grade || '高校'}
単元: ${topic || '—'}
被写体/文脈: ${context || '—'}

この単元の**短い授業**を組み立ててください。学習者が今見た対象との接続を強調し、「なぜこれを学ぶと面白いか」→「核心の概念」→「練習問題」の流れで。

以下のJSONのみで返答（説明・コードブロック不要）:
{
  "intro": "導入の話（被写体から単元への橋渡し、2-3文の話し言葉）",
  "steps": [
    { "title": "ステップ見出し（8字以内）", "body": "説明（2-3文の話し言葉）", "board": { "title": "黒板の短い見出し（6字以内）", "lines": ["黒板に書く2-4行（各20字以内）"] } }
  ],
  "question": "練習問題（1-2文）",
  "hint": "ヒント（1文）",
  "answer": "模範解答（短く）",
  "board_question": { "title": "問題の黒板見出し（6字以内）", "lines": ["黒板に書く2-4行（各20字以内）"] }
}

条件:
- steps は 2〜3個
- 学年相応の具体性で。中学なら言葉中心、高校なら式・法則名OK、大学なら分野用語OK
- 会話調・タメ口で親しみやすく`;

  try {
    const resp = await window.claude.complete(prompt);
    const m = resp.match(/\{[\s\S]*\}/);
    if (!m) throw new Error('no json');
    return JSON.parse(m[0]);
  } catch (e) {
    console.warn('generateLesson fallback', e);
    return {
      intro: `それじゃあ「${topic || 'この単元'}」について、ちょっとだけ授業しようか。`,
      steps: [
        { title: 'まず核心', body: `${topic}のポイントは「なぜそうなるか」の仕組みを押さえること。`, board: { title: topic || '授業', lines: [context || '身近な例から考える'] } },
      ],
      question: `${topic}について、身近な例を一つ挙げて説明してみて。`,
      hint: 'さっき見たものとつなげてみよう。',
      answer: '自由回答',
      board_question: { title: '問題', lines: [`${topic}の身近な例`] },
    };
  }
}

Object.assign(window, { useTypewriter, speak, generateQuestion, evaluateAnswer, explainAnswer, generateLesson });
