# ============================================================================
# 인증 라우터 - 로그인 / 회원가입 API
# ============================================================================

from fastapi import APIRouter, HTTPException
from app.schemas.auth_schema import (
    RegisterRequest,
    LoginRequest,
    AuthResponse,
    ProgressUpdateRequest,
)
from app.models.auth_module import (
    create_user,
    authenticate_user,
    get_user_by_session,
    get_study_progress,
    update_study_progress,
)
from app.core.config import logger

router = APIRouter(
    tags=["Authentication"],
)


# --------------------------------------------------------------------------
# 회원가입
# --------------------------------------------------------------------------
@router.post("/register", response_model=AuthResponse)
async def api_register(request: RegisterRequest):
    """
    새 유저를 등록합니다.
    - user_id: 로그인 아이디
    - password: 비밀번호
    """
    if not request.user_id or not request.password:
        raise HTTPException(status_code=400, detail="아이디와 비밀번호를 입력해주세요.")

    if len(request.password) < 4:
        raise HTTPException(status_code=400, detail="비밀번호는 4자리 이상이어야 합니다.")

    result = create_user(request.user_id, request.password)
    return AuthResponse(
        success=result["success"],
        session_id=result["session_id"],
        user_id=request.user_id if result["success"] else None,
        message=result["message"],
    )


# --------------------------------------------------------------------------
# 로그인
# --------------------------------------------------------------------------
@router.post("/login", response_model=AuthResponse)
async def api_login(request: LoginRequest):
    """
    유저 로그인을 수행합니다.
    - user_id: 로그인 아이디
    - password: 비밀번호
    """
    if not request.user_id or not request.password:
        raise HTTPException(status_code=400, detail="아이디와 비밀번호를 입력해주세요.")

    result = authenticate_user(request.user_id, request.password)
    return AuthResponse(
        success=result["success"],
        session_id=result["session_id"],
        user_id=request.user_id if result["success"] else None,
        message=result["message"],
    )


# --------------------------------------------------------------------------
# 세션 검증
# --------------------------------------------------------------------------
@router.get("/me/{session_id}")
async def api_check_session(session_id: str):
    """
    세션 ID가 유효한지 검증합니다.
    """
    user = get_user_by_session(session_id)
    if not user:
        raise HTTPException(status_code=401, detail="유효하지 않은 세션입니다.")

    return {
        "valid": True,
        "user_id": user["user_id"],
        "session_id": user["session_id"],
    }


# --------------------------------------------------------------------------
# 학습 진행도
# --------------------------------------------------------------------------
@router.get("/progress/{session_id}")
async def api_get_progress(session_id: str):
    """유저의 학습 진행도를 조회합니다."""
    user = get_user_by_session(session_id)
    if not user:
        raise HTTPException(status_code=401, detail="유효하지 않은 세션입니다.")

    progress = get_study_progress(session_id)
    return {
        "session_id": session_id,
        "user_id": user["user_id"],
        "progress": progress,
    }


@router.put("/progress")
async def api_update_progress(request: ProgressUpdateRequest):
    """학습 진행도를 업데이트합니다."""
    valid_statuses = ["NOT_STARTED", "IN_PROGRESS", "COMPLETED"]
    if request.status not in valid_statuses:
        raise HTTPException(
            status_code=400,
            detail=f"유효하지 않은 상태입니다. 가능: {valid_statuses}",
        )

    result = update_study_progress(
        session_id=request.session_id,
        item_id=request.item_id,
        status=request.status,
        score=request.score,
    )

    if not result["success"]:
        raise HTTPException(status_code=500, detail=result["message"])

    return result
