# app/services/it_scoring.py
# Python レベルテスト — スコア計算 & レベル判定 (3段階: 初級/中級/上級)

from typing import Dict, List, Optional
from app.services.it_questions import get_question_by_id, get_level_name


def get_level_message(assigned_level: int, correct_count: int = 0, total_in_level: int = 10, wrong_details: list = None) -> str:
    """
    レベルに応じたメッセージ生成 (AI フィードバック付き)

    Args:
        assigned_level: 付与されるレベル (0~3)
        correct_count: そのレベルでの正解数
        total_in_level: そのレベルの総問題数
        wrong_details: 不正解の詳細リスト [{question, correct_answer, reason}, ...]

    Returns:
        レベル別案内メッセージ + 不正解フィードバック
    """
    level_name = get_level_name(assigned_level) if assigned_level > 0 else "入門"

    if assigned_level == 3 and correct_count == total_in_level:
        base_msg = (
            "素晴らしい！全レベルクリア！🎉\n\n"
            "Pythonの基礎から応用まで、しっかりと理解できています。\n"
            "実務レベルのプロジェクトに挑戦できる実力がありますね！"
        )
    elif assigned_level == 0:
        base_msg = (
            "お疲れ様でした！\n\n"
            "Pythonの世界はこれからです！\n"
            "基礎の基礎からじっくり学んでいきましょう。応援しています！"
        )
    else:
        level_topics = {
            1: "Python基本（print・変数・データ型・条件文・繰り返し）",
            2: "データ構造 & 関数（リスト・辞書・関数・ファイル操作）",
            3: "応用 & OOP（クラス・例外処理・モジュール・ラムダ・デコレータ）",
        }
        current_topic = level_topics.get(assigned_level, "")

        if correct_count == total_in_level:
            # 全問正解したがこれが最終到達レベル
            base_msg = (
                f"お疲れ様でした！\n\n"
                f"✅ {level_name}テスト全問正解です！\n"
                f"📚 学習範囲: {current_topic}\n\n"
                f"ここから一緒にレベルアップしていきましょう！"
            )
        else:
            wrong_count = total_in_level - correct_count
            base_msg = (
                f"お疲れ様でした！\n\n"
                f"📊 {level_name}テスト結果: {correct_count}/{total_in_level}問正解\n"
                f"❌ 不正解: {wrong_count}問\n"
                f"📚 学習範囲: {current_topic}\n\n"
                f"間違えた部分を重点的に復習しましょう！"
            )

    # 不正解詳細がある場合でもテキストには追加せず、UI(カード)でのみ表示させるように削除。
    pass

    return base_msg


def calculate_final_result(
    session_id: str,
    assigned_level: int,
    correct_count: int = 0,
    total_in_level: int = 10,
    wrong_details: list = None,
    failed_at_level: int = None
) -> Dict:
    """
    最終結果計算

    Args:
        session_id: セッションID
        assigned_level: 付与されるレベル (0~3)
        correct_count: 正解数
        total_in_level: そのレベルの総問題数
        wrong_details: 不正解詳細リスト
        failed_at_level: 不合格だったレベル (None = 全クリア)

    Returns:
        {
            "total_score": assigned_level,
            "level": "初級" / "中級" / "上級",
            "message": "メッセージ",
            "total_questions": 30,
            "correct_count": N,
            "wrong_details": [...]
        }
    """
    level_name = get_level_name(assigned_level) if assigned_level > 0 else "入門"
    message = get_level_message(assigned_level, correct_count, total_in_level, wrong_details)

    return {
        "total_score": assigned_level,
        "level": level_name,
        "message": message,
        "total_questions": 30,
        "correct_count": correct_count,
        "wrong_details": wrong_details or []
    }
