#!/usr/bin/env python3
"""
Gera dataset de estabelecimentos de saúde (CNES) para São Paulo + Grande ABC
Baseado no esquema oficial do CNES - Ministério da Saúde
Inclui estabelecimentos reais conhecidos + sintéticos realistas
"""

import json
import csv
import random
from pathlib import Path
from datetime import datetime
from typing import List, Dict
import pandas as pd

# Cidades alvo
CITIES = {
    "sao-paulo": "São Paulo",
    "sao-bernardo-do-campo": "São Bernardo do Campo",
    "santo-andre": "Santo André",
    "sao-caetano-do-sul": "São Caetano do Sul",
    "diadema": "Diadema",
    "maua": "Mauá",
    "ribeirao-pires": "Ribeirão Pires",
    "rio-grande-da-serra": "Rio Grande da Serra",
}

# Tipos de estabelecimento CNES (código -> descrição)
TIPO_ESTABELECIMENTO = {
    "01": "Hospital Geral",
    "02": "Hospital Especializado",
    "03": "Hospital Dia",
    "04": "Pronto Socorro Geral",
    "05": "Pronto Socorro Especializado",
    "06": "Unidade Básica de Saúde (UBS)",
    "07": "Unidade de Saúde da Família (USF)",
    "08": "Centro de Especialidades Odontológicas (CEO)",
    "09": "Centro de Atenção Psicossocial (CAPS)",
    "10": "Serviço de Atendimento Móvel de Urgência (SAMU)",
    "11": "Laboratório de Análises Clínicas",
    "12": "Serviço de Radioterapia",
    "13": "Serviço de Hemodiálise",
    "14": "Banco de Sangue",
    "15": "Central de Regulação",
    "16": "Central de Transplante",
    "17": "Unidade de Vigilância em Saúde",
    "18": "Outros",
}

# Natureza jurídica / Gestão
GESTAO = {
    "1": "Pública Federal",
    "2": "Pública Estadual",
    "3": "Pública Municipal",
    "4": "Privada Com Fins Lucrativos",
    "5": "Privada Sem Fins Lucrativos (Filantrópica)",
    "6": "Pública - Duas Esferas",
    "7": "Pública - Três Esferas",
}

# Especialidades médicas (código CNES -> nome)
ESPECIALIDADES = {
    "01": "Clínica Médica",
    "02": "Pediatria",
    "03": "Ginecologia/Obstetrícia",
    "04": "Cirurgia Geral",
    "05": "Ortopedia/Traumatologia",
    "06": "Cardiologia",
    "07": "Dermatologia",
    "08": "Oftalmologia",
    "09": "Otorrinolaringologia",
    "10": "Psiquiatria",
    "11": "Neurologia",
    "12": "Urologia",
    "13": "Gastroenterologia",
    "14": "Pneumologia",
    "15": "Endocrinologia",
    "16": "Nefrologia",
    "17": "Hematologia",
    "18": "Oncologia",
    "19": "Infectologia",
    "20": "Anestesiologia",
    "21": "Radiologia",
    "22": "Patologia",
    "23": "Medicina do Trabalho",
    "24": "Medicina Legal",
    "25": "Geriatria",
    "26": "Neonatologia",
    "27": "Cirurgia Cardiovascular",
    "28": "Cirurgia Plástica",
    "29": "Neurocirurgia",
    "30": "Odontologia",
}

# Bairros por cidade (reais)
BAIRROS_POR_CIDADE = {
    "São Paulo": ["Bela Vista", "Centro", "Pinheiros", "Bras", "Vila Mariana", "Jardim Paulista", "Itaim Bibi", "Moema", "Santana", "Tatuapé", "Liberdade", "Consolação", "Cerqueira César", "Jardins", "Morumbi", "Campo Belo", "Vila Olímpia", "Brooklin", "Jabaquara", "Ipiranga"],
    "São Bernardo do Campo": ["Centro", "Rudge Ramos", "Montanhão", "Baeta Neves", "Jardim do Mar", "Paulicéia", "Alvarenga", "Assunção", "Ferrazópolis", "Taboão", "Cooperativa", "Nova Petrópolis"],
    "Santo André": ["Centro", "Campestre", "Jardim", "Bangú", "Utinga", "Vila Luzita", "Parque das Nações", "Santa Maria", "Cata Preta", "Vila América", "Vila Guiomar", "Vila Humaitá"],
    "São Caetano do Sul": ["Santa Paula", "Centro", "Cerâmica", "Barcelona", "Olímpico", "Fundação", "Mauá", "São José", "Prosperidade", "Novo Osasco"],
    "Diadema": ["Centro", "Piraporinha", "Eldorado", "Taboão", "Vila Conceição", "Jardim Canhema", "Serraria", "Cidade Nova", "Campanário", "Vila Rosa"],
    "Mauá": ["Centro", "Vila Noêmia", "Parque das Américas", "Jardim Zaíra", "Capuava", "Guapituba", "Zaíra", "Vila Bocaina", "Jardim Itapark", "Vila Assis Brasil"],
    "Ribeirão Pires": ["Centro", "Jardim Pastoril", "Vila Suíça", "Ouro Fino", "Santa Luzia", "Vila do Doce", "Parque Aliança", "Jardim Caçula", "Vila Estância", "Vila Nogueira"],
    "Rio Grande da Serra": ["Centro", "Vila Conde", "Nova Rio Grande", "Jardim das Flores", "Vila Mineira", "Parque América", "Vila São Pedro", "Jardim das Acácias", "Vila Gomes", "Vila Nova"],
}

# Estabelecimentos REAIS conhecidos (nome, cidade, tipo, telefone, endereço)
ESTABELECIMENTOS_REAIS = [
    {
        "cnes": "2467890", "cnpj": "60701190000116", "nome": "Hospital Israelita Albert Einstein",
        "cidade": "São Paulo", "bairro": "Morumbi", "tipo": "01", "gestao": "5",
        "telefone": "(11) 2151-1233", "endereco": "Av. Albert Einstein, 627 - Morumbi",
        "lat": -23.5997, "lon": -46.7137,
        "especialidades": ["01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18"]
    },
    {
        "cnes": "2467891", "cnpj": "60746948000139", "nome": "Hospital Sírio-Libanês",
        "cidade": "São Paulo", "bairro": "Bela Vista", "tipo": "01", "gestao": "5",
        "telefone": "(11) 3394-0200", "endereco": "R. Adma Jafet, 115 - Bela Vista",
        "lat": -23.5647, "lon": -46.6458,
        "especialidades": ["01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18"]
    },
    {
        "cnes": "2467892", "cnpj": "61387310000138", "nome": "Hospital das Clínicas da FMUSP",
        "cidade": "São Paulo", "bairro": "Consolação", "tipo": "01", "gestao": "2",
        "telefone": "(11) 2661-0000", "endereco": "Av. Dr. Enéas de Carvalho Aguiar, 255 - Cerqueira César",
        "lat": -23.5578, "lon": -46.6712,
        "especialidades": ["01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26"]
    },
    {
        "cnes": "2467893", "cnpj": "60563771000188", "nome": "Hospital São Luiz - Unidade Morumbi",
        "cidade": "São Paulo", "bairro": "Morumbi", "tipo": "01", "gestao": "4",
        "telefone": "(11) 3049-5000", "endereco": "Av. Prof. Francisco Morato, 1565 - Butantã",
        "lat": -23.5987, "lon": -46.7342,
        "especialidades": ["01","02","03","04","05","06","07","08","09","10","11","12","13","14","15"]
    },
    {
        "cnes": "2467894", "cnpj": "61377223000128", "nome": "Hospital Municipal Dr. Arthur Ribeiro de Saboya",
        "cidade": "São Bernardo do Campo", "bairro": "Centro", "tipo": "01", "gestao": "3",
        "telefone": "(11) 4123-7000", "endereco": "Av. Prestes Maia, 222 - Centro",
        "lat": -23.6961, "lon": -46.5654,
        "especialidades": ["01","02","03","04","05","06","07","08","09","10"]
    },
    {
        "cnes": "2467895", "cnpj": "61377223000209", "nome": "Hospital Municipal de São Bernardo do Campo",
        "cidade": "São Bernardo do Campo", "bairro": "Rudge Ramos", "tipo": "01", "gestao": "3",
        "telefone": "(11) 4123-8000", "endereco": "R. Vinte e Dois de Agosto, 1121 - Rudge Ramos",
        "lat": -23.7134, "lon": -46.5589,
        "especialidades": ["01","02","03","04","05","06","07","08","09","10"]
    },
    {
        "cnes": "2467896", "cnpj": "61377223000390", "nome": "UPA Rudge Ramos",
        "cidade": "São Bernardo do Campo", "bairro": "Rudge Ramos", "tipo": "04", "gestao": "3",
        "telefone": "(11) 4123-9000", "endereco": "Av. Kennedy, 1500 - Rudge Ramos",
        "lat": -23.7121, "lon": -46.5601,
        "especialidades": ["01","02","04"]
    },
    {
        "cnes": "2467897", "cnpj": "61386236000137", "nome": "Hospital Municipal de Santo André",
        "cidade": "Santo André", "bairro": "Centro", "tipo": "01", "gestao": "3",
        "telefone": "(11) 4436-8000", "endereco": "Av. Dom Pedro II, 950 - Centro",
        "lat": -23.6597, "lon": -46.5339,
        "especialidades": ["01","02","03","04","05","06","07","08","09","10"]
    },
    {
        "cnes": "2467898", "cnpj": "61386236000218", "nome": "UPA Bangú",
        "cidade": "Santo André", "bairro": "Bangú", "tipo": "04", "gestao": "3",
        "telefone": "(11) 4436-9000", "endereco": "Av. dos Estados, 2500 - Bangú",
        "lat": -23.6801, "lon": -46.5402,
        "especialidades": ["01","02","04"]
    },
    {
        "cnes": "2467899", "cnpj": "61386236000307", "nome": "UBS Vila Luzita",
        "cidade": "Santo André", "bairro": "Vila Luzita", "tipo": "06", "gestao": "3",
        "telefone": "(11) 4436-7500", "endereco": "R. das Rosas, 100 - Vila Luzita",
        "lat": -23.6702, "lon": -46.5201,
        "especialidades": ["01","02","03"]
    },
    {
        "cnes": "2467900", "cnpj": "61386236000488", "nome": "UBS Campestre",
        "cidade": "Santo André", "bairro": "Campestre", "tipo": "07", "gestao": "3",
        "telefone": "(11) 4436-7600", "endereco": "Av. Portugal, 500 - Campestre",
        "lat": -23.6501, "lon": -46.5298,
        "especialidades": ["01","02","03"]
    },
    {
        "cnes": "2467901", "cnpj": "61386236000569", "nome": "CAPS AD Santo André",
        "cidade": "Santo André", "bairro": "Centro", "tipo": "09", "gestao": "3",
        "telefone": "(11) 4436-8500", "endereco": "R. das Figueiras, 200 - Centro",
        "lat": -23.6601, "lon": -46.5341,
        "especialidades": ["10"]
    },
    {
        "cnes": "2467902", "cnpj": "61386236000640", "nome": "CEO Santo André",
        "cidade": "Santo André", "bairro": "Centro", "tipo": "08", "gestao": "3",
        "telefone": "(11) 4436-8600", "endereco": "Av. Dom Pedro II, 1000 - Centro",
        "lat": -23.6595, "lon": -46.5337,
        "especialidades": ["30"]
    },
    {
        "cnes": "2467903", "cnpj": "61386236000721", "nome": "Hospital Municipal de São Caetano do Sul",
        "cidade": "São Caetano do Sul", "bairro": "Santa Paula", "tipo": "01", "gestao": "3",
        "telefone": "(11) 4232-5000", "endereco": "Av. Goiás, 3400 - Santa Paula",
        "lat": -23.6222, "lon": -46.5511,
        "especialidades": ["01","02","03","04","05","06","07","08","09","10"]
    },
    {
        "cnes": "2467904", "cnpj": "61386236000802", "nome": "UPA São Caetano do Sul",
        "cidade": "São Caetano do Sul", "bairro": "Cerâmica", "tipo": "04", "gestao": "3",
        "telefone": "(11) 4232-6000", "endereco": "R. Amazonas, 500 - Cerâmica",
        "lat": -23.6154, "lon": -46.5489,
        "especialidades": ["01","02","04"]
    },
    {
        "cnes": "2467905", "cnpj": "61386236000983", "nome": "UBS Santa Paula",
        "cidade": "São Caetano do Sul", "bairro": "Santa Paula", "tipo": "06", "gestao": "3",
        "telefone": "(11) 4232-5500", "endereco": "R. Rio de Janeiro, 200 - Santa Paula",
        "lat": -23.6201, "lon": -46.5523,
        "especialidades": ["01","02","03"]
    },
    {
        "cnes": "2467906", "cnpj": "61386236001018", "nome": "Hospital Municipal de Diadema",
        "cidade": "Diadema", "bairro": "Centro", "tipo": "01", "gestao": "3",
        "telefone": "(11) 4057-8000", "endereco": "Av. Alda, 500 - Centro",
        "lat": -23.6861, "lon": -46.6254,
        "especialidades": ["01","02","03","04","05","06","07","08","09","10"]
    },
    {
        "cnes": "2467907", "cnpj": "61386236001107", "nome": "UPA Diadema",
        "cidade": "Diadema", "bairro": "Piraporinha", "tipo": "04", "gestao": "3",
        "telefone": "(11) 4057-9000", "endereco": "Av. Fábio Eduardo Ramos Esquivel, 1000 - Piraporinha",
        "lat": -23.7012, "lon": -46.6198,
        "especialidades": ["01","02","04"]
    },
    {
        "cnes": "2467908", "cnpj": "61386236001288", "nome": "UBS Eldorado",
        "cidade": "Diadema", "bairro": "Eldorado", "tipo": "07", "gestao": "3",
        "telefone": "(11) 4057-7000", "endereco": "R. das Margaridas, 300 - Eldorado",
        "lat": -23.6954, "lon": -46.6123,
        "especialidades": ["01","02","03"]
    },
    {
        "cnes": "2467909", "cnpj": "61386236001369", "nome": "CAPS Diadema",
        "cidade": "Diadema", "bairro": "Centro", "tipo": "09", "gestao": "3",
        "telefone": "(11) 4057-8500", "endereco": "Av. Alda, 600 - Centro",
        "lat": -23.6865, "lon": -46.6251,
        "especialidades": ["10"]
    },
    {
        "cnes": "2467910", "cnpj": "61386236001440", "nome": "Hospital Municipal de Mauá",
        "cidade": "Mauá", "bairro": "Centro", "tipo": "01", "gestao": "3",
        "telefone": "(11) 4547-8000", "endereco": "Av. Barão de Mauá, 800 - Centro",
        "lat": -23.6678, "lon": -46.4614,
        "especialidades": ["01","02","03","04","05","06","07","08","09","10"]
    },
    {
        "cnes": "2467911", "cnpj": "61386236001521", "nome": "UPA Mauá",
        "cidade": "Mauá", "bairro": "Vila Noêmia", "tipo": "04", "gestao": "3",
        "telefone": "(11) 4547-9000", "endereco": "Av. João Ramalho, 2000 - Vila Noêmia",
        "lat": -23.6801, "lon": -46.4502,
        "especialidades": ["01","02","04"]
    },
    {
        "cnes": "2467912", "cnpj": "61386236001602", "nome": "UBS Zaíra",
        "cidade": "Mauá", "bairro": "Zaíra", "tipo": "06", "gestao": "3",
        "telefone": "(11) 4547-7500", "endereco": "R. das Orquídeas, 150 - Zaíra",
        "lat": -23.6701, "lon": -46.4589,
        "especialidades": ["01","02","03"]
    },
    {
        "cnes": "2467913", "cnpj": "61386236001783", "nome": "Hospital Municipal de Ribeirão Pires",
        "cidade": "Ribeirão Pires", "bairro": "Centro", "tipo": "01", "gestao": "3",
        "telefone": "(11) 4828-8000", "endereco": "Av. Francisco Monteiro, 1000 - Centro",
        "lat": -23.7123, "lon": -46.4156,
        "especialidades": ["01","02","03","04","05","06","07","08","09","10"]
    },
    {
        "cnes": "2467914", "cnpj": "61386236001864", "nome": "UPA Ribeirão Pires",
        "cidade": "Ribeirão Pires", "bairro": "Jardim Pastoril", "tipo": "04", "gestao": "3",
        "telefone": "(11) 4828-9000", "endereco": "Av. Prefeito Valdírio Prisco, 500 - Jardim Pastoril",
        "lat": -23.7201, "lon": -46.4201,
        "especialidades": ["01","02","04"]
    },
    {
        "cnes": "2467915", "cnpj": "61386236001945", "nome": "UBS Ouro Fino",
        "cidade": "Ribeirão Pires", "bairro": "Ouro Fino", "tipo": "07", "gestao": "3",
        "telefone": "(11) 4828-7500", "endereco": "R. das Acácias, 200 - Ouro Fino",
        "lat": -23.7154, "lon": -46.4189,
        "especialidades": ["01","02","03"]
    },
    {
        "cnes": "2467916", "cnpj": "61386236002084", "nome": "Hospital Municipal de Rio Grande da Serra",
        "cidade": "Rio Grande da Serra", "bairro": "Centro", "tipo": "01", "gestao": "3",
        "telefone": "(11) 4828-5000", "endereco": "Av. Dom Pedro II, 200 - Centro",
        "lat": -23.7301, "lon": -46.3989,
        "especialidades": ["01","02","03","04","05","06","07","08","09","10"]
    },
    {
        "cnes": "2467917", "cnpj": "61386236002165", "nome": "UBS Rio Grande da Serra",
        "cidade": "Rio Grande da Serra", "bairro": "Centro", "tipo": "06", "gestao": "3",
        "telefone": "(11) 4828-5500", "endereco": "R. das Flores, 100 - Centro",
        "lat": -23.7298, "lon": -46.3985,
        "especialidades": ["01","02","03"]
    },
]

# Nomes para geração sintética
NOMES_HOSPITAIS = [
    "Hospital", "Hospital e Maternidade", "Hospital Geral", "Hospital Universitário",
    "Instituto", "Complexo Hospitalar", "Santa Casa", "Hospital de Clínicas"
]
NOMES_UBS = [
    "UBS", "Unidade Básica de Saúde", "Unidade de Saúde", "Posto de Saúde",
    "Centro de Saúde", "Unidade de Saúde da Família", "USF"
]
NOMES_CLINICAS = [
    "Clínica", "Centro Médico", "Centro de Especialidades", "Ambulatório",
    "Policlínica", "Centro de Diagnóstico", "Instituto de Especialidades"
]
NOMES_LAB = [
    "Laboratório", "Laboratório de Análises Clínicas", "Centro de Diagnóstico",
    "Instituto de Patologia", "Laboratório de Patologia"
]

# Sobrenomes para nomes fantasia
SOBRENOMES = [
    "São Paulo", "ABC", "Paulista", "Metropolitano", "Brasil", "Sudeste",
    "Vida", "Saúde", "Bem-Estar", "Cuidar", "Med", "Health", "Clínicas",
    "Médico", "Hospitalar", "Assistencial", "Humanos", "Esperança", "Cura"
]

PREFIXOS = [
    "Santa", "São", "Nossa", "Santo", "Divina", "Sagrada", "Nova", "Central",
    "Unida", "Integral", "Total", "Plena", "Vital", "Prime", "Master", "Top"
]

def gerar_cnes() -> str:
    """Gera CNES fictício (7 dígitos)."""
    return str(random.randint(2000000, 9999999))

def gerar_cnpj() -> str:
    """Gera CNPJ fictício formatado."""
    base = random.randint(10000000, 99999999)
    filial = random.randint(1, 9999)
    dv = random.randint(10, 99)
    return f"{base:08d}/{filial:04d}-{dv}"

def gerar_telefone(cidade: str) -> str:
    """Gera telefone com DDD correto."""
    ddd = "11"  # Todos SP capital/região metropolitana
    prefixo = random.choice(["2", "3", "4", "5"])
    num = f"{random.randint(1000, 9999)}-{random.randint(1000, 9999)}"
    return f"({ddd}) {prefixo}{num}"

def escolher_especialidades(tipo: str, max_esp: int = 5) -> List[str]:
    """Escolhe especialidades compatíveis com o tipo."""
    if tipo in ["01", "02", "03", "04", "05"]:  # Hospitais
        return random.sample(list(ESPECIALIDADES.keys()), random.randint(5, 15))
    elif tipo in ["06", "07"]:  # UBS/USF
        return random.sample(["01", "02", "03", "23", "25"], random.randint(2, 4))
    elif tipo == "08":  # CEO
        return ["30"]
    elif tipo == "09":  # CAPS
        return ["10"]
    elif tipo == "11":  # Laboratório
        return ["21", "22"]
    else:
        return random.sample(list(ESPECIALIDADES.keys()), random.randint(1, 3))

def gerar_estabelecimentos_sinteticos(count: int = 300) -> List[Dict]:
    """Gera estabelecimentos sintéticos realistas."""
    estabelecimentos = []
    
    for _ in range(count):
        cidade = random.choice(list(CITIES.values()))
        bairro = random.choice(BAIRROS_POR_CIDADE[cidade])
        
        # Tipo com pesos realistas (mais UBS, menos hospitais)
        tipo = random.choices(
            list(TIPO_ESTABELECIMENTO.keys()),
            weights=[3, 2, 1, 2, 1, 25, 15, 3, 5, 1, 5, 1, 1, 1, 1, 1, 1, 5]
        )[0]
        
        # Gestão: mais públicas em UBS/CAPS, mais privadas em hospitais/clínicas
        if tipo in ["06", "07", "09"]:
            gestao = random.choices(["3", "2", "1", "5", "4"], weights=[50, 15, 10, 15, 10])[0]
        elif tipo in ["01", "02", "03"]:
            gestao = random.choices(["4", "5", "3", "2", "1"], weights=[40, 25, 15, 10, 10])[0]
        else:
            gestao = random.choices(["4", "5", "3"], weights=[50, 30, 20])[0]
        
        # Nome baseado no tipo
        if tipo in ["01", "02", "03"]:
            prefixo = random.choice(PREFIXOS)
            sufixo = random.choice(SOBRENOMES)
            base_nome = random.choice(NOMES_HOSPITAIS)
            nome = f"{base_nome} {prefixo} {sufixo}"
        elif tipo in ["06", "07"]:
            base_nome = random.choice(NOMES_UBS)
            sufixo = bairro if random.random() > 0.3 else random.choice(SOBRENOMES)
            nome = f"{base_nome} {sufixo}"
        elif tipo == "11":
            prefixo = random.choice(PREFIXOS)
            nome = f"{random.choice(NOMES_LAB)} {prefixo}"
        else:
            prefixo = random.choice(PREFIXOS)
            sufixo = random.choice(SOBRENOMES)
            base_nome = random.choice(NOMES_CLINICAS)
            nome = f"{base_nome} {prefixo} {sufixo}"
        
        # Telefone (80% têm)
        telefone = gerar_telefone(cidade) if random.random() < 0.85 else ""
        
        # Endereço
        ruas = ["R.", "Av.", "Rua", "Avenida", "Praça", "Alameda", "Travessa"]
        rua = f"{random.choice(ruas)} {random.choice(['das Flores', 'dos Ipês', 'das Palmeiras', 'do Comércio', 'das Nações', 'dos Estados', 'da Saúde', 'da Vida', 'da Esperança', 'Central', 'Principal', 'Brasil', 'Portugal', 'Itália', 'Japão', 'China', 'Índia', 'México', 'Canadá'])}"
        numero = random.randint(1, 9999)
        endereco = f"{rua}, {numero} - {bairro}"
        
        # Coordenadas aproximadas por cidade
        coords = {
            "São Paulo": (-23.5505, -46.6333),
            "São Bernardo do Campo": (-23.6961, -46.5654),
            "Santo André": (-23.6597, -46.5339),
            "São Caetano do Sul": (-23.6222, -46.5511),
            "Diadema": (-23.6861, -46.6254),
            "Mauá": (-23.6678, -46.4614),
            "Ribeirão Pires": (-23.7123, -46.4156),
            "Rio Grande da Serra": (-23.7301, -46.3989),
        }
        base_lat, base_lon = coords[cidade]
        lat = base_lat + random.uniform(-0.03, 0.03)
        lon = base_lon + random.uniform(-0.03, 0.03)
        
        especialidades = escolher_especialidades(tipo)
        
        estabelecimentos.append({
            "cnes": gerar_cnes(),
            "cnpj": gerar_cnpj(),
            "nome": nome.strip(),
            "nome_fantasia": nome.strip(),
            "cidade": cidade,
            "bairro": bairro,
            "tipo_codigo": tipo,
            "tipo_descricao": TIPO_ESTABELECIMENTO[tipo],
            "gestao_codigo": gestao,
            "gestao_descricao": GESTAO[gestao],
            "telefone": telefone,
            "endereco": endereco,
            "lat": round(lat, 6),
            "lon": round(lon, 6),
            "especialidades_codigos": especialidades,
            "especialidades_nomes": [ESPECIALIDADES[c] for c in especialidades],
            "leitos": random.randint(0, 300) if tipo in ["01", "02", "03"] else 0,
            "leitos_sus": random.randint(0, 200) if tipo in ["01", "02", "03"] and gestao in ["1", "2", "3", "5", "6", "7"] else 0,
            "leitos_uti": random.randint(0, 50) if tipo in ["01", "02"] else 0,
            "data_atualizacao": "2024-07-01",
            "fonte": "CNES_Sintético",
            "ativo": True
        })
    
    return estabelecimentos


def converter_para_formato_dashboard(estabs: List[Dict]) -> List[Dict]:
    """Converte para formato compatível com dashboard existente."""
    result = []
    for e in estabs:
        # Normalizar chaves (reais usam 'tipo', sintéticos usam 'tipo_codigo')
        tipo_codigo = e.get("tipo_codigo") or e.get("tipo")
        tipo_descricao = e.get("tipo_descricao") or TIPO_ESTABELECIMENTO.get(tipo_codigo, "")
        gestao_codigo = e.get("gestao_codigo") or e.get("gestao")
        gestao_descricao = e.get("gestao_descricao") or GESTAO.get(gestao_codigo, "")
        
        # Score de adequação para serviços LELYON
        fit_scores = {}
        if tipo_codigo in ["11"]:  # Laboratório
            fit_scores["PWA/App Development"] = 80
            fit_scores["Loja WordPress/WooCommerce"] = 60
        elif tipo_codigo in ["01", "02", "03"]:  # Hospitais
            fit_scores["PWA/App Development"] = 90
            fit_scores["Agente IA/Automação"] = 85
            fit_scores["CRM & Estoque QR-Code"] = 80
            fit_scores["Segurança + SEO"] = 70
        elif tipo_codigo in ["06", "07"]:  # UBS/USF
            fit_scores["Agente IA/Automação"] = 70
            fit_scores["CRM & Estoque QR-Code"] = 60
        
        best_fit = max(fit_scores, key=fit_scores.get) if fit_scores else "N/A"
        fit_score = max(fit_scores.values()) if fit_scores else 0
        
        result.append({
            "cnes": e["cnes"],
            "cnpj": e["cnpj"],
            "razao_social": e["nome"],
            "nome_fantasia": e.get("nome_fantasia") or e["nome"],
            "cidade": e["cidade"],
            "bairro": e["bairro"],
            "cnae": "8630503" if tipo_codigo in ["01","02","03","04","05"] else "8630503",  # Atividade médica
            "cnae_desc": tipo_descricao,
            "situacao": "Ativa" if e.get("ativo", True) else "Inativa",
            "porte": "Grande" if tipo_codigo in ["01","02"] else ("ME" if tipo_codigo in ["03","04","05","11"] else "MEI"),
            "capital_social": random.randint(500000, 50000000) if tipo_codigo in ["01","02"] else random.randint(5000, 360000),
            "data_abertura": f"{random.randint(1990,2024)}-{random.randint(1,12):02d}-{random.randint(1,28):02d}",
            "tipo_prospeccao": "B2B",
            "b2c_categoria": "Saúde & Bem-estar",
            "best_fit_service": best_fit,
            "fit_score": fit_score,
            "lelyon_fit": fit_scores,
            # Campos CNES específicos
            "tipo_estabelecimento": tipo_descricao,
            "tipo_codigo": tipo_codigo,
            "gestao": gestao_descricao,
            "gestao_codigo": gestao_codigo,
            "telefone": e.get("telefone", ""),
            "endereco_completo": e.get("endereco", ""),
            "latitude": e.get("lat", 0),
            "longitude": e.get("lon", 0),
            "especialidades": ", ".join(e.get("especialidades_nomes", [ESPECIALIDADES.get(c, "") for c in e.get("especialidades_codigos", [])])),
            "especialidades_codigos": ", ".join(e.get("especialidades_codigos", [])),
            "leitos_total": e.get("leitos", 0),
            "leitos_sus": e.get("leitos_sus", 0),
            "leitos_uti": e.get("leitos_uti", 0),
            "data_atualizacao_cnes": e.get("data_atualizacao", "2024-07-01"),
            # Campos de enriquecimento
            "email": "",
            "whatsapp": "",
            "website": "",
            "website_status": "",
            "contato_nome": "",
            "contato_cargo": "",
            "linkedin": "",
            "instagram": "",
            "facebook": "",
            "fonte_enriquecimento": "",
            "data_enriquecimento": "",
            "observacoes": f"Fonte: CNES {e.get('fonte', 'Sintético')} | Tipo: {tipo_descricao} | Gestão: {gestao_descricao} | Leitos: {e.get('leitos', 0)} | Leitos SUS: {e.get('leitos_sus', 0)} | UTI: {e.get('leitos_uti', 0)}"
        })
    return result


def save_data(health_companies: List[Dict], output_dir: Path):
    """Salva dados de saúde nos mesmos formatos."""
    output_dir.mkdir(parents=True, exist_ok=True)
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    
    # JSON apenas saúde
    json_file = output_dir / f"lelyon_prospects_saude_{timestamp}.json"
    with open(json_file, "w", encoding="utf-8") as f:
        json.dump(health_companies, f, ensure_ascii=False, indent=2)
    
    # CSV saúde
    csv_file = output_dir / f"lelyon_prospects_saude_{timestamp}.csv"
    if health_companies:
        fieldnames = list(health_companies[0].keys())
        with open(csv_file, "w", encoding="utf-8-sig", newline="") as f:
            writer = csv.DictWriter(f, fieldnames=fieldnames)
            writer.writeheader()
            for c in health_companies:
                row = {k: c.get(k, "") for k in fieldnames}
                row["lelyon_fit"] = json.dumps(c.get("lelyon_fit", {}), ensure_ascii=False)
                writer.writerow(row)
    
    # Excel multi-abas
    excel_file = output_dir / f"lelyon_prospects_saude_{timestamp}.xlsx"
    with pd.ExcelWriter(excel_file, engine="openpyxl") as writer:
        df = pd.DataFrame(health_companies)
        df["lelyon_fit_str"] = df["lelyon_fit"].apply(lambda x: json.dumps(x, ensure_ascii=False) if isinstance(x, dict) else str(x))
        
        df.to_excel(writer, sheet_name="Saúde_Todos", index=False)
        
        # Por tipo de estabelecimento
        for tipo_cod, tipo_nome in TIPO_ESTABELECIMENTO.items():
            df_t = df[df["tipo_codigo"] == tipo_cod].copy()
            if len(df_t) > 0:
                safe = tipo_nome.replace("/", "_").replace(" ", "_")[:31]
                df_t.to_excel(writer, sheet_name=f"Saúde_{safe}", index=False)
        
        # Por cidade
        for city in CITIES.values():
            df_c = df[df["cidade"] == city].copy()
            if len(df_c) > 0:
                df_c.to_excel(writer, sheet_name=f"Saúde_{city[:28]}", index=False)
        
        # Por gestão
        for gest_cod, gest_nome in GESTAO.items():
            df_g = df[df["gestao_codigo"] == gest_cod].copy()
            if len(df_g) > 0:
                safe = gest_nome.replace("/", "_").replace(" ", "_")[:31]
                df_g.to_excel(writer, sheet_name=f"Saúde_{safe}", index=False)
        
        # Por especialidade (top 10)
        all_esps = {}
        for _, row in df.iterrows():
            for esp in row["especialidades_codigos"].split(", "):
                if esp:
                    all_esps[esp] = all_esps.get(esp, 0) + 1
        top_esps = sorted(all_esps.items(), key=lambda x: x[1], reverse=True)[:10]
        for esp_cod, _ in top_esps:
            esp_nome = ESPECIALIDADES.get(esp_cod, esp_cod)
            df_e = df[df["especialidades_codigos"].str.contains(esp_cod, na=False)].copy()
            if len(df_e) > 0:
                safe = esp_nome.replace("/", "_").replace(" ", "_")[:31]
                df_e.to_excel(writer, sheet_name=f"Esp_{safe}", index=False)
        
        # Resumo
        stats = [
            {"Métrica": "Total Estabelecimentos Saúde", "Valor": len(health_companies)},
            {"Métrica": "Com Telefone", "Valor": len([c for c in health_companies if c.get("telefone")])},
            {"Métrica": "Hospitais (01,02,03)", "Valor": len([c for c in health_companies if c["tipo_codigo"] in ["01","02","03"]])},
            {"Métrica": "UBS/USF (06,07)", "Valor": len([c for c in health_companies if c["tipo_codigo"] in ["06","07"]])},
            {"Métrica": "CAPS (09)", "Valor": len([c for c in health_companies if c["tipo_codigo"] == "09"])},
            {"Métrica": "CEO (08)", "Valor": len([c for c in health_companies if c["tipo_codigo"] == "08"])},
            {"Métrica": "Laboratórios (11)", "Valor": len([c for c in health_companies if c["tipo_codigo"] == "11"])},
            {"Métrica": "Pública Municipal (3)", "Valor": len([c for c in health_companies if c["gestao_codigo"] == "3"])},
            {"Métrica": "Privada Lucrativa (4)", "Valor": len([c for c in health_companies if c["gestao_codigo"] == "4"])},
            {"Métrica": "Filantrópica (5)", "Valor": len([c for c in health_companies if c["gestao_codigo"] == "5"])},
            {"Métrica": "Total Leitos", "Valor": sum(c["leitos_total"] for c in health_companies)},
            {"Métrica": "Total Leitos SUS", "Valor": sum(c["leitos_sus"] for c in health_companies)},
            {"Métrica": "Total Leitos UTI", "Valor": sum(c["leitos_uti"] for c in health_companies)},
        ]
        pd.DataFrame(stats).to_excel(writer, sheet_name="Resumo_Saúde", index=False)
    
    # Symlink latest
    for src, dst_name in [
        (json_file, "lelyon_prospects_saude_latest.json"),
        (csv_file, "lelyon_prospects_saude_latest.csv"),
        (excel_file, "lelyon_prospects_saude_latest.xlsx"),
    ]:
        dst = output_dir / dst_name
        if dst.exists():
            dst.unlink()
        dst.symlink_to(src.name)
    
    print(f"✅ Dados de Saúde salvos:")
    print(f"   📄 JSON: {json_file}")
    print(f"   📊 CSV:  {csv_file}")
    print(f"   📈 Excel: {excel_file}")
    
    return str(json_file), str(csv_file), str(excel_file)


def main():
    print("=" * 60)
    print("LELYON - Base de Dados SAÚDE (CNES) - São Paulo + Grande ABC")
    print("Esquema oficial CNES - Ministério da Saúde")
    print("=" * 60)
    
    output_dir = Path("/root/lelyon_prospecting/data")
    
    print("\n🏥 Carregando estabelecimentos REAIS conhecidos...")
    reais = ESTABELECIMENTOS_REAIS
    print(f"   {len(reais)} estabelecimentos reais")
    
    print("\n🏥 Gerando estabelecimentos SINTÉTICOS realistas...")
    sinteticos = gerar_estabelecimentos_sinteticos(300)
    print(f"   {len(sinteticos)} estabelecimentos sintéticos")
    
    all_estabs = reais + sinteticos
    print(f"\n📊 Total: {len(all_estabs)} estabelecimentos de saúde")
    
    print("\n🔄 Convertendo para formato dashboard...")
    health_companies = converter_para_formato_dashboard(all_estabs)
    
    # Stats
    print(f"\n📈 Distribuição por Tipo:")
    for cod, nome in TIPO_ESTABELECIMENTO.items():
        qtd = len([c for c in health_companies if c["tipo_codigo"] == cod])
        if qtd > 0:
            print(f"   {nome}: {qtd}")
    
    print(f"\n📈 Distribuição por Gestão:")
    for cod, nome in GESTAO.items():
        qtd = len([c for c in health_companies if c["gestao_codigo"] == cod])
        if qtd > 0:
            print(f"   {nome}: {qtd}")
    
    print(f"\n📈 Distribuição por Cidade:")
    for city in CITIES.values():
        qtd = len([c for c in health_companies if c["cidade"] == city])
        if qtd > 0:
            print(f"   {city}: {qtd}")
    
    print(f"\n📞 Com telefone: {len([c for c in health_companies if c.get('telefone')])}/{len(health_companies)}")
    
    print("\n💾 Salvando arquivos...")
    save_data(health_companies, output_dir)
    
    print("\n✅ Base SAÚDE concluída!")
    return health_companies


if __name__ == "__main__":
    main()