from django.views.generic import TemplateView
from django.shortcuts import HttpResponse, render
import pandas as pd
import plotly
import plotly.offline as pyo
from plotly.graph_objs import *
import plotly.graph_objects as go
import plotly.express as px
import geopandas as gpd
import json
import urllib.request
import numpy as np
import requests


# views.py
from django.template import loader

import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
from datetime import datetime
import io
from io import BytesIO
import seaborn as sns


def generar_informe(request):
    # Cargar el archivo Excel
    file_path = 'ESTADISTICAS_11_2024.xlsx'  # Cambia esto por la ruta de tu archivo
    df = pd.read_excel(file_path, sheet_name='ESTADISTICAS_11_2024')

    # Obtener la fecha actual
    fecha_actual = datetime.now().strftime("%d-%m-%Y")

    # Lógica para generar el informe como se explicó previamente
    total_medicos = len(df)
    medicos_por_sexo = df['SEXO'].value_counts()
    medicos_por_sexo.index = ["Femenino" if i == "F" else "Masculino" for i in medicos_por_sexo.index]
    medicos_por_sexo_pct = (medicos_por_sexo / total_medicos) * 100
    departamentos_a_excluir = ["Ciudad de Buenos Aires", "San Fernando", "Buenos Aires", "Paraná"]
    medicos_por_departamento = df[~df['DPTO'].isin(departamentos_a_excluir)]['DPTO'].value_counts()
    medicos_por_departamento_pct = (medicos_por_departamento / medicos_por_departamento.sum()) * 100
    medicos_con_especialidad = df['TIENE ESPECIALIDAD'].value_counts().get('SI', 0)
    medicos_con_especialidad_pct = (medicos_con_especialidad / total_medicos) * 100
    especialidades = pd.concat([df['ESPECIALIDAD 1'], df['ESPECIALIDAD 2'], df['ESPECIALIDAD 3'], df['ESPECIALIDAD 4']])
    especialidades = especialidades.dropna().value_counts()
    medicos_por_decada = df['DECADA'].value_counts().sort_index()
    current_year = datetime.now().year
    matriculas_por_anio = df['MATRICULA'].value_counts().sort_index()
    matriculas_por_anio = matriculas_por_anio[matriculas_por_anio.index >= current_year - 30]
    especialistas_por_departamento = df[(df['TIENE ESPECIALIDAD'] == 'SI') & (~df['DPTO'].isin(['Paraná']))]['DPTO'].value_counts()
    especialistas_por_departamento_pct = (especialistas_por_departamento / especialistas_por_departamento.sum()) * 100
    poblacion_df = pd.DataFrame({
        'DPTO': ['La Capital', 'Las Colonias', 'Castellanos', 'San Jeronimo', 'San Martin', 'Garay', 'San Javier',
                 'San Justo', 'San Cristobal', 'General Obligado', 'Vera', '9 de Julio'],
        'poblacion': [570732, 116020, 192517, 84189, 69426, 24853, 33936,
                      47061, 72574, 197544, 56553, 31371]
    })

    # Calcular la cantidad de médicos por 1000 habitantes
    medicos_por_departamento_poblacion = df['DPTO'].value_counts().reset_index()
    medicos_por_departamento_poblacion.columns = ['DPTO', 'cantidad']
    medicos_por_departamento_poblacion = pd.merge(medicos_por_departamento_poblacion, poblacion_df, on='DPTO', how='left')
    medicos_por_departamento_poblacion['medicos_por_habitantes'] = medicos_por_departamento_poblacion['cantidad'] / medicos_por_departamento_poblacion['poblacion'] * 1000
  
  # Calcular la cantidad de médicos por sexo en cada departamento
    medicos_por_sexo_departamento = df.groupby(['DPTO', 'SEXO']).size().unstack(fill_value=0)
    medicos_por_sexo_departamento.columns = ["Femenino", "Masculino"]

    # Calcular la cantidad de médicos con y sin especialidad en cada departamento
    medicos_especialidad_departamento = df.groupby(['DPTO', 'TIENE ESPECIALIDAD']).size().unstack(fill_value=0)
    medicos_especialidad_departamento.columns = ["Sin Especialidad", "Con Especialidad"]
    
    pdf_file = io.BytesIO()
    with PdfPages(pdf_file) as pdf:
        # Aquí va todo el código para crear los gráficos, similar a como lo tenías antes, pero cambiando `pdf.savefig(fig)` por la escritura al `response`.

        # Portada
        fig, ax = plt.subplots(figsize=(11, 8.5))
        ax.text(0.5, 0.6, "Estadísticas Colegio de Médicos", fontsize=28, ha='center', va='center')
        ax.text(0.5, 0.4, f"Fecha: {fecha_actual}", fontsize=20, ha='center', va='center')
        ax.axis('off')

        plt.tight_layout()
        pdf.savefig(fig)
        plt.close()

        # Total de Médicos
        fig, ax = plt.subplots(figsize=(11, 8.5))
        ax.text(0.5, 0.5, f"Cantidad Total de Médicos: {total_medicos}", fontsize=24, ha='center')
        ax.axis('off')
        plt.tight_layout()
        pdf.savefig(fig)
        plt.close()

        # Gráfico de Médicos por Sexo
        fig, ax = plt.subplots(figsize=(11, 8.5))
        medicos_por_sexo.plot(kind='bar', ax=ax, color=['skyblue', 'salmon'], title="Cantidad de Médicos por Sexo")
        ax.set_xlabel("Sexo")
        ax.set_ylabel("Cantidad de Médicos")
        for i, (v, pct) in enumerate(zip(medicos_por_sexo, medicos_por_sexo_pct)):
            ax.text(i, v + 5, f"{v} ({pct:.1f}%)", ha='center', fontsize=12)
        ax.tick_params(axis='x', rotation=0)
        plt.tight_layout()
        pdf.savefig(fig)
        plt.close()
   
        # Gráfico de Médicos por Departamento
        fig, ax = plt.subplots(figsize=(11, 8.5))
        medicos_por_departamento.plot(kind='pie', autopct='%1.1f%%', ax=ax, title="Cantidad de Médicos por Departamento")
        ax.set_ylabel("")
        plt.tight_layout()
        pdf.savefig(fig)
        plt.close()

        fig, ax = plt.subplots(figsize=(11, 8.5))
        ax.text(0.5, 0.5, f"Médicos con Especialidad: {medicos_con_especialidad} ({medicos_con_especialidad_pct:.1f}%)", fontsize=24, ha='center')
        ax.axis('off')
        plt.tight_layout()
        pdf.savefig(fig)
        plt.close()
        
         # Gráfico de Profesionales por Sexo en cada Departamento
        fig, ax = plt.subplots(figsize=(14, 8))
        medicos_por_sexo_departamento.plot(kind='bar', ax=ax, color=['salmon', 'skyblue'], width=0.4, position=0.5)
        ax.set_title("Cantidad de Profesionales por Sexo en cada Departamento")
        ax.set_xlabel("Departamento")
        ax.set_ylabel("Cantidad de Profesionales")
        plt.xticks(rotation=45, ha='right')
        
        # Etiquetas sobre cada barra
        for i in range(len(medicos_por_sexo_departamento)):
            for j, gender in enumerate(["Femenino", "Masculino"]):
                value = medicos_por_sexo_departamento.iloc[i, j]
                ax.text(i + (j - 0.5) * 0.4, value + 1, str(value), ha='center', va='bottom', fontsize=10)

        plt.tight_layout()
        pdf.savefig(fig)
        plt.close()
        
  

         # Gráfico de Profesionales con y sin Especialidad por Departamento
        fig, ax = plt.subplots(figsize=(14, 8))
        medicos_especialidad_departamento.plot(kind='bar', ax=ax, color=['grey', 'purple'], width=0.4, position=0.5)
        ax.set_title("Cantidad de Profesionales con y sin Especialidad por Departamento")
        ax.set_xlabel("Departamento")
        ax.set_ylabel("Cantidad de Profesionales")
        plt.xticks(rotation=45, ha='right')

        # Etiquetas sobre cada barra
        for i, depto in enumerate(medicos_especialidad_departamento.index):
            for j, label in enumerate(["Sin Especialidad", "Con Especialidad"]):
                value = medicos_especialidad_departamento.loc[depto, label]
                ax.text(i + (j - 0.5) * 0.4, value + 1, str(value), ha='center', va='bottom', fontsize=10)


        plt.tight_layout()
        pdf.savefig(fig)
        plt.close()



        # Cantidad de Médicos por Especialidad (barras horizontales con etiquetas y tamaño ajustado)
        fig, ax = plt.subplots(figsize=(14, 10))  # Ajuste del tamaño de la figura
        especialidades.plot(kind='barh', ax=ax, color='purple', title="Cantidad de Médicos por Especialidad")
        ax.set_xlabel("Cantidad de Médicos")
        ax.set_ylabel("Especialidad")
        plt.subplots_adjust(left=0.3, right=0.95, top=0.9, bottom=0.1)  # Ajuste para evitar solapamiento
        for i, v in enumerate(especialidades):
            ax.text(v + 5, i, str(v), va='center', fontsize=10)
        plt.tight_layout()
        pdf.savefig(fig)
        plt.close()

        # Médicos por Rango de Edad (Década) en la tercera hoja
        fig, ax = plt.subplots(figsize=(11, 8.5))
        medicos_por_decada.plot(kind='bar', ax=ax, color='orange', title="Cantidad de Médicos por Rango de Edad")
        ax.set_xlabel("Rango de Edad (Década)")
        ax.set_ylabel("Cantidad de Médicos")
        for i, v in enumerate(medicos_por_decada):
            ax.text(i, v + 5, str(v), ha='center', fontsize=12)
        ax.tick_params(axis='x', rotation=45)  # Rotar las etiquetas del eje X
        plt.tight_layout()
        pdf.savefig(fig)
        plt.close()
        
        # Crear una tabla con la cantidad de personas por sexo y década
        edad_sexo = df.groupby(['DECADA', 'SEXO']).size().unstack().fillna(0)
        edad_sexo = edad_sexo.reindex(columns=['F', 'M'])  # Asegura que el orden sea siempre Femenino, Masculino

        # Cambiar los valores para el gráfico de pirámide: el grupo masculino será negativo
        edad_sexo['M'] = -edad_sexo['M']

        # Crear el gráfico
        fig, ax = plt.subplots(figsize=(10, 8))
        edad_sexo.plot(kind='barh', stacked=True, ax=ax, color=['salmon', 'skyblue'])

        # Etiquetas y formato
        ax.set_xlabel("Cantidad de Personas")
        ax.set_ylabel("Grupo Etario (Década)")
        ax.set_title("Pirámide de Edad por Sexo")
        ax.legend(["Femenino", "Masculino"], loc="upper right")

        # Agregar etiquetas en las barras
        for i, (fem, masc) in enumerate(zip(edad_sexo['F'], edad_sexo['M'])):
            ax.text(fem + 5, i, int(fem), va='center', color='black')
            ax.text(masc - 5, i, int(-masc), va='center', color='black')

        plt.tight_layout()
        pdf.savefig(fig)
        plt.close()
        # Médicos Matriculados por Año (últimos 30 años) en la cuarta hoja
        fig, ax = plt.subplots(figsize=(14, 8.5))
        matriculas_por_anio.plot(kind='bar', ax=ax, color='green', title="Cantidad de Médicos Matriculados por Año (Últimos 30 Años)")
        ax.set_xlabel("Año de Matricula")
        ax.set_ylabel("Cantidad de Médicos")
        for i, v in enumerate(matriculas_por_anio):
            ax.text(i, v + 5, str(v), ha='center', fontsize=12)
        ax.tick_params(axis='x', rotation=45)  # Rotar las etiquetas del eje X
        plt.tight_layout()
        pdf.savefig(fig)
        plt.close()
        
        # Crear el gráfico de barras
        fig, ax = plt.subplots(figsize=(11, 8.5))
        medicos_por_departamento_poblacion.plot(x='DPTO', y='medicos_por_habitantes', kind='bar', ax=ax, title="Cantidad de Médicos por 1000 Habitantes por Departamento")
        ax.set_xlabel("Departamento")
        ax.set_ylabel("Médicos por 1000 Habitantes")
        # Agregar valores en las barras
        for i, v in enumerate(medicos_por_departamento_poblacion['medicos_por_habitantes']):
            ax.text(i, v + 0.1, f"{v:.2f}", ha='center', va='bottom', fontsize=10)
        ax.tick_params(axis='x', rotation=45)  # Rotar las etiquetas del eje X
        # Ajustar los límites del gráfico para evitar recorte de las etiquetas
        plt.tight_layout()
        pdf.savefig(fig)
        plt.close()
        
        # Gráficos adicionales: Cantidad de Especialistas por Departamento (gráfico circular)
        fig, ax = plt.subplots(figsize=(11, 8.5))
        especialistas_por_departamento.plot(kind='pie', autopct='%1.1f%%', ax=ax, title="Cantidad de Especialistas por Departamento")
        ax.set_ylabel("")
        pdf.savefig(fig)
        plt.close()


        # 1. Gráficos de Especialidades por Departamento con barras horizontales y cantidades agregadas sin leyenda
        departamentos_especialidades = df[df['TIENE ESPECIALIDAD'] == 'SI'].groupby('DPTO').apply(lambda x: x[['ESPECIALIDAD 1', 'ESPECIALIDAD 2', 'ESPECIALIDAD 3', 'ESPECIALIDAD 4']].stack().value_counts())
        for dpto, data in departamentos_especialidades.groupby(level=0):
            fig, ax = plt.subplots(figsize=(16, 12))  # Aumentar el tamaño para mejorar visibilidad
            data.droplevel(0).plot(kind='barh', ax=ax, color='skyblue', title=f"Especialidades en {dpto}")
            ax.set_xlabel("Cantidad")
            ax.set_ylabel("Especialidad")
    
            # Agregar las cantidades encima de las barras
            for i, v in enumerate(data):
                ax.text(v + 0.5, i, str(v), va='center', fontsize=12)  # Ajuste de la posición de las cantidades

            # Eliminar la leyenda (None)
            ax.legend().set_visible(False)  # Hacer la leyenda invisible
    
            # Ajustar los límites del eje Y para evitar recorte de las barras
            ax.set_ylim([-0.5, len(data) - 0.5])  # Ajustar los límites del eje Y para evitar recorte de las barras
    
            # Ajustar márgenes para mover el gráfico más a la derecha
            plt.subplots_adjust(right=0.75, top=0.9, bottom=0.1, left=0.25)  # Aumentar el valor de 'left' para mover el gráfico a la derecha
            plt.tight_layout()
            pdf.savefig(fig)
            plt.close()
        
    pdf_file.seek(0)

    # Devolver el archivo PDF como respuesta HTTP
    response = HttpResponse(pdf_file, content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="Informe_Medicos_Estadisticas_Grande.pdf"'
    return response

def Table(request):
   
    #carga del archivo--------------------------------------------------------------
    df = pd.read_csv ('ESTADISTICAS_11_2024.csv')
    
    #profesionales por sexo---------------------------------------------------------
    labels_sexo={'F':'Femenino','M':'Masculino'}
    df['SEXO'] = df['SEXO'].map(labels_sexo)  # Reemplaza 'F' y 'M' por las etiquetas
    df_sexo = df['SEXO'].value_counts()
    # Crear el gráfico de torta
    trace_sexo = px.pie(
       names=df_sexo.index,  # Usar los índices de los valores (Femenino/Masculino)
       values=df_sexo.values,  # Usar los valores de conteo
       title='Profesionales por Sexo'
    )
    total_medicos = 'Total de Profesionales Médicos Activos: '+ str(len(df))
    plot_sexo = pyo.plot(trace_sexo, output_type='div')

    # Filtrar solo los departamentos de Santa Fe (asegúrate de que los nombres coincidan con tu archivo)
    departamentos_santafe = [
        'La Capital', 'Las Colonias', 'Castellanos', 'San Jeronimo', 'San Martin', 
        'Garay', 'San Javier', 'San Justo', 'San Cristobal', 'General Obligado', 
        'Vera', '9 de Julio'  # Agrega todos los departamentos de Santa Fe
    ]
    df_santafe = df[df['DPTO'].isin(departamentos_santafe)]
      # Esta línea es solo para verificar la estructura de los datos

    # Agrupar por departamento y sexo para obtener el conteo
    df_grouped = df_santafe.groupby(['DPTO', 'SEXO']).size().reset_index(name='CANTIDAD')
    # Crear gráfico de barras agrupadas con valores en las barras
    fig = px.bar(
        df_grouped, 
        x='DPTO', 
        y='CANTIDAD', 
        color='SEXO', 
        barmode='group',
        title='Cantidad de Profesionales por Departamento y Sexo en Santa Fe',
        labels={'DPTO': 'Departamento', 'CANTIDAD': 'Cantidad de Profesionales', 'SEXO': 'Sexo'},
        height=600,
        width=1000,
        text='CANTIDAD'  # Agregar los valores de cantidad a cada barra
    )

    # Configuración para mostrar los valores automáticamente sobre cada barra
    fig.update_traces(textposition='outside')  # Coloca el texto por encima de cada barra

    # Generar y mostrar el gráfico en un div HTML
    plot_barras_sexo = pyo.plot(fig, output_type='div')
    
   # Filtrar los departamentos de Santa Fe
    departamentos_santafe = [
        'La Capital', 'Las Colonias', 'Castellanos', 'San Jeronimo', 'San Martin',
        'Garay', 'San Javier', 'San Justo', 'San Cristobal', 'General Obligado', 'Vera', '9 de Julio'
    ]
    df_santafe = df[df['DPTO'].isin(departamentos_santafe)]

    # Crear una columna que indique si el profesional tiene al menos una especialidad
    df_santafe['CON_ESPECIALIDAD'] = df_santafe[['ESPECIALIDAD 1', 'ESPECIALIDAD 2', 'ESPECIALIDAD 3', 'ESPECIALIDAD 4']].notna().any(axis=1)

    # Contar los profesionales por departamento y si tienen especialidad
    df_conteo = df_santafe.groupby(['DPTO', 'CON_ESPECIALIDAD']).size().reset_index(name='Cantidad')

    # Mapear True/False a "Con Especialidad" y "Sin Especialidad"
    df_conteo['CON_ESPECIALIDAD'] = df_conteo['CON_ESPECIALIDAD'].map({True: 'Con Especialidad', False: 'Sin Especialidad'})

    # Crear el gráfico de barras agrupadas
    fig = px.bar(
        df_conteo,
        x='DPTO',
        y='Cantidad',
        color='CON_ESPECIALIDAD',
        barmode='group',
        title='Profesionales por Departamento en Santa Fe (Con y Sin Especialidad)',
        labels={'DPTO': 'Departamento', 'Cantidad': 'Cantidad de Profesionales', 'CON_ESPECIALIDAD': 'Especialidad'},
        height=800,
        width=1000
    )
    fig.update_traces(texttemplate='%{y}', textposition='outside')
    plot_dpto_esp = pyo.plot(fig, output_type='div')

    #profesionales por departamento-------------------------------------------------
    # Conteo de profesionales por departamento
    # Lista de departamentos de Santa Fe (ajusta según los nombres exactos en tu archivo)
    departamentos_santafe = [
        'La Capital', 'Las Colonias', 'Castellanos', 'San Jeronimo', 'San Martin', 'Garay', 'San Javier',  # Agrega todos los departamentos
        'San Justo', 'San Cristobal', 'General Obligado ', 'Vera', '9 de Julio', 
        # Continúa con todos los departamentos de Santa Fe
    ]
    df_santafe = df[df['DPTO'].isin(departamentos_santafe)]
    df_depto = df_santafe['DPTO'].value_counts()
    # Crear el gráfico de torta
    trace_dpto = px.pie(
        names=df_depto.index,        # Departamentos como etiquetas
        values=df_depto.values,      # Cantidad de profesionales
        title='Profesionales por Departamento en Santa Fe',
        height=800, 
        width=800
    )

    # Configuración de trazas
    trace_dpto.update_traces(textposition='auto', textinfo='percent+label')

    # Generar el gráfico como un div HTML
    plot_dpto = pyo.plot(trace_dpto, output_type='div')

    #profesionales por edad---------------------------------------------------------
    # Campo para agrupar por década de edad
    field = "DECADA"
    data = df[field].value_counts().to_frame(name='count')  # Renombramos la columna para mayor claridad
    total = data['count'].sum()

    # Calcular el porcentaje para cada grupo de edad
    data['percentage'] = 100 * data['count'] / total

    # Filtrar datos según el límite de porcentaje
    percent_limit = 1
    otherdata = data[data['percentage'] < percent_limit]   # Datos con porcentaje menor al límite
    others_percentage = otherdata['percentage'].sum()      # Sumar el porcentaje de estos grupos

    # Datos principales (>= 1% de porcentaje)
    maindata = data[data['percentage'] >= percent_limit]

    # Agregar grupo "90 o mayores" para porcentajes menores al límite
    other_label = "90 o mayores"
    maindata.loc[other_label] = pd.Series({
        'count': otherdata['count'].sum(),
        'percentage': others_percentage
    })

    # Crear gráfico de barras
    title = "Profesionales por Edad"
    trace_edad = px.bar(
        maindata, 
        x=maindata.index,         # Etiquetas en el eje X
        y='count',                # Valores en el eje Y
        title=title,
        labels={'x': 'Rango de Edades', 'y': 'Cantidad de Profesionales'},
        color='count',            # Color basado en el conteo de profesionales
        color_continuous_scale='Blues'
    )

    # Generar el gráfico como un div HTML
    plot_edad = pyo.plot(trace_edad, output_type='div')

    #Tiene especialidad------------------------------------------------------------
    # -----------------------------------------
    # Profesionales con y sin especialidad
    # -----------------------------------------
    df_especialidad = df['TIENE ESPECIALIDAD'].value_counts()

    # Crear el gráfico de torta para "¿Tienen Especialidad?"
    trace_especialidad = px.pie(
        names=df_especialidad.index,       # Etiquetas (Con/Sin Especialidad)
        values=df_especialidad.values,     # Valores de conteo
        title='¿Tienen Especialidad?'
    )

    # Generar el gráfico como un div HTML
    plot_especialidad = pyo.plot(trace_especialidad, output_type='div')
    
    # -----------------------------------------
    # Profesionales por especialidad (hasta 4 especialidades)
    # -----------------------------------------
    # Concatenamos todas las especialidades (1 a 4) para contar cada especialidad
    especialidades = pd.concat([df['ESPECIALIDAD 1'], df['ESPECIALIDAD 2'], df['ESPECIALIDAD 3'], df['ESPECIALIDAD 4']])

    # Contamos la cantidad de profesionales por especialidad (eliminando valores NaN)
    df_especialidad_1 = especialidades.value_counts().dropna()

    # Crear el gráfico de barras para "Profesionales por Especialidad"
    trace_especialidad_1 = px.bar(
        x=df_especialidad_1.index,          # Especialidades
        y=df_especialidad_1.values,         # Número de profesionales
        title='Profesionales por Especialidad',
        labels={'x': 'Especialidad', 'y': 'Cantidad de Profesionales'},
        color=df_especialidad_1.values,     # Colorear según cantidad
        height=800,
        width=800
    )

    # Generar el gráfico como un div HTML
    plot_df_especialidad_1 = pyo.plot(trace_especialidad_1, output_type='div')
    
    #AÑO MATRICULACION------------------------------------------------------------
    # AÑO MATRICULACION------------------------------------------------------------
    # Contamos la cantidad de profesionales por año de matriculación
    df_año_matricula = df['MATRICULA'].value_counts().sort_index()

    # Filtrar para los últimos 40 años
    current_year = pd.to_datetime('today').year  # Obtener el año actual
    last_40_years = range(current_year - 40, current_year + 1)  # Crear un rango de los últimos 40 años

    # Filtramos los datos para incluir solo los años dentro del rango de los últimos 40 años
    df_año_matricula = df_año_matricula[df_año_matricula.index.isin(last_40_years)]

    # Configuración para el gráfico
    legend_año_matricula = {'x': 'Año de Matriculación', 'y': 'Cantidad de Profesionales'}

    # Crear el gráfico de barras
    trace_año_matricula = px.bar(
        df_año_matricula,                      # Contenido para el gráfico
        x=df_año_matricula.index,              # Año de matriculación (eje X)
        y=df_año_matricula.values,             # Cantidad de profesionales (eje Y)
        title='Cantidad de Profesionales Matriculados por Años (últimos 40 años)',
        color=df_año_matricula.values,         # Colorear según cantidad de profesionales
        labels=legend_año_matricula,           # Etiquetas de los ejes
        height=800,                            # Altura del gráfico
        width=800                              # Ancho del gráfico
    )

    # Generar el gráfico como un div HTML
    plot_año_matricula = pyo.plot(trace_año_matricula, output_type='div')

     #MATRICULADOS POR DEPARTAMENTO------------------------------------------------------------

    # Cargar datos de los departamentos
    santafe_departamentos = json.load(open("departamento.json", 'r'))

    # Crear un mapa de IDs de departamentos
    departamento_id_map = {}
    for feature in santafe_departamentos['features']:
        feature['id'] = feature['properties']['gid']
        departamento_id_map[feature['properties']['nam']] = feature['id']

    # Lista de departamentos de Santa Fe
    departamentos_santafe = [
        'La Capital', 'Las Colonias', 'Castellanos', 'San Jeronimo', 'San Martin', 'Garay', 'San Javier',
        'San Justo', 'San Cristobal', 'General Obligado', 'Vera', '9 de Julio',
        # Agrega todos los departamentos necesarios
    ]

    # Filtrar los datos para solo incluir los departamentos de Santa Fe
    df_santafe = df[df['DPTO'].isin(departamentos_santafe)]

    # Agrupar por departamento y contar médicos
    df_d = df_santafe.groupby('DPTO').size().reset_index(name='cantidad')

    # Mapear el nombre del departamento al ID del departamento
    df_d['id'] = df_d['DPTO'].apply(lambda x: departamento_id_map.get(x))

    # Cargar datos de población por departamento (ejemplo)
    poblacion_df = pd.DataFrame({
        'DPTO': ['La Capital', 'Las Colonias', 'Castellanos', 'San Jeronimo', 'San Martin', 'Garay', 'San Javier',
                 'San Justo', 'San Cristobal', 'General Obligado', 'Vera', '9 de Julio'],
        'poblacion': [570732, 116020, 192517, 84189, 69426, 24853, 33936,
                      47061, 72574, 197544, 56553, 31371]
    })

    # Unir los datos de población con los datos de médicos
    df_d = pd.merge(df_d, poblacion_df, on='DPTO', how='left')

    # Calcular la cantidad de médicos por habitantes
    df_d['medicos_por_habitantes'] = df_d['cantidad'] / df_d['poblacion'] * 1000  # Por cada 1000 habitantes

    # Generar el mapa coroplético
    fig = px.choropleth(
        df_d,
        locations='id',
        geojson=santafe_departamentos,
        color='medicos_por_habitantes',
        hover_name='DPTO',
        hover_data=['cantidad', 'poblacion', 'medicos_por_habitantes'],
        width=1000,
        height=1000,
        color_continuous_scale='Reds'
    )

    # Configuración adicional del mapa
    fig.update_geos(fitbounds="locations", visible=False)
    fig.update_layout(
        title_text='Cantidad de Médicos por cada 1000 Habitantes en Santa Fe',
        title_x=0.5,  # Centrar el título
        margin={"r": 0, "t": 50, "l": 0, "b": 0},  # Ajustar los márgenes
        coloraxis_colorbar_title_text="Médicos por 1000 Habitantes",
        coloraxis_colorbar_tickformat=".2f"  # Formato de los ticks en la barra de colores
    )
        # Mostrar el gráfico en una salida interactiva (para Django o Jupyter Notebook)
    plot_geo = plotly.offline.plot(fig, output_type='div')
   

    # Crear el gráfico de barras
    fig = px.bar(
        df_d,
        x='DPTO',
        y='medicos_por_habitantes',
        title='Cantidad de Médicos por cada 1000 Habitantes en Santa Fe',
        color_discrete_sequence=['#ff0000'] * len(df_d),  # Color rojo para todas las barras
        hover_data=['cantidad', 'poblacion']
    )

    # Configuración adicional del gráfico
    fig.update_layout(
        xaxis_title='Departamento',
        yaxis_title='Médicos por 1000 Habitantes',
        font_size=12,
        margin={"r": 0, "t": 50, "l": 0, "b": 0}  # Ajustar los márgenes
    )
    plot_cant = plotly.offline.plot(fig, output_type='div')

    #SUNBURST------------------------------------------------------------
        
    # Unificar las columnas de especialidades y contar por departamento
    especialidades = pd.concat([
        df[['DPTO', 'ESPECIALIDAD 1']].rename(columns={'ESPECIALIDAD 1': 'ESPECIALIDAD'}),
        df[['DPTO', 'ESPECIALIDAD 2']].rename(columns={'ESPECIALIDAD 2': 'ESPECIALIDAD'}),
        df[['DPTO', 'ESPECIALIDAD 3']].rename(columns={'ESPECIALIDAD 3': 'ESPECIALIDAD'}),
        df[['DPTO', 'ESPECIALIDAD 4']].rename(columns={'ESPECIALIDAD 4': 'ESPECIALIDAD'})
    ])

    # Filtrar filas donde 'ESPECIALIDAD' no sea nulo
    especialidades = especialidades.dropna(subset=['ESPECIALIDAD'])

    # Agrupar y contar especialidades por departamento
    especialistas_por_dpto = especialidades.groupby(['DPTO', 'ESPECIALIDAD']).size().reset_index(name='CANTIDAD')

    # Crear gráfico de sunburst
    fig = px.sunburst(especialistas_por_dpto, 
                      path=['DPTO', 'ESPECIALIDAD'], 
                      values='CANTIDAD',
                      title="Especialistas por Departamento",
                      width=1000,  # Ancho en píxeles
                      height=1000  # Alto en píxeles
                      )

    # Convertir el gráfico en un HTML div
    plot_sun = plotly.offline.plot(fig, output_type='div')

    #BUBBLE------------------------------------------------------------

    # Crear gráfico de burbujas
    fig = px.scatter(especialistas_por_dpto, 
                     x='DPTO', y='ESPECIALIDAD', 
                     size='CANTIDAD', color='DPTO', 
                     title="Cantidad de Especialistas por Departamento y Especialidad",
                     labels={'DPTO': 'Departamento', 'ESPECIALIDAD': 'Especialidad', 'CANTIDAD': 'Cantidad de Especialistas'},
                     hover_name='ESPECIALIDAD',
                     size_max=60,  # Tamaño máximo de las burbujas
                     width=1200, height=800
                    )
    plot_bubble = pyo.plot(fig, output_type='div')
    #tabla------------------------------------------------------------

   # Agrupar por departamento y especialidad y contar la cantidad de especialistas
    especialistas_por_dpto_esp = especialidades.groupby(['DPTO', 'ESPECIALIDAD']).size().reset_index(name='CANTIDAD')
    especialistas_por_dpto_esp = especialistas_por_dpto_esp.sort_values(by=['DPTO', 'CANTIDAD'], ascending=[True, False])


    # Crear la tabla con Plotly
    fig = go.Figure(
        data=[go.Table(
            header=dict(
                values=["Departamento", "Especialidad", "Cantidad de Especialistas"],
                fill_color='lightblue',
                align='left',
                font=dict(size=14, color='black')
            ),
            cells=dict(
                values=[
                   especialistas_por_dpto_esp['DPTO'],
                   especialistas_por_dpto_esp['ESPECIALIDAD'],
                   especialistas_por_dpto_esp['CANTIDAD']],
                fill_color='white',
                align='left',
                font=dict(size=12, color='black')
            )
        )]
    )

    # Título de la tabla
    fig.update_layout(title="Cantidad de Especialistas por Departamento y Especialidad",
                      height=1000,  # Altura de la tabla (ajústalo según tus necesidades)
                       width=1500    # Ancho de la tabla (ajústalo según tus necesidades)
    )
    plot_table = pyo.plot(fig, output_type='div')

    return render(request, "estadisticas/home.html", context={
        'total_medicos':total_medicos,
        'plot_sexo': plot_sexo,
        'plot_barras_sexo':plot_barras_sexo,
        'plot_edad': plot_edad,
        'plot_dpto': plot_dpto,
        'plot_dpto_esp': plot_dpto_esp,
        'plot_geo':plot_geo,
        'plot_cant':plot_cant,
        'plot_año_matricula':plot_año_matricula, 
        'plot_especialidad':plot_especialidad,
        'plot_df_especialidad_1':plot_df_especialidad_1,
        'plot_geo':plot_geo,
        'plot_sun':plot_sun,
        'plot_bubble':plot_bubble,
        'plot_table':plot_table,
        #'plot_graph':plot_graph

        })

class HomePageView(TemplateView):
    template_name = 'estadisticas/home.html'


