
import psycopg2
from config.settings import POSTGRESQL_DB_CONFIG
from fudo.fudo import get_product, get_products, get_category
from models.items import Product
from rich import print
indexed_products = {}

for x in range(1,6):
    products = get_products(x)
    for product in products:
        indexed_products[str(product["id"])] = product
print(len(indexed_products))


def update_prices():
    conn = psycopg2.connect(
        dbname=POSTGRESQL_DB_CONFIG['dbname'],
        user=POSTGRESQL_DB_CONFIG['user'],
        password=POSTGRESQL_DB_CONFIG['password'],
        host=POSTGRESQL_DB_CONFIG['host'],
        port=POSTGRESQL_DB_CONFIG['port']
    )
    # Obtengo todos los productos de la base de datos
    cursor = conn.cursor()
    cursor.execute("SELECT id FROM products")
    products = cursor.fetchall()
    # Recorro cada producto y actualizo su precio
    for product in products:
        id = product[0]
        print(f"Actualizando el precio de {id}")
        f_product = indexed_products.get(str(id))
        
        cursor.execute("UPDATE products SET price = %s WHERE id = %s", (f_product["attributes"]["price"], id))
        conn.commit()
        print(f"Actualizado el precio de {f_product['attributes']['name']} a {f_product['attributes']['price']}")
        
def add_missing_products():
    """
    Verifica qué productos de 'indexed_products' no existen en la DB local
    y los inserta respetando los tipos de datos.
    """
    conn = psycopg2.connect(
        dbname=POSTGRESQL_DB_CONFIG['dbname'],
        user=POSTGRESQL_DB_CONFIG['user'],
        password=POSTGRESQL_DB_CONFIG['password'],
        host=POSTGRESQL_DB_CONFIG['host'],
        port=POSTGRESQL_DB_CONFIG['port']
    )
    cursor = conn.cursor()

    # 1. Obtenemos solo los IDs que ya existen para no consultar uno por uno (Eficiencia, mi señor)
    cursor.execute("SELECT id FROM products")
    existing_ids = {row[0] for row in cursor.fetchall()}
    
    products_added = 0

    print(f"[bold cyan]Iniciando sincronización de nuevos productos...[/bold cyan]")

    for fudo_id_str, product_data in indexed_products.items():
        fudo_id = int(fudo_id_str)
        
        # Si el ID no está en nuestra lista de existentes, procedemos a insertar
        if fudo_id not in existing_ids and product_data["attributes"]["active"] and product_data["attributes"]["enableQrMenu"]:
            attrs = product_data["attributes"]
            
            # --- Mapeo y Limpieza de Datos ---
            # Nombre
            p_name = attrs.get("name", "Sin Nombre")
            
            # Tipo (Usamos el del JSON root o un default)
            p_type = get_category(int(product_data["relationships"]["productCategory"]["data"]["id"]))["name"] or "Producto"
            print(f"[yellow]Tipo del producto: {p_type}[/yellow]")
            # Descripción (La DB no permite Null, así que enviamos string vacío si no hay)
            p_desc = attrs.get("description") or "" 
            
            # Precio (La DB es Integer, Fudo es Float. Convertimos a int)
            p_price = int(attrs.get("price", 0))
            
            # Imagen
            p_image = "https://fudo-apps-storage.s3.sa-east-1.amazonaws.com/production/113378/common/products/"+ fudo_id_str
            
            # Status (Fudo usa booleano, DB usa 1/0. Mapeamos: True->1, False->0)
            p_status = 1 if attrs.get("active") else 0

            try:
                query = """
                    INSERT INTO products 
                    (id, name, type, description, price, image, status)
                    VALUES (%s, %s, %s, %s, %s, %s, %s)
                """
                cursor.execute(query, (
                    fudo_id, 
                    p_name, 
                    p_type, 
                    p_desc, 
                    p_price, 
                    p_image, 
                    p_status
                ))
                print(f"[green]Insertado nuevo producto:[/green] {p_name} (ID: {fudo_id})")
                products_added += 1
                
            except Exception as e:
                print(f"[red]Error al insertar {p_name}:[/red] {e}")
                conn.rollback() # Revertimos si falla este específico para no romper el lote
                continue

    conn.commit()
    cursor.close()
    conn.close()
    
    print(f"[bold yellow]Proceso finalizado. Se agregaron {products_added} productos nuevos.[/bold yellow]")

if __name__ == "__main__":
    # Primero agregamos los que faltan
    add_missing_products()
    # Luego actualizamos precios (su función original)
    update_prices()