from typing import Optional
from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession
from src.services.usuarios import UsuarioService
from src.core.auth import require_enterprise_or_front
from fastapi import APIRouter, Depends, HTTPException, Query, status
from src.schemas.usuarios import UsuarioCreate, UsuarioUpdate, UsuarioResponse
from src.core.database import get_db
from src.core.api_responses import (
    build_success_payload,
    SuccessResponse,
    ErrorResponse,
)

router = APIRouter(
    prefix="/usuarios",
    tags=["Usuarios"],
)

usuario_service = UsuarioService()


@router.get(
    "/{usuario_id}",
    summary="Obter usuário por ID",
    description="Recupera os detalhes de um usuário específico.",
    status_code=status.HTTP_200_OK,
    response_model=SuccessResponse,
    responses={
        200: {"description": "Usuário encontrado"},
        404: {"description": "Usuário não encontrado", "model": ErrorResponse},
        401: {
            "description": "Credenciais inválidas ou ausentes",
            "model": ErrorResponse,
        },
    },
)
async def obter_usuario(
    usuario_id: int,
    db: AsyncSession = Depends(get_db),
    enterprise_id: str = Depends(require_enterprise_or_front),
) -> SuccessResponse:
    """Obter usuário por ID."""
    usuario = await usuario_service.get_usuario(db, usuario_id)
    if not usuario:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="Usuário não encontrado",
        )
    return build_success_payload(
        data=UsuarioResponse.model_validate(usuario),
        message="Usuário encontrado",
    )


@router.get(
    "",
    summary="Listar usuários",
    description="Lista todos os usuários com filtros opcionais.",
    status_code=status.HTTP_200_OK,
    response_model=SuccessResponse,
    responses={
        200: {"description": "Usuários listados com sucesso"},
        401: {
            "description": "Credenciais inválidas ou ausentes",
            "model": ErrorResponse,
        },
    },
)
async def listar_usuarios(
    ativo: Optional[bool] = Query(
        None, description="Filtrar por status ativo"
    ),
    nome: Optional[str] = Query(
        None, description="Filtrar por nome"
    ),
    db: AsyncSession = Depends(get_db),
    enterprise_id: str = Depends(require_enterprise_or_front),
) -> SuccessResponse:
    """Listar todos os usuários."""
    usuarios = await usuario_service.list_usuarios(db, ativo=ativo, nome=nome)
    return build_success_payload(
        data=[UsuarioResponse.model_validate(u) for u in usuarios],
        message=f"Total de {len(usuarios)} usuário(s) encontrado(s)",
    )
