import requests
import pandas as pd
from io import BytesIO
from sqlalchemy import create_engine, text
import urllib
import time
import pyodbc

# Variables configurables
nombre_de_la_oja = "ScoreV2"
Nombre_tabla_excel = "ScoreV2"  # Nombre de referencia para la tabla en la hoja de Excel
nombre_de_la_tabla = "ScoreV2temp"
Nombre_tabla_history_base = "ScoreV2_History_1"
history_table_name = Nombre_tabla_history_base
#url = "https://igsa1-my.sharepoint.com/personal/alexis_moreno_igsa_com_mx/_layouts/15/download.aspx?share=EaDaHiKdC2RBuW1O_Ym6cEoBhn4a3oa6I3eX5p_LEGtnMA"
url = "https://igsa1-my.sharepoint.com/personal/alexis_moreno_igsa_com_mx/_layouts/15/download.aspx?share=EStyzV5jqTRGqhyxo4jfzmIBYCfPhbrU4xMICcpWqMSqiw"


# Configuración de conexión para eliminar la tabla
server = r'82.197.92.81'
database = 'TEST101'
username = 'sa'
password = 'C0ntr0l#2025'
driver = '{ODBC Driver 17 for SQL Server}'

# Función para eliminar la tabla con pyodbc
def eliminar_tabla(nombre_tabla):
    try:
        connection = pyodbc.connect(f'DRIVER={driver};SERVER={server};DATABASE={database};UID={username};PWD={password}')
        cursor = connection.cursor()
        
        cursor.execute(f"DROP TABLE IF EXISTS {nombre_tabla}")
        connection.commit()
        print(f"La tabla '{nombre_tabla}' ha sido eliminada exitosamente.")
        
    except pyodbc.Error as e:
        print("Error al intentar eliminar la tabla:", e)
        
    finally:
        if connection:
            cursor.close()
            connection.close()

# Descargar el archivo de Excel
response = requests.get(url)
if response.status_code == 200:
    file_content = BytesIO(response.content)

    # Validar que la hoja especificada existe en el archivo
    try:
        sheet_names = pd.ExcelFile(file_content).sheet_names
        
        if nombre_de_la_oja in sheet_names:
            ComTablero = pd.read_excel(file_content, sheet_name=nombre_de_la_oja)
            
            # Limpiar espacios en los nombres de las columnas
            ComTablero.columns = [col.strip().replace(" ", "_") for col in ComTablero.columns]
            
            df = ComTablero.fillna('')
            
            # Configuración de la cadena de conexión con SQLAlchemy
            params = urllib.parse.quote_plus(
                f"DRIVER={{ODBC Driver 17 for SQL Server}};"
                f"SERVER={server};"
                f"DATABASE={database};"
                f"UID={username};"
                f"PWD={password}"
            )
            engine = create_engine(f"mssql+pyodbc:///?odbc_connect={params}")

            # Verificar si la tabla `nombre_de_la_tabla` existe en la base de datos
            with engine.connect() as connection:
                result = connection.execute(
                    text(f"SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '{nombre_de_la_tabla}'")
                )
                table_exists = result.scalar() > 0

            if table_exists:
                with engine.connect() as connection:
                    result = connection.execute(
                        text(f"SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{nombre_de_la_tabla}'")
                    )
                    columnas_sql = [row[0] for row in result]
                
                # Comparar encabezados del archivo de Excel con las columnas de `nombre_de_la_tabla`
                columnas_excel = df.columns.tolist()
                if set(columnas_excel) != set(columnas_sql):
                    print("Los encabezados del archivo de Excel no coinciden con las columnas de la tabla. Procediendo a recrear las tablas.")

                    # Eliminar la tabla con pyodbc
                    eliminar_tabla(nombre_de_la_tabla)
                    time.sleep(1)  # Esperar un momento para que el cambio se refleje

                    # Crear `nombre_de_la_tabla` con los encabezados de Excel, todos en NVARCHAR(MAX)
                    columnas_sql_nuevas = ", ".join([f"[{col}] NVARCHAR(MAX)" for col in columnas_excel])
                    create_temp_table_query = f"CREATE TABLE {nombre_de_la_tabla} ({columnas_sql_nuevas})"
                    with engine.connect() as connection:
                        connection.execute(text(create_temp_table_query))
                    print(f"Tabla '{nombre_de_la_tabla}' creada con columnas de tipo NVARCHAR(MAX).")

                    # Crear la tabla de historial con los mismos encabezados y columnas adicionales en NVARCHAR(MAX)
                    history_table_name = Nombre_tabla_history_base + "_1"
                    print ("prueba1",history_table_name)
                    with engine.connect() as connection:
                        suffix = 1
                        while True:
                            result = connection.execute(
                                text(f"SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '{history_table_name}'")
                            )
                            if result.scalar() == 0:
                                break
                            suffix += 1
                            history_table_name = f"{Nombre_tabla_history_base}_{suffix}"

                    columnas_adicionales = """
                        [FechaCreacion] DATETIME DEFAULT GETDATE(),
                        [Auxiliar] VARCHAR(13) DEFAULT (CONVERT(VARCHAR(8), GETDATE(), 112) + '-' + CONVERT(VARCHAR(4), DATEPART(HH, GETDATE())) + CONVERT(VARCHAR(2), DATEPART(MI, GETDATE()))),
                        [ClavePrimaria] VARCHAR(23) DEFAULT (
                            CONVERT(VARCHAR(8), GETDATE(), 112) 
                            + '-' + CONVERT(VARCHAR(2), DATEPART(HH, GETDATE())) 
                            + CONVERT(VARCHAR(2), DATEPART(MI, GETDATE())) 
                            + CONVERT(VARCHAR(2), DATEPART(SS, GETDATE())) 
                            + CONVERT(VARCHAR(3), DATEPART(MS, GETDATE()))
                        )
                    """
                    create_history_table_query = f"CREATE TABLE {history_table_name} ({columnas_adicionales}, {columnas_sql_nuevas})"
                    
                    with engine.connect() as connection:
                        connection.execute(text(create_history_table_query))
                    
                    print(f"Tabla de historial '{history_table_name}' creada con columnas de tipo NVARCHAR(MAX).")

                    # Insertar los datos en ambas tablas
                    try:
                        df.to_sql(nombre_de_la_tabla, con=engine, if_exists='append', index=False)
                        print(f"Datos insertados correctamente en la tabla {nombre_de_la_tabla}.")
                    except Exception as e:
                        print("Ocurrió un error al insertar los datos en la tabla temporal:", e)

                    try:
                        df.to_sql(history_table_name, con=engine, if_exists='append', index=False)
                        print(f"Datos insertados correctamente en la tabla de historial {history_table_name}.")
                    except Exception as e:
                        print(f"Ocurrió un error al insertar los datos en la tabla de historial {history_table_name}:", e)

                else:
                    # Si los encabezados coinciden, guardar en ambas tablas sin recrearlas
                    try:
                        df.to_sql(nombre_de_la_tabla, con=engine, if_exists='append', index=False)
                        print(f"Datos insertados correctamente en la tabla {nombre_de_la_tabla}.")
                    except Exception as e:
                        print("Ocurrió un error al insertar los datos en la tabla temporal:", e)

                    try:
                        df.to_sql(history_table_name, con=engine, if_exists='append', index=False)
                        print(f"Datos insertados correctamente en la tabla de historial {history_table_name}.")
                    except Exception as e:
                        print(f"Ocurrió un error al insertar los datos en la tabla de historial {history_table_name}:", e)
            else:
                print(f"La tabla '{nombre_de_la_tabla}' no existe en la base de datos.")
        else:
            print(f"La hoja '{nombre_de_la_oja}' no se encuentra en el archivo de Excel. Hojas disponibles: {sheet_names}")
    except Exception as e:
        print("Error al procesar el archivo de Excel:", e)
else:
    print("Error al descargar el archivo, código de estado:", response.status_code)
