from sqlalchemy.ext.asyncio import AsyncSession
from src.core.database import get_db
from src.core.auth import require_enterprise_or_front
from src.services.usuarios_times import UsuarioTimeService
from src.schemas.usuarios_times import (
    UsuarioTimeCreate,
    UsuarioTimeUpdate,
    UsuarioTimeResponse,
)
from src.core.api_responses import (
    build_success_payload,
    SuccessResponse,
    ErrorResponse,
)
from fastapi import APIRouter, Depends, HTTPException, status

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

service = UsuarioTimeService()


@router.get(
    "/time/{time_id}/usuarios",
    summary="Listar usuários de um time",
    description="Retorna todos os usuários vinculados a um time.",
    status_code=status.HTTP_200_OK,
    response_model=SuccessResponse,
    responses={
        200: {"description": "Usuários listados com sucesso"},
        401: {"description": "Credenciais inválidas", "model": ErrorResponse},
    },
)
async def listar_usuarios_do_time(
    time_id: int,
    db: AsyncSession = Depends(get_db),
    _auth=Depends(require_enterprise_or_front),
) -> SuccessResponse:
    """Listar todos os usuários de um time"""
    vinculos = await service.listar_usuarios_do_time(db, time_id)

    return build_success_payload(
        data=[UsuarioTimeResponse.model_validate(v) for v in vinculos],
        message=f"Total de {len(vinculos)} usuário(s) no time",
    )


@router.get(
    "/usuario/{usuario_id}/times",
    summary="Listar times de um usuário",
    description="Retorna todos os times aos quais o usuário está vinculado.",
    status_code=status.HTTP_200_OK,
    response_model=SuccessResponse,
    responses={
        200: {"description": "Times listados com sucesso"},
        401: {"description": "Credenciais inválidas", "model": ErrorResponse},
    },
)
async def listar_times_do_usuario(
    usuario_id: int,
    db: AsyncSession = Depends(get_db),
    _auth=Depends(require_enterprise_or_front),
) -> SuccessResponse:
    """Listar todos os times de um usuário"""
    vinculos = await service.listar_times_do_usuario(db, usuario_id)

    return build_success_payload(
        data=[UsuarioTimeResponse.model_validate(v) for v in vinculos],
        message=f"Total de {len(vinculos)} time(s) do usuário",
    )
