from ninja import Router from typing import Optional from django.http import HttpRequest from .search_service import ( buscar_diarios, sugestao_termo, buscar_diarios_simples, ) from .schemas import BuscaDiariosResponseSchema, SugestaoResponse from django.shortcuts import render router = Router(tags=["Diários Oficiais"]) async def index(request): return render(request, 'diarios/busca.html') @router.get( "/sugestao", response=SugestaoResponse, summary="Sugestão de correção para termo de busca", ) async def sugestao_busca(request: HttpRequest, q: str) -> SugestaoResponse: """ Sugere correção para o termo buscado, se necessário. Args: request (HttpRequest): Requisição HTTP. q (str): Termo original digitado pelo usuário. Returns: SugestaoResponse: Termo corrigido. """ sugestao = await sugestao_termo(q) return {"sugestao": sugestao} @router.get( "/busca", response=BuscaDiariosResponseSchema, summary="Busca simplificada com modos e ordenação", ) async def busca_diarios_oficiais_simples( request: HttpRequest, q: Optional[str] = None, numero_diario: Optional[str] = None, data_inicio: Optional[str] = None, data_fim: Optional[str] = None, tipo: Optional[str] = None, ordenar_por: str = "relevancia", # "relevancia", "data_asc", "data_desc" modo_busca: str = "exata", # "exata" ou "qualquer" page: int = 1, page_size: int = 10, ) -> BuscaDiariosResponseSchema: """ Busca com modo de correspondência, ordenação e número do diário. Args: request (HttpRequest): Requisição HTTP. q (Optional[str]): Termo de busca. numero_diario (Optional[str]): Número exato do diário (ex: 1234/2024). data_inicio (Optional[str]): Data inicial (YYYY-MM-DD). data_fim (Optional[str]): Data final (YYYY-MM-DD). tipo (Optional[str]): Tipo exato do diário. ordenar_por (str): "relevancia", "data_asc" ou "data_desc". modo_busca (str): "exata" ou "qualquer". page (int): Página atual (mínimo: 1). page_size (int): Itens por página (mínimo: 1, máximo: 50). Returns: BuscaDiariosResponseSchema: Resultado paginado da busca. """ page_size = min(max(page_size, 1), 50) page = max(page, 1) resultado = await buscar_diarios_simples( query=q, numero_diario=numero_diario, data_inicio=data_inicio, data_fim=data_fim, tipo_diario=tipo, ordenar_por=ordenar_por, modo_busca=modo_busca, page=page, page_size=page_size, ) return resultado