from fastapi import APIRouter, HTTPException, Query
from typing import Optional
from app.schemas.chat_log_schema import SaveChatLogRequest, CreateSessionRequest, UpdateSessionTitleRequest
from app.models.chat_log_module import (
    save_chat_log, get_chat_logs,
    create_chat_session, get_chat_sessions, get_session_messages,
    delete_chat_session, update_session_title
)

router = APIRouter(
    prefix="",
    tags=["ChatLog"]
)


# ==========================================
# 기존 API (하위호환)
# ==========================================

@router.post("/save_chat_log")
async def save_chat_log_api(request: SaveChatLogRequest):
    """
    대화 로그 저장
    - chat_messages 테이블에 저장
    - category로 파트 구분 (condition, journal, curriculum, findgoal 등)
    - chat_session_id로 세션 연결 (optional)
    """
    try:
        save_chat_log(
            session_id=request.session_id,
            log=request.log,
            sender=request.sender,
            daily=request.daily,
            category=request.category,
            chat_session_id=request.chat_session_id
        )
        return {"status": "ok", "message": "Chat log saved successfully"}
    except ValueError as e:
        raise HTTPException(status_code=400, detail=str(e))
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.get("/chat_log/{session_id}")
async def get_chat_log_api(
    session_id: str,
    category: Optional[str] = Query(None, description="카테고리 필터 (예: condition, understanding, ppt)"),
    daily: Optional[int] = Query(None, description="일차 필터")
):
    """
    대화 로그 조회 (기존 호환)
    """
    try:
        logs = get_chat_logs(
            session_id=session_id,
            category=category,
            daily=daily
        )
        return {"logs": logs}
    except ValueError as e:
        raise HTTPException(status_code=400, detail=str(e))
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


# ==========================================
# 새 API: chat_sessions
# ==========================================

@router.post("/chat_session/create")
async def create_session_api(request: CreateSessionRequest):
    """
    새 채팅 세션 생성 → chat_session_id 반환
    """
    try:
        chat_session_id = create_chat_session(
            session_id=request.session_id,
            category=request.category,
            title=request.title,
            daily=request.daily
        )
        return {"status": "ok", "chat_session_id": chat_session_id}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.get("/chat_sessions/{session_id}")
async def get_sessions_api(session_id: str):
    """
    유저의 채팅 세션 목록 조회 (최신순, 사이드바용)
    """
    try:
        sessions = get_chat_sessions(session_id)
        return {"sessions": sessions}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.get("/chat_session/{chat_session_id}/messages")
async def get_session_messages_api(chat_session_id: int):
    """
    특정 세션의 메시지 조회 (대화 복원용)
    """
    try:
        messages = get_session_messages(chat_session_id)
        return {"messages": messages}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.delete("/chat_session/{chat_session_id}")
async def delete_session_api(chat_session_id: int):
    """
    세션 + 해당 메시지 삭제
    """
    try:
        success = delete_chat_session(chat_session_id)
        if success:
            return {"status": "ok", "message": f"Session #{chat_session_id} deleted"}
        raise HTTPException(status_code=404, detail="Session not found or delete failed")
    except HTTPException:
        raise
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.put("/chat_session/{chat_session_id}/title")
async def update_session_title_api(chat_session_id: int, request: UpdateSessionTitleRequest):
    """
    세션 제목 수정
    """
    try:
        success = update_session_title(chat_session_id, request.title)
        if success:
            return {"status": "ok", "message": "Title updated"}
        raise HTTPException(status_code=404, detail="Session not found")
    except HTTPException:
        raise
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))
