"""
Notes API router.
"""
from typing import Dict, Any
from fastapi import APIRouter, Depends, Path, Query
from sqlalchemy.orm import Session

from src.core.database import get_db
from src.apps.auth.utils.auth import get_current_user
from src.apps.users.schemas.user_common import UserSchema

from src.apps.notes.schemas.common import NoteCreateRequestSchema, NoteUpdateRequestSchema
from src.apps.notes import services as note_services

router = APIRouter()


@router.post("/notes", response_model=Dict[str, Any])
async def create_note(
    payload: NoteCreateRequestSchema,
    db: Session = Depends(get_db),
    current_user: UserSchema = Depends(get_current_user),
) -> Dict[str, Any]:
    """Create a standalone note (not linked to product)."""
    note = await note_services.create_note(db=db, payload=payload, created_by_id=current_user.id)
    return {"data": note, "message": "Note created successfully"}


@router.get("/notes/{note_id}", response_model=Dict[str, Any])
async def get_note(
    note_id: int = Path(..., description="Note ID"),
    db: Session = Depends(get_db),
) -> Dict[str, Any]:
    note = await note_services.get_note_by_id(db=db, note_id=note_id)
    return {"data": note, "message": "Note fetched successfully"}


@router.get("/notes", response_model=Dict[str, Any])
async def list_notes(
    skip: int = Query(0, ge=0, description="Records to skip"),
    limit: int = Query(20, ge=1, le=100, description="Max records to return"),
    db: Session = Depends(get_db),
) -> Dict[str, Any]:
    notes = await note_services.list_notes(db=db, skip=skip, limit=limit)
    return {"data": notes, "message": "Notes fetched successfully"}


@router.put("/notes/{note_id}", response_model=Dict[str, Any])
async def update_note(
    note_id: int = Path(..., description="Note ID"),
    payload: NoteUpdateRequestSchema = None,
    db: Session = Depends(get_db),
) -> Dict[str, Any]:
    note = await note_services.update_note_by_id(db=db, object_id=note_id, payload=payload)
    return {"data": note, "message": "Note updated successfully"}


@router.delete("/notes/{note_id}", response_model=Dict[str, Any])
async def delete_note(
    note_id: int = Path(..., description="Note ID"),
    db: Session = Depends(get_db),
) -> Dict[str, Any]:
    deleted = await note_services.delete_note_by_id(db=db, note_id=note_id)
    return {"data": {"deleted": deleted}, "message": "Note deleted successfully"}
