from fastapi import APIRouter, HTTPException
from fastapi.responses import FileResponse
from app.schemas import studyplan_schema
from app.models import studyplan_module
from app.core.config import logger, get_gemini_model
from app.services.goalskill_classifier import classify_and_save
from app.models.chat_log_module import save_chat_log as save_to_chat_messages, get_chat_logs
from google.genai import types
import json
import re
from app.models.summary_module import get_summary_data

router = APIRouter(
    prefix="",
    tags=["StudyPlan"]
)


@router.post("/start")
async def start_studyplan(request: studyplan_schema.StartStudyPlanRequest):
    """
    학습계획표 시작 (대화형)
    """
    try:
        greeting = (
            "ここまで来ましたね😊\n\n"
            "これからは一緒に、あなたの目標に向かって進んでいきます🤝\n\n"
            "最後まで無理なく続けられるように、まずはペースを一緒に整えていきましょうか？👀\n\n"
            "どれくらいの期間で目標を達成したいイメージがありますか？\n"
            "（※現在は6ヶ月コースのみご用意しております）"
        )
        logger.info(f"StudyPlan Started for session: {request.session_id}")
        
        return {
            "question": greeting
        }
    except Exception as e:
        logger.error(f"StudyPlan Start Error: {e}")
        raise HTTPException(status_code=500, detail=str(e))


@router.post("/answer")
async def answer_studyplan(request: studyplan_schema.AnswerStudyPlanRequest):
    """
    학습계획표 답변 제출 (대화형)
    """
    try:
        # DB 저장 (classify_and_save는 Goalskill 48분류용이므로 유지, chat_messages 중복 저장은 제거)
        await classify_and_save(session_id=request.session_id, sender="M", part="A", text=request.message)

        # 과거 대화 기록 가져오기 (문맥 파악용)
        logs = get_chat_logs(request.session_id, category="studyplan")
        
        # history_text 구성 (프론트 통신 레이스 컨디션 방지를 위해 현재 유저 메시지도 명시적으로 포함)
        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)

        # 유저 이름 가져오기
        try:
            summary_data = get_summary_data(request.session_id)
            username = summary_data.get("username", "あなた")
            if not username or username.strip() == "":
                username = "あなた"
        except:
            username = "あなた"

        system_prompt = f"""あなたはGoalSkillの学習パートナー「トブ」です。
ユーザー（名前: {username}）と楽しく会話しながら、以下の4つの学習設定項目をヒアリングしてください。

【ペルソナ（Human UI）とルール】
1. 面接官や機械のような硬い定型文は厳禁です。
2. ユーザーの回答に対して「なるほど！」「おお、いいですね！」「無理なく進めるのが一番です😊」「素晴らしい！」など、回答の内容に合わせて**毎回異なる自然なリアクション**をしてください。「なるほど〜！」を何度も繰り返すなど、ロボットのようなワンパターンな話し方は絶対に避けてください。
3. 絵文字を少しだけ（1~2個）交えて、友達のようにフレンドリーで温かいトーンを維持してください。
4. ユーザーを呼ぶ時は必ず「{username}」と呼んでください。「〇〇さん」のようなプレースホルダーは絶対に使わないでください。
5. Markdownブロック(```json)は含めず、この仕様通りの**純粋なJSONオブジェクトのみ**を出力してください。

【収集すべき4つの必須項目】
1. total_duration (総学習期間) - 現在は「6ヶ月」コースのみ対応しています。ユーザーが6ヶ月以外を希望した場合は、「現在は6ヶ月コースのみご用意しています😊」と丁寧に案内し、6ヶ月で進めてよいか確認してください。
2. study_days (1週間の学習日数) - 例: 5, 7 など数字のみ
3. preferred_time_slot (希望する学習時間帯) - 例: 朝、夜、いつでも
4. weekday_hours (1日あたりの学習時間) - 例: 2 など数字のみ

【現在の会話ログ】
{history_text}

【出力形式（JSONのみを出力）】
1. **会話ログを読んで4項目すべて揃っている場合**
   これ以上質問せず、次の完了JSONのみを返してください:
   {{"status": "completed", "total_duration": "...", "study_days": "X", "preferred_time_slot": "...", "weekday_hours": "X"}}

2. **揃っていない項目がある場合**
   足りない項目を「一度に一つだけ」質問してください。
   例: {{"status": "continue", "question": "週3日ですね、無理なく進められていいペースだと思います！🗓\\n\\nちなみに、学習するとしたら1日のうちでだいたいいつ頃（朝とか夜とか）が一番集中できそうですか？"}}

※**過去に言った自分のセリフのパターンを繰り返さないこと**。「なるほど」等の同じ相槌の連発は禁止です。
"""

        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:
            try:
                raw_text = response.text.strip()
                raw_text = re.sub(r'^```json\s*', '', raw_text, flags=re.IGNORECASE)
                raw_text = re.sub(r'```\s*$', '', raw_text).strip()
                result = json.loads(raw_text)
            except Exception:
                result = {"status": "continue", "question": "すみません、上手く聞き取れませんでした。もう一度教えていただけますか？"}

        if result.get("status") == "completed":
            # 4가지 정보 추출 및 DB 저장
            total_duration = str(result.get("total_duration", "3ヶ月"))
            try:
                study_days = int(result.get("study_days", 5))
            except:
                study_days = 5
            preferred_time_slot = str(result.get("preferred_time_slot", "夜"))
            try:
                weekday_hours = int(result.get("weekday_hours", 1))
            except:
                weekday_hours = 1

            studyplan_module.save_studyplan_output(
                session_id=request.session_id,
                total_duration=total_duration,
                study_days=study_days,
                preferred_time_slot=preferred_time_slot,
                weekday_hours=weekday_hours
            )
            
            plan_summary = f"学習計画: 期間={total_duration}, 週{study_days}日, 時間帯={preferred_time_slot}, 1日{weekday_hours}時間"
            await classify_and_save(session_id=request.session_id, sender="I", part="A", text=plan_summary)

            studyplan_module.sync_to_user_profile_summary(
                session_id=request.session_id,
                studyplan_duration=total_duration,
                studyplan_study_days=study_days,
                studyplan_time_slot=preferred_time_slot,
                studyplan_weekday_hours=weekday_hours
            )

            completion_msg = (
                "ばっちりです！これであなたの生活リズムに合わせた完璧なスケジュールが完成しましたよ🎉\n\n"
                "いよいよあなた専用のカリキュラムを作成する準備が整いました。ここまで本当にお疲れ様でした！😊"
            )
            # chat_messages 중복 저장 제거
            await classify_and_save(session_id=request.session_id, sender="I", part="A", text=completion_msg)

            return {
                "status": "completed",
                "message": completion_msg
            }
        else:
            bot_question = result.get("question", "もう少し詳しく教えてください！")
            # chat_messages 중복 저장 제거
            await classify_and_save(session_id=request.session_id, sender="I", part="A", text=bot_question)
            return {
                "status": "continue",
                "question": bot_question
            }
        
    except Exception as e:
        logger.error(f"StudyPlan Answer Error: {e}")
        raise HTTPException(status_code=500, detail=str(e))