import os
import logging
import pymysql
from dotenv import load_dotenv
from google.oauth2.service_account import Credentials
import gspread
from datetime import datetime
import re

# --------------------------------------------------
# CONFIGURACIÓN
# --------------------------------------------------

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s"
)

load_dotenv()

DB_CONFIG = {
    "host": os.getenv("DB_HOST"),
    "user": os.getenv("DB_USER"),
    "password": os.getenv("DB_PASSWORD"),
    "database": os.getenv("DB_NAME"),
    "cursorclass": pymysql.cursors.DictCursor,
}

ID_PROYECTO_GSHEET = 31
SPREADSHEET_ID = "1lKqTLewXKMg1eNTEfb_rv6sU5ThVHWIGnWK8psVBgkk"
SHEET_NAME = "P_nunoa"
SERVICE_ACCOUNT_PATH = "/home/andrespa/metra.conilead.com/Apikey/service-account.json"

# --------------------------------------------------
# FUNCIONES AUXILIARES
# --------------------------------------------------

def parse_programa(programa):
    if not programa:
        return None, None

    dormitorios = None
    banos = None

    match_dorm = re.search(r"(\d+)", programa)
    match_bano = re.search(r"(\d+)\s*ba", programa.lower())

    if match_dorm:
        dormitorios = int(match_dorm.group(1))

    if match_bano:
        banos = int(match_bano.group(1))

    return dormitorios, banos


def parse_superficie(detalle):
    if not detalle:
        return None, None

    interior = None
    terraza = None

    interior_match = re.search(r"Interior\s([\d,\.]+)", detalle)
    terraza_match = re.search(r"Terraza\s([\d,\.]+)", detalle)

    if interior_match:
        interior = float(interior_match.group(1).replace(",", "."))

    if terraza_match:
        terraza = float(terraza_match.group(1).replace(",", "."))

    return interior, terraza


# --------------------------------------------------
# PASO 1 — IMPORTAR A DATOS_GSHEETS
# --------------------------------------------------

def importar_desde_google_sheets():

    logging.info("Conectando a Google Sheets...")

    scope = ["https://www.googleapis.com/auth/spreadsheets.readonly"]
    creds = Credentials.from_service_account_file(
        SERVICE_ACCOUNT_PATH,
        scopes=scope,
    )

    client = gspread.authorize(creds)
    spreadsheet = client.open_by_key(SPREADSHEET_ID)
    sheet = spreadsheet.worksheet(SHEET_NAME)

    rows = sheet.get_all_records()

    connection = pymysql.connect(**DB_CONFIG)

    with connection:
        with connection.cursor() as cursor:

            # Limpia staging solo de este proyecto
            cursor.execute(
                "DELETE FROM Datos_gsheets WHERE id_proyecto = %s",
                (ID_PROYECTO_GSHEET,)
            )

            logging.info("Staging limpiado.")

            for row in rows:
                try:
                    precio_raw = str(row.get("Precio", "")).strip()
                    superficie_raw = str(row.get("Superficie total", "")).replace(" m²", "").replace(",", ".").strip()

                    precio = float(precio_raw.replace(",", "")) if precio_raw else None
                    superficie_total = float(superficie_raw) if superficie_raw else None

                    cursor.execute("""
                        INSERT INTO Datos_gsheets (
                            id_proyecto,
                            proyecto,
                            programa,
                            modelo,
                            precio,
                            superficie_total,
                            detalle_superficie,
                            descripcion_modelo,
                            link_fotos_videos
                        )
                        VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)
                    """, (
                        ID_PROYECTO_GSHEET,
                        row.get("Proyecto"),
                        row.get("Programa"),
                        row.get("Modelo"),
                        precio,
                        superficie_total,
                        row.get("Detalle superficie"),
                        row.get("Descripción del modelo"),
                        row.get("Link fotos o videos")
                    ))

                except Exception as e:
                    logging.warning(f"Fila ignorada por error: {row} | Error: {e}")

        connection.commit()

    logging.info("Importación a Datos_gsheets completada.")


# --------------------------------------------------
# PASO 2 — HOMOLOGAR A MODELOS / PRODUCTOS
# --------------------------------------------------

def procesar_datos_gsheets():

    logging.info("Iniciando homologación...")

    connection = pymysql.connect(**DB_CONFIG)

    with connection:
        with connection.cursor() as cursor:

            cursor.execute("""
                SELECT * FROM Datos_gsheets
                WHERE id_proyecto = %s
            """, (ID_PROYECTO_GSHEET,))

            rows = cursor.fetchall()

            for row in rows:
                try:
                    dormitorios, banos = parse_programa(row["programa"])
                    interior, terraza = parse_superficie(row["detalle_superficie"])

                    # UPSERT MODELOS
                    cursor.execute("""
                        INSERT INTO Modelos
                        (id_proyecto, nombre, dormitorios, banos,
                         precioDesde, fechaCreacion, fechaEdicion)
                        VALUES (%s,%s,%s,%s,%s,NOW(),NOW())
                        ON DUPLICATE KEY UPDATE
                            dormitorios = VALUES(dormitorios),
                            banos = VALUES(banos),
                            precioDesde = VALUES(precioDesde),
                            fechaEdicion = NOW()
                    """, (
                        ID_PROYECTO_GSHEET,
                        row["modelo"],
                        dormitorios,
                        banos,
                        row["precio"]
                    ))

                    # UPSERT PRODUCTOS
                    cursor.execute("""
                        INSERT INTO Productos
                        (id_proyecto, nombre, nombreProyecto, nombreModelo,
                         precio, superficies_total, superficies_interior,
                         superficies_terraza, comentario,
                         cantDormitorios, cantBanos, programa,
                         disponibleWeb, disponibleSistema, estado,
                         fechaCreacion, fechaEdicion)
                        VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,
                                1,1,'Disponible',NOW(),NOW())
                        ON DUPLICATE KEY UPDATE
                            precio = VALUES(precio),
                            superficies_total = VALUES(superficies_total),
                            superficies_interior = VALUES(superficies_interior),
                            superficies_terraza = VALUES(superficies_terraza),
                            comentario = VALUES(comentario),
                            fechaEdicion = NOW()
                    """, (
                        ID_PROYECTO_GSHEET,
                        row["modelo"],
                        row["proyecto"],
                        row["modelo"],
                        row["precio"],
                        row["superficie_total"],
                        interior,
                        terraza,
                        row["descripcion_modelo"],
                        dormitorios,
                        banos,
                        row["programa"]
                    ))

                except Exception as e:
                    logging.error(f"Error homologando modelo {row.get('modelo')}: {e}")

        connection.commit()

    logging.info("Homologación completada.")

def asegurar_producto_por_modelo():
    logging.info("Verificando que cada modelo tenga al menos un producto...")

    connection = pymysql.connect(**DB_CONFIG)

    with connection:
        with connection.cursor() as cursor:

            cursor.execute("""
                SELECT id_proyecto, nombre
                FROM Modelos
                WHERE id_proyecto = %s
            """, (ID_PROYECTO_GSHEET,))

            modelos = cursor.fetchall()

            for modelo in modelos:
                cursor.execute("""
                    SELECT COUNT(*) as total
                    FROM Productos
                    WHERE id_proyecto = %s AND nombre = %s
                """, (modelo["id_proyecto"], modelo["nombre"]))

                count = cursor.fetchone()["total"]

                if count == 0:
                    logging.warning(f"Creando producto faltante para modelo {modelo['nombre']}")

                    cursor.execute("""
                        INSERT INTO Productos
                        (id_proyecto, nombre, nombreProyecto, nombreModelo,
                         disponibleWeb, disponibleSistema, estado,
                         fechaCreacion, fechaEdicion)
                        VALUES (%s,%s,%s,%s,1,1,'Disponible',NOW(),NOW())
                    """, (
                        modelo["id_proyecto"],
                        modelo["nombre"],
                        "Ñuñoa View",
                        modelo["nombre"]
                    ))

        connection.commit()

    logging.info("Verificación completada.")

# --------------------------------------------------
# MAIN
# --------------------------------------------------

def main():
    importar_desde_google_sheets()
    procesar_datos_gsheets()
    asegurar_producto_por_modelo()



if __name__ == "__main__":
    main()
