# app/routers/it_router.py

from fastapi import APIRouter, HTTPException
from app.models import it_module
from app.schemas.it_schema import StartITRequest, AnswerITRequest
from app.services.it_questions import get_it_questions, get_question_by_id
from app.services.it_scoring import calculate_final_result
from typing import List, Dict

router = APIRouter(
    prefix="/goal-skill-t/api/it",
    tags=["IT"]
)


@router.post("/start")
async def start_it_test(request: StartITRequest):
    """
    IT 기초 테스트 시작 - 첫 번째 문제 반환
    """
    try:
        # 이전 기록 초기화 (재시작용)
        it_module.clear_session_logs(request.session_id)
        
        questions = get_it_questions()
        first_question = questions[0]  # ID 1번 문제
        
        # 선택지를 A, B, C, D 형식으로 변환
        options_with_letters = []
        letters = ["A", "B", "C", "D", "E"]
        for i, opt in enumerate(first_question["options"]):
            if i < len(letters):
                options_with_letters.append(f"{letters[i]} {opt}")
        
        return {
            "question_id": first_question["id"],
            "question_text": first_question["question"],
            "options": options_with_letters,
            "current": 1,
            "total": len(questions)
        }
        
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.post("/answer")
async def answer_it_test(request: AnswerITRequest):
    """
    IT 기초 테스트 답변 처리
    
    1. 답변 저장 (it_log)
    2. 정답 여부 확인
    3. 마지막 문제면 결과 계산 & 저장
    4. 다음 문제 반환 or 완료 응답
    """
    try:
        questions = get_it_questions()
        total_questions = len(questions)
        
        # 현재 문제 정보 가져오기
        current_question = get_question_by_id(request.question_id)
        if not current_question:
            raise HTTPException(status_code=400, detail=f"Question {request.question_id} not found")
        
        # 선택한 답변에서 알파벳 제거 (예: "A DRAM (メモリ)" -> "DRAM (メモリ)")
        selected_answer_clean = request.selected_answer
        if " " in selected_answer_clean:
            parts = selected_answer_clean.split(" ", 1)
            if len(parts) > 1:
                selected_answer_clean = parts[1]
        
        # 정답 여부 확인
        correct_answer = current_question["answer"]
        is_correct = (selected_answer_clean.strip() == correct_answer.strip())
        
        # 답변 저장
        it_module.save_answer(
            session_id=request.session_id,
            question_id=request.question_id,
            selected_answer=selected_answer_clean,
            is_correct=is_correct
        )
        
        # 답변 수 확인
        answer_count = it_module.get_answer_count(request.session_id)
        
        # 마지막 문제인지 확인
        if answer_count >= total_questions:
            # ============================================
            # 완료: 결과 계산 & 저장
            # ============================================
            all_answers = it_module.get_all_answers(request.session_id)
            
            # calculate_final_result 형식에 맞게 변환
            answers_for_scoring = [
                {
                    "question_id": ans["question_id"],
                    "selected_answer": ans["selected_answer"],
                    "is_correct": ans["is_correct"]
                }
                for ans in all_answers
            ]
            
            result = calculate_final_result(request.session_id, answers_for_scoring)
            
            # DB에 저장
            it_module.save_or_update_output(
                session_id=request.session_id,
                total_score=result["total_score"],
                level=result["level"]
            )
            
            return {
                "status": "completed",
                "result": result
            }
        
        else:
            # ============================================
            # 다음 문제 반환
            # ============================================
            next_question_id = request.question_id + 1
            next_question = get_question_by_id(next_question_id)
            
            if not next_question:
                raise HTTPException(status_code=400, detail=f"Next question {next_question_id} not found")
            
            # 선택지를 A, B, C, D 형식으로 변환
            options_with_letters = []
            letters = ["A", "B", "C", "D", "E"]
            for i, opt in enumerate(next_question["options"]):
                if i < len(letters):
                    options_with_letters.append(f"{letters[i]} {opt}")
            
            return {
                "status": "continue",
                "next_question": {
                    "question_id": next_question["id"],
                    "question_text": next_question["question"],
                    "options": options_with_letters,
                    "current": answer_count + 1,
                    "total": total_questions
                }
            }
    
    except HTTPException:
        raise
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))
