from __future__ import annotations

from fastapi import APIRouter, Depends, Query, status

from src.core.deps import get_produtos_estoque_service, require_api_key

from .schemas import PaginatedProdutosEstoque, ProdutoEstoqueCreate, ProdutoEstoqueOut, ProdutoEstoqueUpdate
from .service import ProdutosEstoqueService

router = APIRouter(prefix="/api/v1/produtos-estoque", tags=["Produtos Estoque"])


@router.get("", summary="Listar itens de estoque", response_model=PaginatedProdutosEstoque, response_model_exclude_none=True)
async def list_items(
    page: int = Query(1, ge=1),
    limit: int | None = Query(None, ge=1, le=100),
    q: str | None = Query(None, description="Busca por catalogo_id/venda_id"),
    sort: str | None = Query(None, pattern="^(quantidade|\\$createdAt)$"),
    order: str | None = Query(None, pattern="^(asc|desc)$"),
    _: None = Depends(require_api_key),
    service: ProdutosEstoqueService = Depends(get_produtos_estoque_service),
) -> PaginatedProdutosEstoque:
    return await service.list(page=page, limit=limit, q=q, sort=sort, order=order)


@router.get("/{item_id}", summary="Obter item de estoque", response_model=ProdutoEstoqueOut, response_model_exclude_none=True)
async def get_item(
    item_id: str,
    _: None = Depends(require_api_key),
    service: ProdutosEstoqueService = Depends(get_produtos_estoque_service),
) -> ProdutoEstoqueOut:
    return await service.get(item_id)


@router.post("", status_code=status.HTTP_201_CREATED, summary="Criar item de estoque", response_model=ProdutoEstoqueOut, response_model_exclude_none=True)
async def create_item(
    body: ProdutoEstoqueCreate,
    _: None = Depends(require_api_key),
    service: ProdutosEstoqueService = Depends(get_produtos_estoque_service),
) -> ProdutoEstoqueOut:
    return await service.create(body)


@router.patch("/{item_id}", summary="Atualizar item de estoque", response_model=ProdutoEstoqueOut, response_model_exclude_none=True)
async def update_item(
    item_id: str,
    body: ProdutoEstoqueUpdate,
    _: None = Depends(require_api_key),
    service: ProdutosEstoqueService = Depends(get_produtos_estoque_service),
) -> ProdutoEstoqueOut:
    return await service.update(item_id, body)


@router.delete("/{item_id}", status_code=status.HTTP_204_NO_CONTENT, summary="Remover item de estoque")
async def delete_item(
    item_id: str,
    _: None = Depends(require_api_key),
    service: ProdutosEstoqueService = Depends(get_produtos_estoque_service),
) -> None:
    await service.delete(item_id)
