from typing import Any, Dict, List

from fastapi import APIRouter, Depends, HTTPException

from ..auth import require_auth
from ..db import (
    create_board_for_user,
    get_board_by_id,
    get_boards_for_user,
    save_board_by_id,
)
from ..models import BoardMeta, CreateBoardRequest, KanbanBoardPayload

router = APIRouter()


@router.get("/api/boards", response_model=Dict[str, List[BoardMeta]])
def list_boards(current_user: str = Depends(require_auth)) -> Dict[str, Any]:
    boards = get_boards_for_user(current_user)
    return {"boards": boards}


@router.post("/api/boards", response_model=BoardMeta)
def create_board(
    payload: CreateBoardRequest,
    current_user: str = Depends(require_auth),
) -> Dict[str, Any]:
    name = payload.name.strip()
    if not name:
        raise HTTPException(status_code=400, detail="Board name cannot be empty")
    board_id = create_board_for_user(current_user, name)
    if board_id is None:
        raise HTTPException(status_code=404, detail="User not found")
    return {"id": board_id, "name": name}


@router.get("/api/boards/{board_id}")
def get_board(
    board_id: int,
    current_user: str = Depends(require_auth),
) -> Dict[str, Any]:
    board = get_board_by_id(current_user, board_id)
    if board is None:
        raise HTTPException(status_code=404, detail="Board not found")
    return {"board": board}


@router.put("/api/boards/{board_id}")
def update_board(
    board_id: int,
    payload: KanbanBoardPayload,
    current_user: str = Depends(require_auth),
) -> Dict[str, Any]:
    board_dict = payload.board.model_dump()
    if not save_board_by_id(current_user, board_id, board_dict):
        raise HTTPException(status_code=404, detail="Board not found")
    return {"board": board_dict}
