# Análise da vacinação COVID-19
# Estudantes: Mateus Adada e Luís Felipe
# UDESC - Universidade do Estado de Santa Catarina
# Extensão Universitária
# Disciplina: Sistemas de Informações Geográficas (7SIG003) - Professor LUIZ DALMOLIN


import json, requests, pandas as pd, folium
from folium import plugins
from branca.colormap import LinearColormap


# Dados
geojson_brasil = requests.get(
    "https://raw.githubusercontent.com/codeforamerica/click_that_hood/master/public/data/brazil-states.geojson"
).json()


df_raw = pd.read_csv("https://raw.githubusercontent.com/wcota/covid19br/master/cases-brazil-states.csv")
df = df_raw[(df_raw['date'] == df_raw['date'].max()) & (df_raw['state'] != 'TOTAL')].copy()

# Adicionadas as colunas de porcentagem (base: população total do estado)
df = df[[
    'state', 'deaths', 'vaccinated', 'vaccinated_second',
    'vaccinated_per_100_inhabitants',
    'vaccinated_second_per_100_inhabitants',
    'deaths_per_100k_inhabitants'
]].fillna(0)

df['deaths'] = df['deaths'].astype(int)
df['vaccinated'] = df['vaccinated'].astype(int)
df['vaccinated_second'] = df['vaccinated_second'].astype(int)

df['pct_dose1'] = df['vaccinated_per_100_inhabitants'].round(0)
df['pct_completo'] = df['vaccinated_second_per_100_inhabitants'].round(0)
df['pct_obitos'] = (df['deaths_per_100k_inhabitants'] / 1000).round(3)

dados = df.set_index('state').to_dict(orient='index')


def fmt_num(n):
    return f"{n:,.0f}".replace(',', '.')


# GeoJSON
for feat in geojson_brasil['features']:
    sigla = feat['properties'].get('sigla', '')
    nome = feat['properties'].get('name', '')
    info = dados.get(sigla)

    if info:
        vac1 = int(info['vaccinated'])
        vac2 = int(info['vaccinated_second'])
        obt = int(info['deaths'])
        pct1 = info['pct_dose1']
        pct2 = info['pct_completo']
        pct_obt = info['pct_obitos']

        feat['properties']['estado_completo'] = f"{nome} ({sigla})"
        feat['properties']['dose1_completo']  = f"{fmt_num(vac1)} ({pct1:.0f}%)"
        feat['properties']['dose2_completo']  = f"{fmt_num(vac2)} ({pct2:.0f}%)"
        feat['properties']['obitos_completo'] = f"{fmt_num(obt)} ({pct_obt:.2f}%)"
        feat['properties']['vac_num']         = pct2
    else:
        feat['properties']['estado_completo'] = f"{nome} ({sigla})"
        feat['properties']['dose1_completo']  = "Sem dados"
        feat['properties']['dose2_completo']  = "Sem dados"
        feat['properties']['obitos_completo'] = "Sem dados"
        feat['properties']['vac_num']         = 0.0


# Mapa
mapa = folium.Map(location=[-14.2350, -51.9253], zoom_start=4,
                  tiles='CartoDB positron', control_scale=True)


# Aumentar a caixinha de informações ao selecionar o Estado. Feito via CSS
style_tooltip = """
    <style>
    .leaflet-tooltip {
        font-size: 20px !important; /* Fonte bem maior */
        line-height: 1.6 !important;
        padding: 25px !important; /* Mais respiro interno */
        background-color: rgba(255, 255, 255, 0.95) !important;
        border-radius: 12px !important;
        min-width: 350px !important; /* Caixa mais larga */
        box-shadow: 0 0 15px rgba(0,0,0,0.2) !important;
    }
    </style>
"""
mapa.get_root().header.add_child(folium.Element(style_tooltip))


colormap = LinearColormap(
    colors=['#d73027','#f46d43','#fdae61','#fee08b','#d9ef8b','#a6d96a','#1a9850'],
    vmin=df['pct_completo'].min(), vmax=df['pct_completo'].max()
).to_step(n=7)
colormap.caption = 'Taxa de Vacinação Completa (%)'
colormap.add_to(mapa)


folium.GeoJson(
    geojson_brasil,
    name="Vacinação COVID-19 por Estado",
    style_function=lambda f: {
        'fillColor': colormap(f['properties'].get('vac_num', 0)),
        'color': '#2c3e50', 'weight': 1.2, 'fillOpacity': 0.75
    },
    highlight_function=lambda f: {'weight': 3, 'color': '#000000', 'fillOpacity': 0.9},
    tooltip=folium.GeoJsonTooltip(
        fields=['estado_completo', 'dose1_completo', 'dose2_completo', 'obitos_completo'],
        aliases=['Estado:', 'Vacinação 1º dose:', 'Vacinação completa:', 'Óbitos:'],
        sticky=True,
        style="font-weight: bold;"
    )
).add_to(mapa)


folium.LayerControl(position='topright').add_to(mapa)
plugins.MiniMap(toggle_display=True, position='bottomleft').add_to(mapa)


mapa.save("Mapa gerado - Análise da vacinação COVID-19.html")
