from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session

from custos_precificacao import auth
from custos_precificacao.api.deps import get_session
from custos_precificacao.api.schemas import AtividadeFiltrosOut, AtividadeItemOut, AtividadePaginaOut
from custos_precificacao.models import RegistroAtividade

router = APIRouter(prefix="/atividade", tags=["atividade"], dependencies=[Depends(auth.exigir_admin)])

LIMITE_PADRAO = 200
LIMITE_MAXIMO = 500


@router.get("", response_model=AtividadePaginaOut)
def listar(
    usuario: str | None = None,
    recurso: str | None = None,
    antes: int | None = None,
    limite: int = LIMITE_PADRAO,
    session: Session = Depends(get_session),
) -> AtividadePaginaOut:
    """Escritas feitas pela API, da mais recente para a mais antiga; `antes` = id do último item da página anterior."""
    limite = max(1, min(limite, LIMITE_MAXIMO))
    consulta = session.query(RegistroAtividade)
    if usuario:
        consulta = consulta.filter(RegistroAtividade.usuario == usuario)
    if recurso:
        consulta = consulta.filter(RegistroAtividade.recurso == recurso)
    if antes is not None:
        consulta = consulta.filter(RegistroAtividade.id < antes)
    linhas = consulta.order_by(RegistroAtividade.id.desc()).limit(limite + 1).all()
    nome = auth.NomesDeAutores(session)
    itens = [
        AtividadeItemOut(
            id=r.id, quando=r.quando, usuario=r.usuario, usuario_nome=nome(r.usuario),
            metodo=r.metodo, acao=r.acao, recurso=r.recurso, caminho=r.caminho,
        )
        for r in linhas[:limite]
    ]
    return AtividadePaginaOut(itens=itens, proximo=itens[-1].id if len(linhas) > limite else None)


@router.get("/filtros", response_model=AtividadeFiltrosOut)
def filtros(session: Session = Depends(get_session)) -> AtividadeFiltrosOut:
    nome = auth.NomesDeAutores(session)
    usuarios = sorted(u for (u,) in session.query(RegistroAtividade.usuario).distinct())
    recursos = sorted(r for (r,) in session.query(RegistroAtividade.recurso).distinct())
    return AtividadeFiltrosOut(usuarios=[{"valor": u, "nome": nome(u) or u} for u in usuarios], recursos=recursos)
