from fastapi import APIRouter, Depends
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession

from app.core.dependencies import ADMIN_ONLY, require_role
from app.core.responses import api_response
from app.db.database import get_async_session
from app.models.role import Role

router = APIRouter(prefix="/roles", tags=["Rôles"])


@router.get("/")
async def list_roles(
    db: AsyncSession = Depends(get_async_session),
    _admin=Depends(require_role(*ADMIN_ONLY)),
):
    rows = (await db.execute(select(Role).order_by(Role.nom))).scalars().all()
    data = [
        {
            "id": str(r.id),
            "nom": r.nom,
            "description": r.description,
            "permissions": r.permissions or [],
        }
        for r in rows
    ]
    return api_response(data, message="Rôles récupérés")


@router.get("/{nom}/permissions")
async def get_permissions(
    nom: str,
    db: AsyncSession = Depends(get_async_session),
    _admin=Depends(require_role(*ADMIN_ONLY)),
):
    role = (
        await db.execute(select(Role).where(Role.nom == nom.upper()))
    ).scalar_one_or_none()
    if role is None:
        from fastapi import HTTPException
        raise HTTPException(404, detail="Rôle introuvable")
    return api_response(
        {"role": role.nom, "permissions": role.permissions or []},
        message="Permissions récupérées",
    )
