import httpx from app.utils.sanitizers import sanitize_cep class GeocodingService: @staticmethod def get_location_by_cep(cep_str: str) -> dict: clean_cep = sanitize_cep(cep_str) if len(clean_cep) != 8: return {'error': 'CEP inválido. Deve conter exatamente 8 dígitos.'} url = f"https://viacep.com.br/ws/{clean_cep}/json/" try: with httpx.Client(timeout=8.0) as client: response = client.get(url) if response.status_code != 200: return {'error': f'Falha ao consultar API ViaCEP (HTTP {response.status_code}).'} data = response.json() if data.get('erro') is True or data.get('erro') == 'true': return {'error': 'CEP não encontrado na base do ViaCEP.'} return { 'cep': clean_cep, 'logradouro': data.get('logradouro', ''), 'bairro': data.get('bairro', ''), 'cidade': data.get('localidade', ''), 'uf': data.get('uf', ''), 'ibge': data.get('ibge', ''), 'formatted_cep': f"{clean_cep[:5]}-{clean_cep[5:]}" } except Exception as e: return {'error': f'Erro na comunicação com serviço de CEP: {str(e)}'} @staticmethod def build_search_query(ramo: str, location_info: dict) -> str: bairro = location_info.get('bairro', '').strip() cidade = location_info.get('cidade', '').strip() uf = location_info.get('uf', '').strip() if bairro: return f"{ramo.strip()} em {bairro}, {cidade} - {uf}" elif cidade and uf: return f"{ramo.strip()} em {cidade} - {uf}" return ramo.strip()