from __future__ import annotations

from fastapi import APIRouter, Depends, Query, status

from typing import TYPE_CHECKING

from src.core.deps import get_pedidos_service, require_api_key
from src.modules.pedidos.schemas import (
    PedidoCreateRequest,
    PedidoOut,
    PedidoStatusUpdate,
    PedidoUpdate,
)

from src.modules.pedidos.service import PedidosService

if TYPE_CHECKING:
    pass

router = APIRouter(prefix="/api/v1/pedidos", tags=["Pedidos"])


@router.get(
    "",
    summary="Listar pedidos",
    description=(
        "Retorna uma lista paginada de pedidos com filtros por status e busca textual. "
        "Inclua o header opcional `x-api-key` quando configurado."
    ),
    response_model=dict,
    responses={
        status.HTTP_200_OK: {
            "description": "Resposta bem-sucedida",
            "content": {
                "application/json": {
                    "example": {
                        "page": 1,
                        "limit": 20,
                        "total": 1,
                        "items": [
                            {
                                "id": "order_1",
                                "status": "pendente",
                                "valor-total": 159.9,
                                "itens": ["item_1", "item_2"],
                                "quantidade": [1, 2],
                                "pagamentos": "payment_1",
                                "carrinhos": "cart_1",
                                "usuarios": "user_1",
                                "faturas": "invoice_1",
                                "createdAt": "2025-09-29T12:00:00.000Z",
                                "updatedAt": "2025-09-29T12:00:00.000Z",
                            }
                        ],
                    }
                }
            },
        },
        status.HTTP_400_BAD_REQUEST: {
            "description": "Parâmetros inválidos",
            "content": {"application/json": {"example": {"detail": "Invalid sort field."}}},
        },
    },
)
async def list_pedidos(
    page: int = Query(1, ge=1),
    limit: int | None = Query(None, ge=1, le=100),
    q: str | None = Query(None, min_length=1),
    usuario_id: str | None = Query(None, min_length=1, alias="usuario_id"),
    sort: str | None = Query(None),
    order: str | None = Query(None, pattern="^(?i)(asc|desc)$"),
    _: None = Depends(require_api_key),
    service: PedidosService = Depends(get_pedidos_service),
) -> dict:
    normalized_order = order.lower() if order else None
    return await service.list(
        page=page,
        limit=limit,
        q=q,
        usuario_id=usuario_id,
        sort=sort,
        order=normalized_order,
    )


@router.get(
    "/{pedido_id}",
    summary="Detalhar pedido",
    description="Busca um pedido pelo identificador, retornando itens, valores e metadados. Header `x-api-key` opcional.",
    response_model=PedidoOut,
    responses={
        status.HTTP_200_OK: {
            "description": "Pedido localizado",
            "content": {
                "application/json": {
                    "example": {
                        "id": "order_1",
                        "status": "aprovado",
                        "valor-total": 200.0,
                        "itens": ["item_1"],
                        "quantidade": [1],
                        "pagamentos": "payment_1",
                        "carrinhos": "cart_1",
                        "usuarios": "user_1",
                        "faturas": "invoice_1",
                        "createdAt": "2025-09-29T12:00:00.000Z",
                        "updatedAt": "2025-09-29T12:05:00.000Z",
                    }
                }
            },
        },
        status.HTTP_404_NOT_FOUND: {
            "description": "Pedido não encontrado",
            "content": {"application/json": {"example": {"detail": "Pedido não encontrado."}}},
        },
    },
)
async def get_pedido(
    pedido_id: str,
    _: None = Depends(require_api_key),
    service: PedidosService = Depends(get_pedidos_service),
) -> PedidoOut:
    return await service.get(pedido_id)


@router.post(
    "",
    summary="Criar pedido",
    description="Cria um novo pedido com status inicial e itens associados. Header `x-api-key` opcional.",
    response_model=PedidoOut,
    status_code=status.HTTP_201_CREATED,
    responses={
        status.HTTP_201_CREATED: {
            "description": "Pedido criado",
            "content": {
                "application/json": {
                    "example": {
                        "id": "order_2",
                        "status": "pendente",
                        "valor-total": 120.5,
                        "itens": ["item_3"],
                        "quantidade": [2],
                        "pagamentos": None,
                        "carrinhos": "cart_1",
                        "usuarios": "user_1",
                        "faturas": "invoice_1",
                        "createdAt": "2025-09-29T12:20:00.000Z",
                        "updatedAt": "2025-09-29T12:20:00.000Z",
                    }
                }
            },
        },
        status.HTTP_400_BAD_REQUEST: {
            "description": "Dados inválidos",
            "content": {"application/json": {"example": {"detail": "Status inválido."}}},
        },
    },
)
async def create_pedido(
    payload: PedidoCreateRequest,
    _: None = Depends(require_api_key),
    service: PedidosService = Depends(get_pedidos_service),
) -> PedidoOut:
    return await service.create(payload)


@router.patch(
    "/{pedido_id}",
    summary="Atualizar pedido",
    description="Atualiza parcialmente um pedido existente. Header `x-api-key` opcional.",
    response_model=PedidoOut,
    responses={
        status.HTTP_200_OK: {
            "description": "Pedido atualizado",
            "content": {
                "application/json": {
                    "example": {
                        "id": "order_1",
                        "status": "entregue",
                        "valor-total": 159.9,
                        "itens": ["item_1", "item_2"],
                        "quantidade": [1, 2],
                        "pagamentos": "payment_1",
                        "carrinhos": "cart_1",
                        "usuarios": "user_1",
                        "faturas": "invoice_1",
                        "createdAt": "2025-09-29T12:00:00.000Z",
                        "updatedAt": "2025-09-29T12:10:00.000Z",
                    }
                }
            },
        },
        status.HTTP_404_NOT_FOUND: {
            "description": "Pedido não encontrado",
            "content": {"application/json": {"example": {"detail": "Pedido não encontrado."}}},
        },
    },
)
async def update_pedido(
    pedido_id: str,
    payload: PedidoUpdate,
    _: None = Depends(require_api_key),
    service: PedidosService = Depends(get_pedidos_service),
) -> PedidoOut:
    return await service.update(pedido_id, payload)


@router.patch(
    "/{pedido_id}/status",
    summary="Atualizar status do pedido",
    description="Atualiza apenas o status do pedido. Header `x-api-key` opcional.",
    response_model=PedidoOut,
    responses={
        status.HTTP_200_OK: {
            "description": "Status atualizado",
            "content": {
                "application/json": {
                    "example": {
                        "id": "order_1",
                        "status": "aprovado",
                        "valor-total": 159.9,
                        "itens": ["item_1", "item_2"],
                        "quantidade": [1, 2],
                        "pagamentos": "payment_1",
                        "carrinhos": "cart_1",
                        "usuarios": "user_1",
                        "faturas": "invoice_1",
                        "createdAt": "2025-09-29T12:00:00.000Z",
                        "updatedAt": "2025-09-29T12:15:00.000Z",
                    }
                }
            },
        },
        status.HTTP_400_BAD_REQUEST: {
            "description": "Status inválido",
            "content": {"application/json": {"example": {"detail": "Status inválido."}}},
        },
        status.HTTP_404_NOT_FOUND: {
            "description": "Pedido não encontrado",
            "content": {"application/json": {"example": {"detail": "Pedido não encontrado."}}},
        },
    },
)
async def update_pedido_status(
    pedido_id: str,
    payload: PedidoStatusUpdate,
    _: None = Depends(require_api_key),
    service: PedidosService = Depends(get_pedidos_service),
) -> PedidoOut:
    return await service.update_status(pedido_id, payload)


@router.delete(
    "/{pedido_id}",
    summary="Remover pedido",
    description="Remove um pedido existente. Header `x-api-key` opcional.",
    status_code=status.HTTP_204_NO_CONTENT,
    responses={
        status.HTTP_204_NO_CONTENT: {"description": "Pedido removido"},
        status.HTTP_404_NOT_FOUND: {
            "description": "Pedido não encontrado",
            "content": {"application/json": {"example": {"detail": "Pedido não encontrado."}}},
        },
    },
)
async def delete_pedido(
    pedido_id: str,
    _: None = Depends(require_api_key),
    service: PedidosService = Depends(get_pedidos_service),
) -> None:
    await service.delete(pedido_id)
