from fastapi import APIRouter, HTTPException
from app.models import findgoal_module
from app.schemas.findgoal_schema import StartFindGoalRequest, AnswerFindGoalRequest
from app.core.config import get_gemini_model
from google.genai import types
import json

router = APIRouter(
    prefix="/goal-skill-t/api/findgoal",
    tags=["FindGoal"]
)

SYSTEM_PROMPT_FINDGOAL = """
あなたはユーザーの学習動機を確認するコーチです。
ユーザーが学習を続けるための「具体的な目標」を簡潔に把握してください。

【役割】
- 表面的な目標（例：「資格を取りたい」）だけでなく、その理由を1〜2回聞いて具体化してください。
- 長々と質問せず、効率的に目標を確定してください。

【質問の進め方】
1. 初回：何を学びたいか、何を目指しているか
2. 2回目：その目標の理由や、実現後の変化
3. 具体的な目標が出たら即座に確定

【終了条件（重要）】
以下のいずれかに該当したら、**直ちに** confidence 0.95 で終了してください：
- 就職、転職、昇進などの具体的なキャリア目標が出た
- 資格取得の理由が明確になった
- 給料アップや転職など、実現したいことが明確になった
- 2〜3回の質問で十分な情報が集まった

【重要な注意事項】
- **ユーザーが言っていない内容を絶対に追加しないでください**
- final_goalには、ユーザーが実際に話した内容だけを記載してください
- 勝手に旅行先や具体的な計画を補完しないでください

【出力フォーマット (JSON)】
{
    "confidence": 0.5,
    "reasoning": "ユーザーは資格取得を希望。理由を確認する必要がある。",
    "next_question": "その資格を取ることで、どんな変化を期待していますか？",
    "final_goal": "（confidenceが0.9以上の場合のみ）資格取得による昇進と給料アップ"
}

【例】
ユーザー：「資格を取って昇進したい」
→ final_goal: "資格取得による昇進"（シンプルに要約）

ユーザー：「資格を取って昇進して給料を上げたい」
→ final_goal: "資格取得による昇進と給料アップ"（言った通りに）
"""


@router.post("/start")
async def start_findgoal(request: StartFindGoalRequest):
    try:
        client = get_gemini_model()
        base_question = """まず、ここで何を達成したいのか自由に教えてください。
(例：資格を取得したい、会社で昇進したい など)"""

        rephrase_prompt = f"""
あなたは親しみやすいコーチです。
以下の「基準質問」を、緊張せずに答えられるように「自然で温かい日本語」に変更してください。
[基準質問] :
"{base_question}"
【遵守事項】
1. **意味は絶対に変えない**：GOALSKILLを始めた理由を尋ねること
2. **重要**: 挨拶は含めないでください（既に一般チャットで挨拶済みのため）
3. **重要**: 応答は必ず2つのメッセージに分けてください：
   - 1つ目: **質問のみ**（例：「まず、ここでどんなことを達成したいか、あなたの目標を聞かせてもらってもいいですか？」）
   - 2つ目: **例の提示のみ**（例：「例えば、資格を取得したい、会社で昇進したいなど、どんなことでも大丈夫です。」）
4. **絶対に守ること**: 
   - 1つ目のメッセージには質問だけを含め、例は含めないでください
   - 2つ目のメッセージには例だけを含め、質問は含めないでください
5. **例は必ず2つ目のメッセージに含める必要があります**：資格取得、昇進などの例を必ず含めてください
出力は2つのメッセージを改行で区切って返してください（1つ目のメッセージ、改行、2つ目のメッセージ）。
"""
        
        # 4. AI 호출
        response = client.models.generate_content(
            model="gemini-2.5-flash",
            contents=[types.Content(role="user", parts=[types.Part(text=rephrase_prompt)])]
        )
        
        ai_response = response.text.strip()
        
        # 5. AI가 빈 응답 주면 기준 질문 사용 (안전장치)
        if not ai_response:
            ai_response = base_question
        
        # 6. 응답을 2개로 나누기 (改行で区切られている場合)
        questions = [q.strip() for q in ai_response.split('\n') if q.strip()]
        
        if len(questions) >= 2:
            # 2개 이상이면 첫 번째와 두 번째를 분리
            first_question = questions[0]
            second_question = questions[1]
            # DB에는 전체를 하나로 저장 (대화 흐름 유지)
            full_question = f"{first_question}\n{second_question}"
        else:
            # 1개만 있으면 그대로 사용
            first_question = questions[0] if questions else ai_response
            second_question = None
            full_question = first_question
        
        # 7. DB에 저장 (user_id 제거)
        findgoal_module.save_question(
            session_id=request.session_id,
            step_order=1,
            question_text=full_question
        )
        
        # 8. 프론트에 반환 (2개로 나뉘어 있으면 배열로 반환)
        if second_question:
            return {
                "questions": [first_question, second_question],
                "step": 1
            }
        else:
            return {
                "question": first_question,
                "step": 1
            }

    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))
        


async def analyze_with_gemini(session_id: str, user_answer: str):

    try:
        # 1. AIクライアントの取得
        client = get_gemini_model()

        # 2. DBから全体の会話履歴を取得
        history_list = findgoal_module.get_conversation_history(session_id)

        # 3. 会話履歴をテキストに変換
        history_text = ""
        for h in history_list:
            if h['question_text']:
                history_text += f"AI: {h['question_text']}\n"
            if h['answer_text']:
                history_text += f"User: {h['answer_text']}\n"

        # 4. AI에게 보낼 프롬프트 구성
        user_prompt = f"""
        [今までの会話履歴]:
        {history_text}
        [Userの最新の回答]:
        {user_answer}
        上記の流れを踏まえて、次のレスポンスをJSON形式で生成してください。
"""

        # 5. AI 호출 (SYSTEM_PROMPT 적용)
        response = client.models.generate_content(
            model="gemini-2.5-flash",
            contents=[types.Content(role="user", parts=[types.Part(text=user_prompt)])],
            config={
                "system_instruction": SYSTEM_PROMPT_FINDGOAL,
                "response_mime_type": "application/json"
            }
        )

        # 6. JSON 파싱해서 반환
        return json.loads(response.text)

    except Exception as e:
        # AI 에러 시 기본 응답 반환 (시스템이 멈추지 않게)
        print(f"Gemini Error: {e}")
        return {
            "confidence": 0.0,
            "next_question": "すみません、エラーが発生しました。もう一度教えていただけますか？",
            "reasoning": "AI Error"
        }

@router.post("/answer")
async def answer_findgoal(request: AnswerFindGoalRequest):
    """
    사용자 답변 처리 API
    
    왜 필요한가?
    - 사용자가 답변을 입력할 때마다 호출
    - 답변을 DB에 저장하고 AI로 분석
    - confidence가 0.9 이상이면 목표 확정, 아니면 다음 질문 생성
    """
    try:
        # ============================================
        # 1. 이전 질문 정보 가져오기
        # ============================================
        # - 현재 몇 번째 대화인지 파악 (step_order)
        # - 답변을 어느 질문에 연결할지 알아야 함 (question_id)
        # - DB의 Q-A 관계를 연결하기 위해 필수
        
        last_question = findgoal_module.get_last_question(request.session_id)
        
        if not last_question:
            # 질문이 없다 = /start를 안 호출했다
            raise HTTPException(status_code=400, detail="No question found. Call /start first.")
        
        current_step = last_question['step_order']
        question_id = last_question['id']
        
        
        # ============================================
        # 2. 사용자 답변 DB에 저장 (findgoal_A)
        # ============================================
        # - 대화 내역을 모두 기록해야 나중에 AI가 전체 흐름을 이해할 수 있음
        # - 사용자가 뭐라고 답했는지 추적 가능 (디버깅, 분석에 필수)
        
        answer_id = findgoal_module.save_answer(
            session_id=request.session_id,
            question_id=question_id,
            answer_text=request.user_answer
        )
        
        
        # ============================================
        # 3. AI로 답변 분석
        # ============================================
        # - 사용자 답변만으로는 "목표를 찾았는지" 판단 불가
        # - AI가 전체 대화 흐름을 보고 confidence 점수 계산
        # - 다음에 무엇을 물어볼지 AI가 결정
        
        ai_result = await analyze_with_gemini(
            session_id=request.session_id,
            user_answer=request.user_answer
        )
        
        confidence = ai_result.get('confidence', 0.0)
        reasoning = ai_result.get('reasoning', '')
        next_question_text = ai_result.get('next_question', '')
        final_goal = ai_result.get('final_goal', '')
        
        
        # ============================================
        # 4. AI 분석 결과 DB에 저장 (findgoal_P)
        # ============================================
        # - AI가 왜 이런 판단을 했는지 기록 (reasoning)
        # - confidence 변화 추적 (0.3 → 0.5 → 0.7 → 0.95 이런 흐름 분석 가능)
        # - 나중에 "AI가 어떤 근거로 목표를 찾았는지" 확인 가능
        
        findgoal_module.save_processing(
            session_id=request.session_id,
            confidence_score=confidence,
            reasoning=reasoning
        )
        
        
        # ============================================
        # 5. Confidence 확인 및 분기 처리
        # ============================================
        # 왜 필요한가?
        # - confidence < 0.9: 아직 목표가 명확하지 않음 → 대화 계속
        # - confidence ≥ 0.9: 목표를 찾았다! → 대화 종료, 최종 결과 저장
        
        if confidence >= 0.9:
            # ============================================
            # 5-1. 목표 확정: findgoal_Output에 저장
            # ============================================
            # - C파트(커리큘럼 생성)에서 이 목표를 읽어서 사용
            # - 세션당 1개의 최종 목표만 저장 (ON DUPLICATE KEY UPDATE)
            
            findgoal_module.save_or_update_output(
                session_id=request.session_id,
                final_goal=final_goal
            )
            
            # user_profile_summary에도 동기화
            findgoal_module.sync_to_user_profile_summary(
                session_id=request.session_id,
                final_goal=final_goal
            )
            
            # 프론트에 "완료" 신호 전달
            return {
                "status": "completed",
                "confidence": confidence,
                "final_goal": final_goal,
                "reasoning": reasoning,
                "message": "目標が確定しました！"
            }
        
        else:
            # ============================================
            # 5-2. 대화 계속: 다음 질문 생성
            # ============================================
            # - AI가 아직 목표가 명확하지 않다고 판단 (confidence < 0.9)
            # - 더 깊이 파고들기 위해 다음 질문 필요
            
            next_step = current_step + 1
            
            # 다음 질문을 DB에 저장
            findgoal_module.save_question(
                session_id=request.session_id,
                step_order=next_step,
                question_text=next_question_text
            )
            
            findgoal_module.sync_to_user_profile_summary(
                session_id=request.session_id,
                final_goal=final_goal
            )
            # 프론트에 "다음 질문" 전달
            return {
                "status": "continue",
                "confidence": confidence,
                "question": next_question_text,
                "step": next_step,
                "reasoning": reasoning
            }
    
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

