import requests
import pandas as pd
from io import BytesIO
import pyodbc

# Variables configurables
nombre_de_la_oja = "Comunicación"
nombre_de_la_tabla = "TableroV2temp"
Nombre_tabla_history_base = "TableroV2_History_1"
url = "https://igsa1-my.sharepoint.com/personal/alexis_moreno_igsa_com_mx/_layouts/15/download.aspx?share=EQpmUvpF52lLn-MRhjlEoX0BQJ10sT_4VUiWG_5ZnDEsVw"

# Configuración de conexión para eliminar y crear 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()

# Función para crear la tabla con pyodbc
def crear_tabla(nombre_tabla, columnas_sql):
    try:
        connection = pyodbc.connect(f'DRIVER={driver};SERVER={server};DATABASE={database};UID={username};PWD={password}')
        cursor = connection.cursor()
        
        create_table_query = f"CREATE TABLE {nombre_tabla} ({columnas_sql})"
        cursor.execute(create_table_query)
        connection.commit()
        print(f"Tabla '{nombre_tabla}' creada con todas las columnas de tipo NVARCHAR(MAX).")
        
    except pyodbc.Error as e:
        print(f"Error al crear la tabla '{nombre_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]
            
            # Convertir todas las columnas a tipo string para forzar NVARCHAR(MAX)
            df = ComTablero.astype(str).fillna('')
            
            # Preparar la estructura de columnas para SQL
            columnas_sql_nuevas = ", ".join([f"[{col}] NVARCHAR(MAX)" for col in df.columns])

            # Eliminar la tabla si ya existe
            eliminar_tabla(nombre_de_la_tabla)

            # Crear la tabla usando pyodbc
            crear_tabla(nombre_de_la_tabla, columnas_sql_nuevas)

            # Verificar si la tabla se ha creado exitosamente
            try:
                connection = pyodbc.connect(f'DRIVER={driver};SERVER={server};DATABASE={database};UID={username};PWD={password}')
                cursor = connection.cursor()
                result = cursor.execute(f"SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '{nombre_de_la_tabla}'")
                if result.fetchone()[0] == 1:
                    print(f"La tabla '{nombre_de_la_tabla}' se ha verificado y existe en la base de datos.")
                else:
                    print(f"Error: La tabla '{nombre_de_la_tabla}' no se creó correctamente.")
            except pyodbc.Error as e:
                print("Error al verificar la creación de la tabla:", e)
            finally:
                if connection:
                    cursor.close()
                    connection.close()

            # Insertar los datos en la tabla si se creó correctamente
            try:
                connection = pyodbc.connect(f'DRIVER={driver};SERVER={server};DATABASE={database};UID={username};PWD={password}')
                cursor = connection.cursor()
                for index, row in df.iterrows():
                    placeholders = ", ".join(["?" for _ in row])
                    insert_query = f"INSERT INTO {nombre_de_la_tabla} VALUES ({placeholders})"
                    cursor.execute(insert_query, *row)
                connection.commit()
                print(f"Datos insertados correctamente en la tabla {nombre_de_la_tabla}.")
            except pyodbc.Error as e:
                print("Ocurrió un error al insertar los datos en la tabla:", e)
            finally:
                if connection:
                    cursor.close()
                    connection.close()
                
        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)
