"""Rotas FastAPI para manipular a coleção `empresas-dados` do Appwrite."""

from __future__ import annotations

from fastapi import APIRouter, Depends, Query, status

from src.core.deps import get_empresas_dados_service, require_api_key

from .schemas import (
    EmpresasDadosCreate,
    EmpresasDadosCreateEnvelope,
    EmpresasDadosOut,
    EmpresasDadosUpdate,
    PaginatedEmpresasDados,
)
from .service import EmpresasDadosService

router = APIRouter(
    prefix="/appwrite/empresas-dados",
    tags=["Empresas Dados"],
)


@router.get(
    "",
    summary="Listar empresas (dados da Receita)",
    description=(
        "Lista os documentos da coleção 'empresas-dados' com suporte a paginação, "
        "busca textual, filtros por CNPJ e endereço relacionado."
    ),
    response_model=PaginatedEmpresasDados,
    response_model_exclude_none=True,
    response_model_by_alias=False,
)
async def list_empresas_dados(
    page: int = Query(1, ge=1, description="Página solicitada (>=1)."),
    limit: int | None = Query(None, ge=1, le=100, description="Tamanho da página (1-100)."),
    q: str | None = Query(None, description="Termo de busca aplicado a CNPJ, nome ou natureza."),
    sort: str | None = Query(
        None,
        pattern=r"^(cnpj|razaoSocial|nomeFantasia|naturezaJuridica|porte|situacao|\$createdAt)$",
        description="Campo de ordenação permitido.",
    ),
    order: str | None = Query(
        None,
        pattern=r"^(asc|desc)$",
        description="Direção da ordenação (asc/desc).",
    ),
    cnpj: str | None = Query(
        None,
        description="Filtrar resultados por CNPJ exato (com ou sem máscara).",
    ),
    endereco_id: str | None = Query(
        None,
        description="Filtrar registros associados a um endereço específico.",
    ),
    _: None = Depends(require_api_key),
    service: EmpresasDadosService = Depends(get_empresas_dados_service),
) -> PaginatedEmpresasDados:
    return await service.list(
        page=page,
        limit=limit,
        q=q,
        sort=sort,
        order=order,
        cnpj=cnpj,
        endereco_id=endereco_id,
    )


@router.get(
    "/{empresa_dados_id}",
    summary="Obter empresa (dados Receita)",
    description="Recupera um documento específico da coleção 'empresas-dados' pelo ID.",
    response_model=EmpresasDadosOut,
    response_model_exclude_none=True,
    response_model_by_alias=False,
)
async def get_empresas_dados(
    empresa_dados_id: str,
    _: None = Depends(require_api_key),
    service: EmpresasDadosService = Depends(get_empresas_dados_service),
) -> EmpresasDadosOut:
    return await service.get(empresa_dados_id)


@router.post(
    "",
    summary="Criar empresa (dados Receita)",
    description="Cria um novo documento na coleção 'empresas-dados'.",
    status_code=status.HTTP_201_CREATED,
    response_model=EmpresasDadosOut,
    response_model_exclude_none=True,
    response_model_by_alias=False,
)
async def create_empresas_dados(
    payload: EmpresasDadosCreate | EmpresasDadosCreateEnvelope,
    _: None = Depends(require_api_key),
    service: EmpresasDadosService = Depends(get_empresas_dados_service),
) -> EmpresasDadosOut:
    if isinstance(payload, EmpresasDadosCreateEnvelope):
        document_id = payload.documentId or "unique()"
        data = payload.data
    else:
        document_id = "unique()"
        data = payload

    return await service.create(data, document_id=document_id)


@router.patch(
    "/{empresa_dados_id}",
    summary="Atualizar empresa (dados Receita)",
    description="Atualiza parcialmente um documento existente em 'empresas-dados'.",
    response_model=EmpresasDadosOut,
    response_model_exclude_none=True,
    response_model_by_alias=False,
)
async def update_empresas_dados(
    empresa_dados_id: str,
    payload: EmpresasDadosUpdate,
    _: None = Depends(require_api_key),
    service: EmpresasDadosService = Depends(get_empresas_dados_service),
) -> EmpresasDadosOut:
    return await service.update(empresa_dados_id, payload)


@router.delete(
    "/{empresa_dados_id}",
    summary="Remover empresa (dados Receita)",
    description="Exclui um documento da coleção 'empresas-dados'.",
    status_code=status.HTTP_204_NO_CONTENT,
)
async def delete_empresas_dados(
    empresa_dados_id: str,
    _: None = Depends(require_api_key),
    service: EmpresasDadosService = Depends(get_empresas_dados_service),
) -> None:
    await service.delete(empresa_dados_id)
