import uuid

from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession

from app.core.dependencies import GESTIONNAIRE_PLUS, get_current_user, require_role
from app.core.responses import api_response, normalize_page_param, page_response
from app.db.database import get_async_session
from app.schemas.poste import PosteCreate, PosteStatutUpdate
from app.services.poste_service import PosteService

router = APIRouter(prefix="/postes", tags=["Postes"])


@router.post("/", status_code=201)
async def creer_poste(
    body: PosteCreate,
    db: AsyncSession = Depends(get_async_session),
    current_user=Depends(get_current_user),
):
    service = PosteService(db)
    data = await service.creer(body, current_user)
    return api_response(data, message="Poste créé", status_code=201)


@router.get("/")
async def list_postes(
    page: int = 0,
    size: int = 20,
    db: AsyncSession = Depends(get_async_session),
    _current_user=Depends(get_current_user),
):
    resolved_page = normalize_page_param(page)
    service = PosteService(db)
    items, total = await service.list_postes(page=resolved_page, size=size)
    return page_response(items, total=total, page=resolved_page, size=size)


@router.get("/approuves")
async def list_postes_approuves(
    page: int = 0,
    size: int = 20,
    sortBy: str = "recommendation",
    db: AsyncSession = Depends(get_async_session),
    _current_user=Depends(get_current_user),
):
    resolved_page = normalize_page_param(page)
    service = PosteService(db)
    items, total = await service.list_postes_approuves(page=resolved_page, size=size, sort_by=sortBy)
    return page_response(items, total=total, page=resolved_page, size=size)


@router.get("/me")
async def list_mes_postes(
    page: int = 0,
    size: int = 20,
    db: AsyncSession = Depends(get_async_session),
    current_user=Depends(get_current_user),
):
    resolved_page = normalize_page_param(page)
    service = PosteService(db)
    items, total = await service.list_mes_postes(auteur_id=current_user.id, page=resolved_page, size=size)
    return page_response(items, total=total, page=resolved_page, size=size)


@router.get("/{poste_id}")
async def get_poste(
    poste_id: uuid.UUID,
    db: AsyncSession = Depends(get_async_session),
    _current_user=Depends(get_current_user),
):
    service = PosteService(db)
    data = await service.get_by_id(str(poste_id))
    return api_response(data, message="Poste récupéré")


@router.put("/{poste_id}/epingle")
async def epingler_poste(
    poste_id: uuid.UUID,
    db: AsyncSession = Depends(get_async_session),
    _current_user=Depends(require_role(*GESTIONNAIRE_PLUS)),
):
    service = PosteService(db)
    data = await service.epingler(str(poste_id))
    return api_response(data, message="Poste épinglé")


@router.delete("/{poste_id}/epingle")
async def desepingler_poste(
    poste_id: uuid.UUID,
    db: AsyncSession = Depends(get_async_session),
    _current_user=Depends(require_role(*GESTIONNAIRE_PLUS)),
):
    service = PosteService(db)
    data = await service.desepingler(str(poste_id))
    return api_response(data, message="Poste désépinglé")


@router.delete("/{poste_id}", status_code=204)
async def supprimer_poste(
    poste_id: uuid.UUID,
    db: AsyncSession = Depends(get_async_session),
    current_user=Depends(get_current_user),
):
    service = PosteService(db)
    await service.supprimer(str(poste_id), current_user)


@router.patch("/{poste_id}/statut")
async def update_poste_statut(
    poste_id: uuid.UUID,
    body: PosteStatutUpdate,
    db: AsyncSession = Depends(get_async_session),
    current_user=Depends(require_role(*GESTIONNAIRE_PLUS)),
):
    service = PosteService(db)
    data = await service.update_statut(str(poste_id), body.statut, current_user)
    return api_response(data, message="Statut du poste mis a jour")
