from __future__ import annotations

from fastapi import APIRouter, Depends, Query, status

from src.core.deps import get_usuarios_perfil_service, require_api_key

from .schemas import (
    PaginatedUsuariosPerfil,
    UsuarioPerfilCreate,
    UsuarioPerfilOut,
    UsuarioPerfilUpdate,
)
from .service import UsuariosPerfilService

router = APIRouter(prefix="/api/v1/usuarios-perfil", tags=["Usuários - Perfis"])


@router.get(
    "",
    summary="Listar perfis de usuário",
    response_model=PaginatedUsuariosPerfil,
    response_model_exclude_none=True,
    responses={
        status.HTTP_200_OK: {
            "description": "Lista paginada de perfis",
            "content": {
                "application/json": {
                    "example": {
                        "items": [
                            {
                                "id": "perfil_admin",
                                "codigo": "ADM",
                                "nome": "Administrador",
                                "createdAt": "2025-01-01T12:00:00.000Z",
                                "updatedAt": "2025-01-01T12:00:00.000Z",
                            }
                        ],
                        "total": 1,
                    }
                }
            },
        }
    },
)
async def list_usuarios_perfil(
    page: int = Query(1, ge=1, description="Página atual (>=1)"),
    limit: int | None = Query(None, ge=1, le=100, description="Itens por página (1-100)"),
    q: str | None = Query(None, description="Busca por código ou nome"),
    sort: str | None = Query(
        None,
        description="Campo para ordenação",
        pattern="^(codigo|nome|\\$createdAt)$",
    ),
    order: str | None = Query(None, pattern="^(asc|desc)$", description="Ordem da ordenação"),
    _: None = Depends(require_api_key),
    service: UsuariosPerfilService = Depends(get_usuarios_perfil_service),
) -> PaginatedUsuariosPerfil:
    return await service.list(page=page, limit=limit, q=q, sort=sort, order=order)


@router.get(
    "/{perfil_id}",
    summary="Detalhar perfil de usuário",
    response_model=UsuarioPerfilOut,
    response_model_exclude_none=True,
    responses={
        status.HTTP_200_OK: {
            "description": "Perfil encontrado",
            "content": {
                "application/json": {
                    "example": {
                        "id": "perfil_admin",
                        "codigo": "ADM",
                        "nome": "Administrador",
                        "createdAt": "2025-01-01T12:00:00.000Z",
                        "updatedAt": "2025-01-01T12:00:00.000Z",
                    }
                }
            },
        },
        status.HTTP_404_NOT_FOUND: {
            "description": "Perfil não encontrado",
            "content": {"application/json": {"example": {"detail": "Perfil de usuário não encontrado."}}},
        },
    },
)
async def get_usuario_perfil(
    perfil_id: str,
    _: None = Depends(require_api_key),
    service: UsuariosPerfilService = Depends(get_usuarios_perfil_service),
) -> UsuarioPerfilOut:
    return await service.get(perfil_id)


@router.post(
    "",
    summary="Criar perfil de usuário",
    status_code=status.HTTP_201_CREATED,
    response_model=UsuarioPerfilOut,
    response_model_exclude_none=True,
    responses={
        status.HTTP_201_CREATED: {
            "description": "Perfil criado",
            "content": {
                "application/json": {
                    "example": {
                        "id": "perfil_vendedor",
                        "codigo": "VEN",
                        "nome": "Vendedor",
                        "createdAt": "2025-02-01T12:00:00.000Z",
                        "updatedAt": "2025-02-01T12:00:00.000Z",
                    }
                }
            },
        }
    },
)
async def create_usuario_perfil(
    body: UsuarioPerfilCreate,
    _: None = Depends(require_api_key),
    service: UsuariosPerfilService = Depends(get_usuarios_perfil_service),
) -> UsuarioPerfilOut:
    return await service.create(body)


@router.put(
    "/{perfil_id}",
    summary="Atualizar perfil de usuário",
    response_model=UsuarioPerfilOut,
    response_model_exclude_none=True,
    responses={
        status.HTTP_200_OK: {
            "description": "Perfil atualizado",
            "content": {
                "application/json": {
                    "example": {
                        "id": "perfil_vendedor",
                        "codigo": "VEN",
                        "nome": "Consultor de Vendas",
                        "createdAt": "2025-02-01T12:00:00.000Z",
                        "updatedAt": "2025-03-01T09:00:00.000Z",
                    }
                }
            },
        },
        status.HTTP_404_NOT_FOUND: {
            "description": "Perfil não encontrado",
            "content": {"application/json": {"example": {"detail": "Perfil de usuário não encontrado."}}},
        },
    },
)
async def update_usuario_perfil(
    perfil_id: str,
    body: UsuarioPerfilUpdate,
    _: None = Depends(require_api_key),
    service: UsuariosPerfilService = Depends(get_usuarios_perfil_service),
) -> UsuarioPerfilOut:
    return await service.update(perfil_id, body)


@router.delete(
    "/{perfil_id}",
    status_code=status.HTTP_204_NO_CONTENT,
    summary="Remover perfil de usuário",
)
async def delete_usuario_perfil(
    perfil_id: str,
    _: None = Depends(require_api_key),
    service: UsuariosPerfilService = Depends(get_usuarios_perfil_service),
) -> None:
    await service.delete(perfil_id)
