"""
学習ノート REST API ルーター
"""
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from typing import Optional
from app.models.note_module import (
    create_study_note, get_study_notes, get_study_note,
    update_study_note, delete_study_note
)

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


# ==========================================
# Request Schema
# ==========================================

class CreateNoteRequest(BaseModel):
    session_id: str
    title: str = ""
    content: str = ""
    source_message: Optional[str] = None
    daily: Optional[int] = None

class UpdateNoteRequest(BaseModel):
    title: Optional[str] = None
    content: Optional[str] = None


# ==========================================
# API Endpoints
# ==========================================

@router.post("/note/create")
async def create_note_api(request: CreateNoteRequest):
    """새 학습 노트 생성"""
    try:
        note_id = create_study_note(
            session_id=request.session_id,
            title=request.title,
            content=request.content,
            source_message=request.source_message,
            daily=request.daily
        )
        return {"status": "ok", "note_id": note_id}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.get("/notes/{session_id}")
async def get_notes_api(session_id: str):
    """유저의 전체 노트 목록"""
    try:
        notes = get_study_notes(session_id)
        return {"notes": notes}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.get("/note/{note_id}")
async def get_note_api(note_id: int):
    """단일 노트 조회"""
    try:
        note = get_study_note(note_id)
        if not note:
            raise HTTPException(status_code=404, detail="Note not found")
        return {"note": note}
    except HTTPException:
        raise
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.put("/note/{note_id}")
async def update_note_api(note_id: int, request: UpdateNoteRequest):
    """노트 수정"""
    try:
        success = update_study_note(note_id, title=request.title, content=request.content)
        if success:
            return {"status": "ok", "message": f"Note #{note_id} updated"}
        raise HTTPException(status_code=404, detail="Note not found or no changes")
    except HTTPException:
        raise
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.delete("/note/{note_id}")
async def delete_note_api(note_id: int):
    """노트 삭제"""
    try:
        success = delete_study_note(note_id)
        if success:
            return {"status": "ok", "message": f"Note #{note_id} deleted"}
        raise HTTPException(status_code=404, detail="Note not found")
    except HTTPException:
        raise
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))
