from __future__ import annotations

from fastapi import APIRouter, Depends, Query, status

from src.core.deps import get_produtos_venda_service, require_api_key

from .schemas import (
    PaginatedProdutosVenda,
    ProdutoVendaCreateRequest,
    ProdutoVendaOut,
    ProdutoVendaUpdate,
)
from .service import ProdutosVendaService

router = APIRouter(prefix="/api/v1/produtos-venda", tags=["Produtos de Venda"])


@router.get(
    "",
    summary="Listar produtos de venda",
    response_model=PaginatedProdutosVenda,
    response_model_exclude_none=True,
    responses={
        status.HTTP_200_OK: {
            "description": "Lista paginada de produtos de venda",
            "content": {
                "application/json": {
                    "example": {
                        "items": [
                            {
                                "id": "venda_01",
                                "catalogo_id": "produto_catalogo_123",
                                "nome": "Kit Inverno",
                                "preco_venda": 79.9,
                                "preco_final": 89.49,
                                "qtdade_estoque": 144,
                                "observacoes": "Campanha de inverno.",
                                "data_validade": "2025-12-31",
                                "empresa_id": "empresa_001",
                                "createdAt": "2025-01-10T15:00:00.000Z",
                                "updatedAt": "2025-01-10T15:00:00.000Z",
                            }
                        ],
                        "total": 1,
                    }
                }
            },
        }
    },
)
async def list_produtos_venda(
    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 catálogo ou observações"),
    sort: str | None = Query(
        None,
        description="Campo para ordenação",
        pattern="^(catalogo_id|preco_venda|data_validade|\\$createdAt)$",
    ),
    order: str | None = Query(None, pattern="^(asc|desc)$", description="Ordem da ordenação"),
    empresa_id: str | None = Query(
        None,
        description="Filtra os produtos pelo identificador da empresa",
    ),
    empresa_id_alias: str | None = Query(
        None,
        alias="empresaId",
        include_in_schema=False,
    ),
    _: None = Depends(require_api_key),
    service: ProdutosVendaService = Depends(get_produtos_venda_service),
) -> PaginatedProdutosVenda:
    raw_empresa_id = (
        empresa_id if isinstance(empresa_id, str) else empresa_id_alias
        if isinstance(empresa_id_alias, str)
        else None
    )
    normalized_empresa_id = raw_empresa_id.strip() if isinstance(raw_empresa_id, str) else None
    return await service.list(
        page=page,
        limit=limit,
        q=q,
        sort=sort,
        order=order,
        empresa_id=normalized_empresa_id,
    )


@router.get(
    "/{produto_venda_id}",
    summary="Detalhar produto de venda",
    response_model=ProdutoVendaOut,
    response_model_exclude_none=True,
    responses={
        status.HTTP_200_OK: {
            "description": "Produto de venda encontrado",
            "content": {
                "application/json": {
                    "example": {
                        "id": "venda_01",
                        "catalogo_id": "produto_catalogo_123",
                        "nome": "Kit Inverno",
                        "preco_venda": 79.9,
                        "preco_final": 89.49,
                        "qtdade_estoque": 144,
                        "observacoes": "Campanha de inverno.",
                        "data_validade": "2025-12-31",
                        "empresa_id": "empresa_001",
                        "createdAt": "2025-01-10T15:00:00.000Z",
                        "updatedAt": "2025-01-10T15:00:00.000Z",
                    }
                }
            },
        },
        status.HTTP_404_NOT_FOUND: {
            "description": "Produto de venda não encontrado",
            "content": {"application/json": {"example": {"detail": "Produto de venda não encontrado."}}},
        },
    },
)
async def get_produto_venda(
    produto_venda_id: str,
    _: None = Depends(require_api_key),
    service: ProdutosVendaService = Depends(get_produtos_venda_service),
) -> ProdutoVendaOut:
    return await service.get(produto_venda_id)


@router.post(
    "",
    summary="Criar produto de venda",
    status_code=status.HTTP_201_CREATED,
    response_model=ProdutoVendaOut,
    response_model_exclude_none=True,
    responses={
        status.HTTP_201_CREATED: {
            "description": "Produto de venda criado",
            "content": {
                "application/json": {
                    "example": {
                        "id": "venda_02",
                        "catalogo_id": "produto_catalogo_456",
                        "nome": "Kit Verão",
                        "preco_venda": 59.5,
                        "preco_final": 66.64,
                        "qtdade_estoque": 200,
                        "observacoes": None,
                        "data_validade": "2026-01-15",
                        "empresa_id": "empresa_001",
                        "createdAt": "2025-02-01T09:30:00.000Z",
                        "updatedAt": "2025-02-01T09:30:00.000Z",
                    }
                }
            },
        }
    },
)
async def create_produto_venda(
    body: ProdutoVendaCreateRequest,
    _: None = Depends(require_api_key),
    service: ProdutosVendaService = Depends(get_produtos_venda_service),
) -> ProdutoVendaOut:
    return await service.create(body)


@router.put(
    "/{produto_venda_id}",
    summary="Atualizar produto de venda",
    response_model=ProdutoVendaOut,
    response_model_exclude_none=True,
    responses={
        status.HTTP_200_OK: {
            "description": "Produto de venda atualizado",
            "content": {
                "application/json": {
                    "example": {
                        "id": "venda_01",
                        "catalogo_id": "produto_catalogo_123",
                        "nome": "Kit Inverno",
                        "preco_venda": 82.9,
                        "qtdade_estoque": 120,
                        "observacoes": "Preço ajustado após renegociação.",
                        "data_validade": "2025-12-31",
                        "empresa_id": "empresa_001",
                        "createdAt": "2025-01-10T15:00:00.000Z",
                        "updatedAt": "2025-02-10T10:00:00.000Z",
                    }
                }
            },
        },
        status.HTTP_404_NOT_FOUND: {
            "description": "Produto de venda não encontrado",
            "content": {"application/json": {"example": {"detail": "Produto de venda não encontrado."}}},
        },
    },
)
async def update_produto_venda(
    produto_venda_id: str,
    body: ProdutoVendaUpdate,
    _: None = Depends(require_api_key),
    service: ProdutosVendaService = Depends(get_produtos_venda_service),
) -> ProdutoVendaOut:
    return await service.update(produto_venda_id, body)


@router.delete(
    "/{produto_venda_id}",
    status_code=status.HTTP_204_NO_CONTENT,
    summary="Remover produto de venda",
)
async def delete_produto_venda(
    produto_venda_id: str,
    _: None = Depends(require_api_key),
    service: ProdutosVendaService = Depends(get_produtos_venda_service),
) -> None:
    await service.delete(produto_venda_id)
