from fastapi import APIRouter, HTTPException
from app.schemas.schemas import ChatRequest
from app.models.report_db_module import save_report_log, get_report_from_db
from app.core.config import get_gemini_model
from google.genai import types

router = APIRouter(
    prefix ="/goal-skill-t/api",
    tags = ["Report"]
)

SYSTEM_PROMPT_REPORT = """
    당신은 사용자의 하루를 의미 있게 기록하고 성장을 돕는 '일지 전담 매니저'입니다.
    당신의 목표는 대화를 통해 다음 4가지 핵심 정보를 자연스럽게 이끌어내는 것입니다.

 1. **Topic:** 오늘 집중한 학습 주제나 프로젝트는 무엇인가요?
 2. **Activity:** 구체적으로 어떤 작업을 수행했나요? (코드 작성, 문서화, 기획 등)
 3. **Trouble & Solution:** 진행 중 겪은 문제나 에러는 무엇이었고, 어떻게 해결했나요?
 4. **Insight:** 오늘 경험을 통해 깨달은 점이나 내일의 계획은 무엇인가요?

 [대화 가이드]
 - 질문은 **한 번에 하나씩**만 하세요. 질문 폭격은 사용자를 지치게 합니다.
 - 사용자가 "그냥 했어" 같이 성의 없이 답하면, "어떤 강의를 보셨나요?", "에러 메시지는 기억나시나요?" 처럼 **구체적
   꼬리 질문**을 던지세요.
 - 4가지 정보가 모두 수집되었다고 판단되면, "오늘 하루도 수고 많으셨습니다. 일지 작성을 완료할까요?"라고 정중하게
   마무리 멘트를 하세요.
"""

@router.post("/Report")
async def chat_report(request: ChatRequest):
    try:
        # [1] 시작 신호 체크 ("일지 작성을 시작합니다" 같은 문구)
        # 프론트엔드에서 처음에 자동으로 보낼 메시지입니다.
        is_first_msg = (request.message == "일지 작성을 시작합니다.")
        is_empty_msg = (not request.message or request.message.strip() == "")

        # [2] 사용자 말 저장 (시작 신호와 빈 메시지는 저장 안 함)
        if not is_first_msg and not is_empty_msg:
            save_report_log(request.session_id, "user", request.message)
    
        # [3] 기억 불러오기 (이전 대화 내역)
        history = get_report_from_db(request.session_id)

        # [4] Gemini에게 보낼 메시지 꾸러미 만들기
        gemini_messages = []
        for h in history:
            # DB의 'bot'을 Gemini용 'model'로 이름표 바꿔 달기
            role = "model" if h['sender'] == 'bot' else "user"
            gemini_messages.append(types.Content(
                role=role,
                parts=[types.Part(text=h['message'])]
            ))

        # (중복 방지) 방금 DB에 넣은 사용자 메시지가 history에 아직 안 들어있을 수 있으니 안전하게 추가
        # 빈 메시지가 아닐 때만 추가
        if not is_first_msg and not is_empty_msg:
            # 리스트가 비어있거나, 마지막 메시지가 방금 보낸 게 아니라면 추가
            if not history or history[-1]['message'] != request.message:
                gemini_messages.append(types.Content(
                    role="user",
                    parts=[types.Part(text=request.message)]
                ))

        # [5] Gemini 호출
        client = get_gemini_model(system_instruction=SYSTEM_PROMPT_REPORT)
        
        # google.genai Client의 올바른 사용법
        if gemini_messages:
            # 메시지 히스토리가 있으면 히스토리와 함께 메시지 전달
            if is_empty_msg:
                # 복구 모드: 사용자가 마지막으로 답변했으므로, AI가 다음 질문을 생성
                gemini_messages.append(types.Content(
                    role="user",
                    parts=[types.Part(text="다음 질문을 해주세요.")]
                ))
            contents = gemini_messages
        else:
            # 첫 메시지인 경우
            contents = [types.Content(
                role="user",
                parts=[types.Part(text="일지 작성을 시작합니다.")]
            )]
        
        # Gemini API 호출 (google.genai.Client 사용)
        response = client.models.generate_content(
            model="gemini-2.0-flash-exp",
            contents=contents,
            config={"system_instruction": SYSTEM_PROMPT_REPORT}
        )
        
        answer = response.text

        # [6] AI 대답 저장
        save_report_log(request.session_id, "bot", answer)

        # [7] 프론트엔드에 대답 돌려주기
        return {"answer":answer}

    except Exception as e:
        # 에러 나면 로그 찍고 500번 에러 뱉기
        print(f"Report Error: {e}")
        raise HTTPException(status_code = 500 , detail=str(e))
