from fastapi import APIRouter, HTTPException
from fastapi.responses import FileResponse
from pydantic import BaseModel
from app.models.summary_module import get_summary_data, generate_ai_analysis
from app.models.general_module import update_a_part_status
from app.core.config import logger, STUDYPLAN_FILES_PATH, get_gemini_model
from app.services.goalskill_classifier import classify_and_save
from app.models.chat_log_module import get_chat_logs
from google.genai import types
import os
import json
import re

router = APIRouter(
    prefix="",
    tags=["Summary"]
)

class SummaryRequest(BaseModel):
    session_id: str

class AnswerSummaryRequest(BaseModel):
    session_id: str
    message: str
    curriculum_shown: bool = False


def _build_profile_text(data: dict) -> str:
    """프로필 데이터를 텍스트로 변환"""
    parts = []
    if data.get("goal"):
        parts.append(f"目標: {data['goal']}")
    if data.get("mbti"):
        parts.append(f"MBTI: {data['mbti']}")
    if data.get("spi"):
        spi = data["spi"]
        parts.append(f"SPI: 言語={spi.get('language_grade', '-')}, 非言語={spi.get('nonverbal_grade', '-')}")
    if data.get("studyplan"):
        sp = data["studyplan"]
        parts.append(
            f"学習計画: 期間={sp.get('duration', '-')}, "
            f"週{sp.get('study_days', '-')}日, "
            f"{sp.get('weekday_hours', '-')}時間/日, "
            f"時間帯={sp.get('time_slot', '-')}"
        )
    if data.get("it_level"):
        parts.append(f"ITレベル: {data['it_level']}")
    return "\n".join(parts) if parts else "データなし"


# ==========================================
# 기존 API (하위호환 유지)
# ==========================================

@router.get("/status/{session_id}")
async def get_summary_status(session_id: str):
    """分析結果ステータスのみ取得 (AI生成なし)"""
    try:
        data = get_summary_data(session_id)
        return {"status": "success", "data": data}
    except Exception as e:
        logger.error(f"Summary Status API Error: {e}")
        return {"status": "error", "message": str(e), "data": {}}

@router.post("")
async def get_summary(request: SummaryRequest):
    """기존 Summary API (하위호환)"""
    try:
        data = get_summary_data(request.session_id)
        ai_comment = await generate_ai_analysis(data)
        data["ai_analysis"] = ai_comment
        update_a_part_status(request.session_id, 1)
        return {"status": "success", "data": data}
    except Exception as e:
        logger.error(f"Summary API Error: {e}")
        return {"status": "error", "message": str(e), "data": {}}


# ==========================================
# 대화형 API (신규)
# ==========================================

@router.post("/start")
async def start_summary_chat(request: SummaryRequest):
    """サマリー開始（対話型）"""
    try:
        data = get_summary_data(request.session_id)
        ai_comment = await generate_ai_analysis(data)
        data["ai_analysis"] = ai_comment

        greeting = "ここまで事前の準備、本当にお疲れ様でした！いよいよ学習の準備が整いましたね😊|画面にあなたのプロフィール結果が表示されているので、確認してみてください！|この結果をもとに、あなた専用のカリキュラムを作成しましょうか？✨"

        logger.info(f"Summary Chat Started for session: {request.session_id}")
        return {"question": greeting, "data": data}
    except Exception as e:
        logger.error(f"Summary Start Error: {e}")
        raise HTTPException(status_code=500, detail=str(e))


@router.post("/answer")
async def answer_summary_chat(request: AnswerSummaryRequest):
    """サマリー応答（対話型）"""
    try:
        # Goalskill 48분류 DB 저장
        await classify_and_save(session_id=request.session_id, sender="M", part="A", text=request.message)

        # 대화 履歴 취득
        logs = get_chat_logs(request.session_id, category="summary")
        history_lines = []
        for log in logs[-10:]:
            if log["sender"] in ["M", "user", "user_id"] and log["log"] == request.message:
                continue
            sender_name = "User" if log["sender"] in ["M", "user", "user_id"] else "Bot"
            history_lines.append(f"{sender_name}: {log['log']}")
        history_lines.append(f"User: {request.message}")
        history_text = "\n".join(history_lines)

        # 프로필 데이터 컨텍스트
        data = get_summary_data(request.session_id)
        profile_text = _build_profile_text(data)

        # 페이즈별 지시
        if request.curriculum_shown:
            phase_instruction = """【現在のフェーズ: カリキュラム案内済み】
- 入力欄のキーボード（⌨️）からカリキュラムを確認するよう、ユーザーに案内した直後です。
- ユーザーが学習開始に同意（「はい」「始める」「やる」「移動する」等）→ status: "start_learning"
- ユーザーが「カリキュラムを見たい」「どうやって？」などと聞いた場合 → status: "continue"（「入力欄にあるキーボードボタン（⌨️）を押して、『カリキュラム』を選択してくださいね！」と優しく案内する）
- それ以外の雑談 → status: "continue"（短く応答して学習開始を促す）"""
        else:
            phase_instruction = """【現在のフェーズ: プロフィール確認中】
- ユーザーにプロフィールカードを表示し、カリキュラム作成を案内している段階です。
- ユーザーがカリキュラム作成に同意（「はい」「作って」「お願い」等）→ status: "completed"
- プロフィールへの質問や雑談 → status: "continue"（答えてからカリキュラム作成を再案内）"""

        system_prompt = f"""あなたはGoalSkillの学習パートナー「トブ」です。
ユーザーのプロフィール分析結果を確認し、カリキュラム作成へ導く会話をしています。

【ユーザーのプロフィール情報】
{profile_text}

{phase_instruction}

【現在の会話ログ】
{history_text}

【応答フォーマット（JSON）】
- 通常: {{"status": "continue", "answer": "応答文"}}
- カリキュラム作成同意: {{"status": "completed", "answer": "短い承認メッセージ", "followup": "PDF表示後のメッセージ。「あなた専用のカリキュラムが完成しました！」などの完了祝いと、必ず改行(\\n)を挟み「このまま学習スペースへ移動して、さっそく勉強を始めてみますか？」と学習へ進むかを聞く質問を含めること"}}
- 学習開始同意: {{"status": "start_learning", "answer": "学習ページ移動の案内"}}

【重要ルール】
- 過剰な称賛や不自然な共感は避ける
- 短くて自然な応答（2〜3文以内）
- 会話ログを確認し、同じ質問を繰り返さない"""

        client = get_gemini_model()
        response = client.models.generate_content(
            model='gemini-2.5-flash',
            contents=system_prompt,
            config=types.GenerateContentConfig(response_mime_type="application/json")
        )

        try:
            result = json.loads(response.text)
        except json.JSONDecodeError:
            result = {"status": "continue", "answer": "すみません、うまく聞き取れませんでした。もう一度教えてください😊"}

        status = result.get("status", "continue")
        answer = result.get("answer", "もう少し詳しく教えてください😊")

        # AI 응답 Goalskill DB 저장
        await classify_and_save(session_id=request.session_id, sender="I", part="A", text=answer)

        if status == "completed":
            update_a_part_status(request.session_id, 1)
            followup = result.get("followup", "あなた専用のカリキュラムが完成しました！\nこのまま学習スペースへ移動して、さっそく勉強を始めてみますか？😊")
            return {"status": "completed", "message": answer, "followup": followup}
        elif status == "start_learning":
            return {"status": "start_learning", "message": answer}
        else:
            return {"status": "continue", "question": answer}

    except Exception as e:
        logger.error(f"Summary Answer Error: {e}")
        raise HTTPException(status_code=500, detail=str(e))


# ==========================================
# PDF 서빙 (기존 유지)
# ==========================================

@router.get("/curriculum/{session_id}")
async def get_curriculum_pdf(session_id: str):
    """커리큘럼 PDF 파일 서빙"""
    try:
        pdf_path = os.path.join(STUDYPLAN_FILES_PATH, f"curriculum_{session_id}.pdf")
        logger.info(f"Curriculum PDF Request: session_id={session_id}, path={pdf_path}")

        if not os.path.exists(pdf_path):
            logger.error(f"Curriculum PDF not found: {pdf_path}")
            raise HTTPException(status_code=404, detail=f"Curriculum PDF not found for session: {session_id}")

        logger.info(f"Curriculum PDF found: {pdf_path}")
        from urllib.parse import quote
        filename = f"カリキュラム_{session_id}.pdf"
        encoded_filename = quote(filename)

        return FileResponse(
            pdf_path,
            media_type="application/pdf",
            headers={
                "Content-Disposition": f'inline; filename="{encoded_filename}"; filename*=UTF-8\'\'{encoded_filename}'
            }
        )
    except HTTPException:
        raise
    except Exception as e:
        logger.error(f"Curriculum PDF Error: {e}")
        raise HTTPException(status_code=500, detail=str(e))
