import streamlit as st
import pandas as pd
import plotly.express as px

# Configuración de la página
st.set_page_config(page_title="Dashboard de Despacho y Backlog", layout="wide")

st.title("📊 Dashboard de Técnicos por Compañía y Tipo de Trabajo")
st.markdown("Procesamiento con cálculo de moda y prioridades personalizables mediante pestañas.")

# Carga de archivo
uploaded_file = st.file_uploader("Cargar Base de Datos (.xlsx)", type=["xlsx", "xls"])

if uploaded_file is not None:
    try:
        df = pd.read_excel(uploaded_file, engine='openpyxl')
        df.columns = df.columns.str.strip()
        
        # --- CONFIGURACIÓN DE COLUMNAS ---
        col_compania = 'Compañia'                       
        col_subtipo = 'Subtipo de la Orden de Trabajo'  
        col_tecnico_id = 'External ID'                  
        col_tecnico_nombre = 'Técnico'  
        
        columnas_req = [col_compania, col_subtipo, col_tecnico_id, col_tecnico_nombre]
        faltantes = [c for c in columnas_req if c not in df.columns]
        if faltantes:
            st.error(f"Faltan estas columnas en el archivo para aplicar las nuevas reglas: {', '.join(faltantes)}")
            st.stop()

        # --- DICCIONARIOS Y LISTAS ---
        company_map = {
            "CICSA COLOMBIA S.A.": "Tabasco OC",
            "TABASCO OC, LLC. SUCURSAL COLOMBIA": "Tabasco OC",
            "CONECTAR TV S.A.S.": "Conectar TV"
        }
        
        lista_exclusion = [
            "ARRBUGA1", "ARRCALA1", "ARRCANA1", "ARRCCMA1", "ARRCEA1", "ARRCHKA1",
            "ARREFTTH", "ARRESPA1", "ARRFLEA1", "ARRFLRA1", "ARRIBAA1", "ARRMELA1",
            "ARRPAA1", "ARRPRA1", "ARRTULA1", "ARRYUA1", "BGFTINS", "BGFTMT",
            "BGFTTR", "CALCICPV", "DCC009", "DCE052", "DCE057", "DCE064", "DCE074",
            "DCE076", "DCE90", "DCE9111", "Delta 03", "DICOPASTO", "DOC020",
            "DOC023", "DOC033", "DOC035", "DOC039", "DOC045", "DOC047", "DOC091",
            "DOC096", "DOC097", "DOC0971", "DOC0981", "DOC100", "DOC101", "DOC102",
            "DOC103", "DOC104", "DOC107", "DOC108", "DOC109", "DOC110", "DOF033",
            "DOF065", "DOF204", "DOS012", "DOS063", "DOS072", "DR10", "DR11",
            "DR12", "DR13", "DR17", "DTN223", "DTN298", "DTN551", "DTN576",
            "DTN577", "DTO573", "DTO574", "DTY001", "DXRXBUGA1", "DXRXCA1",
            "DXRXCANA1", "DXRXCCMA1", "DXRXCEA1", "DXRXCHKA1", "DXRXESPA1",
            "DXRXFLEA1", "DXRXFLRA1", "DXRXIBAA1", "DXRXMELA1", "DXRXPAA1",
            "DXRXPRA1", "DXRXTULA1", "DXRXYUA1", "DXYRX1", "FHPY1", "FTHIPI",
            "FTTH001", "FTTHANDA1", "FTTHBUGA1", "FTTHCA1", "FTTHCAIA1",
            "FTTHCANA1", "FTTHCCMNA1", "FTTHCEA1", "FTTHCGOA1", "FTTHCHKNA1",
            "ftthCI49", "FTTHESPNA1", "FTTHFLENA1", "FTTHFLRA1", "FTTHGUOA1",
            "FTTHIBANA1", "FTTHMELNA1", "FTTHPAA1", "FTTHPRA1", "FTTHPT1",
            "FTTHROLA1", "FTTHSEVA1", "FTTHTULNA1", "FTTHUNIA1", "FTTHYUA1",
            "FTTHZRZA1", "FTTXCAL1", "FTTXIBA1", "FTTXPAS1", "FTTXPOP1",
            "GAR001", "Instalaciones y Traslados", "INSTFTHJA", "INSTFTTH",
            "INSTRBUGA1", "INSTRCA1", "INSTRCANA1", "INSTRCCMA1", "INSTRCEA1",
            "INSTRCHKA1", "INSTRESPA1", "INSTRFLEA1", "INSTRFLRA1", "INSTRIBAA1",
            "INSTRMELA1", "INSTRPAA1", "INSTRPRA1", "INSTRTULA1", "INSTRYUA1",
            "INYT1", "IYT1", "M23989", "Mantenimiento1", "Mantenimiento2",
            "MANY2", "MASVCH", "ME_TELCOS_ANTIOQUIA_1", "MPP1", "MTOFTHJA",
            "P23990", "Pitalito1", "POS1917", "PVSBUGA1", "PVSCA1", "PVSCANA1",
            "PVSCCMA1", "PVSCEA1", "PVSCHKA1", "PVSESPA1", "PVSFLEA1", "PVSFLRA1",
            "PVSIBAA1", "PVSMELA1", "PVSPAA1", "PVSPRA1", "PVSTULA1", "PVSYUA1",
            "PYM709", "PYMCI09", "PYMCI10", "PYMCI20", "PYMCI23", "PYMCI37",
            "PYMCI50", "REO339", "Z2Cal", "Z2FTTX", "Z2INSTPY", "Z2MTTOPY",
            "Z3LY", "ZA1AND001", "ZA1BUG001", "ZA1CAI001", "ZA1CAL01", "ZA1CAN001",
            "ZA1CCM001", "ZA1CE001", "ZA1CGO001", "ZA1CHK001", "ZA1ESP001",
            "ZA1FLE001", "ZA1FLR001", "ZA1GUO001", "ZA1IBA001", "ZA1MEL001",
            "ZA1PA001", "ZA1PR001", "ZA1ROL001", "ZA1SEV001", "ZA1TUL001",
            "ZA1UNI001", "ZA1Y001", "ZA1ZRZ001", "DOC019"
        ]

        mapping_subtipo = {
            "Almuerzo": "No es Tipo Trabajo",
            "Otros": "No es Tipo Trabajo",
            "Arreglos": "Arreglos HFC",
            "Actividades de Almacen": "No es Tipo Trabajo",
            "Orden Especial Masivo FTTH": "Instalaciones FTTH",
            "Postventa FTTX": "Arreglos y Pvs FTTH",
            "Traslado Pymes": "Instalaciones HFC",
            "Cambio Tecnologia TV": "Posventa HFC",
            "Capacitacion": "No es Tipo Trabajo",
            "Llegada Tarde": "No es Tipo Trabajo",
            "VENTAS TECNICO": "Posventa HFC",
            "Vehiculo con Fallas": "No es Tipo Trabajo",
            "Recursos Humanos": "No es Tipo Trabajo",
            "Encuesta Técnicos": "No es Tipo Trabajo",
            "Permiso": "No es Tipo Trabajo",
            "Actualización de datos": "No es Tipo Trabajo",
            "ENTREGA DE SERVICIOS FO": "Instalaciones FTTH",
            "Orden Especial": "Instalaciones FTTH",
            "Arreglo Bidireccional": "Arreglos HFC",
            "Arreglo Pymes": "Arreglos HFC",
            "Instalacion Empaquetada Bi": "Instalaciones HFC",
            "PostVenta Bi": "Posventa HFC",
            "Blindaje": "Posventa HFC",
            "Instalacion Basica Bi": "Instalaciones HFC",
            "Instalacion FTTH_": "Instalaciones FTTH",
            "Mantenimiento FTTH": "Arreglos y Pvs FTTH",
            "Visita Mejoramiento": "Arreglos HFC",
            "Desconexiones x Carta Movimiento Bi": "Desconexiones",
            "Postventa FTTH": "Arreglos y Pvs FTTH",
            "BROWNFIELD": "Brownfield",
            "Traslado FTTH": "Instalaciones FTTH",
            "Brownfield Flash": "Brownfield",
            "Instalacion FWA": "Instalaciones FTTH",
            "Traslado Bi": "Instalaciones HFC",
            "Instalacion Cableada Bi": "Instalaciones HFC",
            "Arreglos FTTX": "Arreglos y Pvs FTTH",
            "Instalacion Pymes": "Instalaciones HFC",
            "Instalaciones FTTX": "Instalaciones FTTH",
            "Traslados FTTX": "Instalaciones FTTH",
            "Mantenimiento FWA": "Arreglos y Pvs FTTH",
            "Postventa Pymes": "Posventa HFC",
            "Brownfield Pymes": "Brownfield",
            "Reconexion Bi": "No es Tipo Trabajo",
            "Ventas Tecnico FTTH": "Arreglos y Pvs FTTH",
            "Desconexion x Servicio Bi": "Desconexiones",
            "Ventas Tecnico BI": "Posventa HFC",
            "Traslado Mintic FTTH": "Instalaciones FTTH",
            "Traslados MINTIC": "Instalaciones HFC",
            "Orden Especial Masivo HFC": "Posventa HFC",
            "Cambio de equipos FWA": "Arreglos y Pvs FTTH",
            "Blindaje Pymes": "Posventa HFC",
            "FO Visita Tecnica VOC": "No es Tipo Trabajo",
            "Orden Especial Pymes HFC": "Instalaciones HFC",
            "Arreglo Especial Masivo FTTH": "Arreglos y Pvs FTTH",
            "Orden Especial Migracion Corporativo": "Brownfield",
            "Orden Especial Pymes FTTX": "Instalaciones FTTH",
            "Mantenimientos Alto Valor": "Arreglos HFC"
        }

        # --- LIMPIEZA INICIAL ---
        df['Compañía_Homologada'] = df[col_compania].astype(str).str.strip().map(company_map)
        df_base = df.dropna(subset=['Compañía_Homologada']).copy()
        
        # Filtrar nombres de Técnicos excluidos
        df_base = df_base[~df_base[col_tecnico_nombre].astype(str).str.strip().isin(lista_exclusion)]
        
        # Mapeo de Subtipo a Trabajo Final
        df_base['Subtipo_Limpio'] = df_base[col_subtipo].astype(str).str.strip()
        df_base['Trabajo Final'] = df_base['Subtipo_Limpio'].map(mapping_subtipo).fillna("No es Tipo Trabajo")
        
        # Excluir los "No es Tipo Trabajo"
        df_base = df_base[df_base['Trabajo Final'] != "No es Tipo Trabajo"]
        
        # Validar ID numérico
        df_base = df_base.dropna(subset=[col_tecnico_id])
        df_base['ID_Limpio'] = df_base[col_tecnico_id].astype(str).str.replace(r'\.0$', '', regex=True).str.strip()
        df_base = df_base[df_base['ID_Limpio'].str.match(r'^\d+$') == True]
        df_base[col_tecnico_id] = df_base['ID_Limpio']

        # --- FILTRO COMPAÑÍA GLOBAL (Para ambas pestañas) ---
        list_companias = ["Todas"] + sorted(df_base['Compañía_Homologada'].unique().tolist())
        compania_sel = st.sidebar.selectbox("Seleccionar Compañía", list_companias)

        # Frecuencia Base (La moda: Cuántas tareas de cada tipo hizo cada técnico)
        freq_base = df_base.groupby([col_tecnico_id, 'Compañía_Homologada', 'Trabajo Final']).size().reset_index(name='conteo')

        # =====================================================================
        # --- CREACIÓN DE PESTAÑAS ---
        # =====================================================================
        tab1, tab2 = st.tabs(["📊 Dashboard Original", "🚀 Dashboard Prioridad Brownfield"])

        # -----------------------------------------------------------
        # PESTAÑA 1: REGLA ORIGINAL (Prioridad a Instalaciones FTTH/HFC)
        # -----------------------------------------------------------
        with tab1:
            st.subheader("Regla Original: Prioridad en Instalaciones")
            jerarquia_inst_t1 = {
                "Instalaciones FTTH": 3000000,
                "Instalaciones HFC": 2000000,
                "Brownfield": 1000000
            }
            
            freq_t1 = freq_base.copy()
            freq_t1['Score'] = freq_t1.apply(lambda r: r['conteo'] + jerarquia_inst_t1.get(r['Trabajo Final'], 0), axis=1)
            freq_t1 = freq_t1.sort_values(by=[col_tecnico_id, 'Score'], ascending=[True, False])
            df_unicos_t1 = freq_t1.drop_duplicates(subset=[col_tecnico_id], keep='first').copy()

            if compania_sel != "Todas":
                df_unicos_t1 = df_unicos_t1[df_unicos_t1['Compañía_Homologada'] == compania_sel]
            
            # Métricas
            total_hfc_t1 = df_unicos_t1[df_unicos_t1['Trabajo Final'] == "Instalaciones HFC"].shape[0]
            cant_ftth_t1 = df_unicos_t1[df_unicos_t1['Trabajo Final'] == "Instalaciones FTTH"].shape[0]
            cant_brownfield_t1 = df_unicos_t1[df_unicos_t1['Trabajo Final'] == "Brownfield"].shape[0]
            total_ftth_formula_t1 = (cant_ftth_t1 + cant_brownfield_t1) * 0.63

            # Tarjetas Tab 1 (Con ".0f" para quitar decimales)
            c1, c2, c3 = st.columns(3)
            with c1: st.metric("Total Instalaciones HFC", f"{total_hfc_t1}")
            with c2: st.metric("Instalaciones FTTH (Ponderado)", f"{total_ftth_formula_t1:.0f}")
            with c3: st.metric("Total Técnicos Únicos Activos", df_unicos_t1.shape[0])

            # Gráfica Tab 1
            resumen_t1 = df_unicos_t1.groupby(['Trabajo Final'])[col_tecnico_id].count().reset_index()
            resumen_t1.rename(columns={col_tecnico_id: 'Cantidad de Técnicos'}, inplace=True)
            
            if not resumen_t1.empty:
                resumen_t1 = resumen_t1.sort_values(by='Cantidad de Técnicos', ascending=False)
                fig1 = px.bar(
                    resumen_t1, x='Trabajo Final', y='Cantidad de Técnicos',
                    text_auto=True, title=f"Distribución (Original) - {compania_sel}", color='Trabajo Final'
                )
                fig1.update_layout(xaxis_tickangle=-45)
                st.plotly_chart(fig1, use_container_width=True)
            else:
                st.info("No hay datos para mostrar.")

        # -----------------------------------------------------------
        # PESTAÑA 2: NUEVA REGLA (Prioridad #1 Brownfield, #2 Instalaciones)
        # -----------------------------------------------------------
        with tab2:
            st.subheader("Nueva Regla: Prioridad #1 Brownfield, #2 Instalaciones")
            jerarquia_inst_t2 = {
                "Brownfield": 3000000,          # Máxima prioridad absoluta
                "Instalaciones FTTH": 2500000,  # Segunda prioridad
                "Instalaciones HFC": 2000000    # Tercera prioridad
            }
            
            freq_t2 = freq_base.copy()
            # Al sumar la moda con este boost, si el técnico tiene 1 Brownfield gana seguro.
            freq_t2['Score'] = freq_t2.apply(lambda r: r['conteo'] + jerarquia_inst_t2.get(r['Trabajo Final'], 0), axis=1)
            freq_t2 = freq_t2.sort_values(by=[col_tecnico_id, 'Score'], ascending=[True, False])
            df_unicos_t2 = freq_t2.drop_duplicates(subset=[col_tecnico_id], keep='first').copy()

            if compania_sel != "Todas":
                df_unicos_t2 = df_unicos_t2[df_unicos_t2['Compañía_Homologada'] == compania_sel]
            
            # Métricas
            total_hfc_t2 = df_unicos_t2[df_unicos_t2['Trabajo Final'] == "Instalaciones HFC"].shape[0]
            cant_ftth_t2 = df_unicos_t2[df_unicos_t2['Trabajo Final'] == "Instalaciones FTTH"].shape[0]
            cant_brownfield_t2 = df_unicos_t2[df_unicos_t2['Trabajo Final'] == "Brownfield"].shape[0]
            total_ftth_formula_t2 = (cant_ftth_t2 + cant_brownfield_t2) * 0.63

            # Tarjetas Tab 2 (Con ".0f" para quitar decimales)
            c4, c5, c6 = st.columns(3)
            with c4: st.metric("Total Instalaciones HFC", f"{total_hfc_t2}")
            with c5: st.metric("Instalaciones FTTH (Ponderado)", f"{total_ftth_formula_t2:.0f}")
            with c6: st.metric("Total Técnicos Únicos Activos", df_unicos_t2.shape[0])

            # Gráfica Tab 2
            resumen_t2 = df_unicos_t2.groupby(['Trabajo Final'])[col_tecnico_id].count().reset_index()
            resumen_t2.rename(columns={col_tecnico_id: 'Cantidad de Técnicos'}, inplace=True)
            
            if not resumen_t2.empty:
                resumen_t2 = resumen_t2.sort_values(by='Cantidad de Técnicos', ascending=False)
                fig2 = px.bar(
                    resumen_t2, x='Trabajo Final', y='Cantidad de Técnicos',
                    text_auto=True, title=f"Distribución (Nueva Prioridad) - {compania_sel}", color='Trabajo Final',
                    color_discrete_sequence=px.colors.qualitative.Pastel
                )
                fig2.update_layout(xaxis_tickangle=-45)
                st.plotly_chart(fig2, use_container_width=True)
            else:
                st.info("No hay datos para mostrar.")

    except Exception as e:
        st.error(f"Error procesando el archivo: {e}")
        #ejecutar desde la raiz streamlit run app.py