import pandas as pd
from io import BytesIO
import asyncio
from conexion_db.conexion import get_connection, execute, queries

async def crear_excel_de_json(rows: list[dict]) -> BytesIO:
    """
    Convierte una lista de diccionarios en un archivo Excel en memoria.
    - Las llaves del primer objeto definen el orden de columnas (si hay más llaves en otros objetos, también se incluyen).
    - Devuelve un buffer BytesIO listo para usarse en una respuesta.
    """

    def _sync_task():
        if not rows:
            df = pd.DataFrame()
        else:
            df = pd.DataFrame(rows)

        output = BytesIO()
        with pd.ExcelWriter(output, engine="openpyxl") as writer:
            df.to_excel(writer, index=False, sheet_name="data")

            # Ajuste básico de ancho de columnas
            ws = writer.sheets["data"]
            for col_idx, column in enumerate(df.columns, start=1):
                max_len = max(
                    [len(str(column))] + [len(str(x)) for x in df[column].astype(str).values]
                )
                ws.column_dimensions[ws.cell(row=1, column=col_idx).column_letter].width = min(max_len + 2, 50)

        output.seek(0)
        return output

    return await asyncio.to_thread(_sync_task)

async def tabla_a_excel_prospectos() -> BytesIO:
    """
    Genera un archivo Excel con los datos de una tabla de la base de datos.
    - Devuelve un buffer BytesIO listo para usarse en una respuesta.
    """
    sql = f"SELECT * FROM prospectos_manual"
    rows = await queries(sql)
    return await crear_excel_de_json(rows) # Éxito, salimos del bucle de reintento