import os
import json
import pymysql
import logging
import re
from logging.handlers import RotatingFileHandler
from flask import Blueprint, request, jsonify, abort
from datetime import datetime, timezone
from dotenv import load_dotenv

# Importamos las funciones de interaccion_planok
from interaccion_planok import (
    crear_cliente_natural,
    buscar_cliente_natural,
    crear_seguimiento,
    obtener_id_medio_llegada,
    obtener_rut_vendedor_por_proyecto
)

# -------------------------------------------------------------------------
# 1. CONFIGURACIÓN DE LOGGING OPTIMIZADA (Rotación 5MB)
# -------------------------------------------------------------------------
log_handler = RotatingFileHandler(
    filename='crear_interaccion.log', 
    maxBytes=5*1024*1024, # 5 MB
    backupCount=3,
    encoding='utf-8'
)
logging.basicConfig(
    level=logging.INFO, 
    format='%(asctime)s [%(levelname)s] %(message)s',
    handlers=[log_handler, logging.StreamHandler()]
)

# Carga de variables de entorno
load_dotenv()

DB_USER = os.getenv('DB_USER')
DB_PASSWORD = os.getenv('DB_PASSWORD')
DB_HOST = os.getenv('DB_HOST')
DB_NAME = os.getenv('DB_NAME')
SECRET_TOKEN = os.getenv('SECRET_TOKEN')

TIPO_CONTACTOPOK = int(os.getenv("CONI_GESTIONADO", "0"))
ENVIAR_PLANOK = os.getenv("ENVIAR_PLANOK", "0")  # "1" para habilitar
PROYECTOS_ACTIVO_STR = os.getenv("PROYECTOS_ACTIVO", "") 

# Definir el Blueprint
PROYECTOS_ACTIVO = set()
if PROYECTOS_ACTIVO_STR.strip():
    try:
        PROYECTOS_ACTIVO = {int(x) for x in PROYECTOS_ACTIVO_STR.split(",")}
    except ValueError:
        logging.warning(f"PROYECTOS_ACTIVO contiene valores no enteros: {PROYECTOS_ACTIVO_STR}")

crear_interaccion_bp = Blueprint('crear_interaccion', __name__)

# -------------------------------------------------------------------------
# Utilidades
# -------------------------------------------------------------------------

def enviado_reciente(phone_norm, fecha_registro):

    try:

        connection = pymysql.connect(
            host=DB_HOST,
            user=DB_USER,
            password=DB_PASSWORD,
            database=DB_NAME,
            cursorclass=pymysql.cursors.DictCursor
        )

        with connection:
            with connection.cursor() as cursor:

                sql = """
                SELECT id
                FROM UserInteraction
                WHERE phone_norm_gen = %s
                AND enviado_crm = 1
                AND fecha_envio_crm >= DATE_SUB(%s, INTERVAL 25 HOUR)
                LIMIT 1
                """

                cursor.execute(sql, (phone_norm, fecha_registro))
                return cursor.fetchone() is not None

    except Exception as e:
        logging.error(f"Error verificando envio reciente: {e}")
        return False

def clean(x):
    if x is None: return None
    s = str(x).strip()
    if s == "": return None
    sl = s.lower()
    if sl in {"null", "none", "n/a", "na"} or sl.startswith("no aplica"): return None
    return s

def normalize_phone_any(raw_phone: str) -> str:
    if raw_phone is None: return ""
    wp = "".join(filter(str.isdigit, str(raw_phone)))
    if wp.startswith("0056") and len(wp) >= 13: wp = wp[2:]
    if re.fullmatch(r"09\d{8}", wp): wp = "56" + wp[1:]
    if re.fullmatch(r"9\d{8}", wp): wp = "56" + wp
    return wp

def save_raw_data(raw_data, filename="received_raw_json"):
    try:
        if not os.path.exists('interacciones'):
            os.makedirs('interacciones')
        timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
        filepath = os.path.join('interacciones', f"{filename}_{timestamp}.json")
        with open(filepath, 'wb') as f:
            f.write(raw_data)
        return filepath
    except Exception as e:
        logging.error(f"Error saving raw data: {str(e)}")
        raise Exception(f"Error saving raw data: {str(e)}")

def save_json_full_to_db(raw_data):
    try:
        if isinstance(raw_data, (bytes, bytearray)):
            json_text = raw_data.decode('utf-8', errors='strict')
        elif isinstance(raw_data, str):
            json_text = raw_data
        else:
            json_text = json.dumps(raw_data, ensure_ascii=False)

        data_obj = json.loads(json_text)
        wa_id = data_obj.get('whatsapp user id')
        if not wa_id: return

        connection = pymysql.connect(
            host=DB_HOST, user=DB_USER, password=DB_PASSWORD, database=DB_NAME,
            cursorclass=pymysql.cursors.DictCursor, charset='utf8mb4', use_unicode=True,
        )
        with connection:
            with connection.cursor() as cursor:
                sql = "UPDATE UserInteraction SET Json_full = CAST(%s AS JSON) WHERE whatsapp_user_id = %s"
                cursor.execute(sql, (json_text, wa_id))
            connection.commit()
            # logging.debug(f"Json_full actualizado para {wa_id}") 

    except Exception as e:
        logging.error(f"Error guardando Json_full: {e}")

def delete_duplicate_records(whatsapp_user_id):
    try:
        connection = pymysql.connect(host=DB_HOST, user=DB_USER, password=DB_PASSWORD, database=DB_NAME, cursorclass=pymysql.cursors.DictCursor)
        with connection:
            with connection.cursor() as cursor:
                sql = "DELETE FROM UserInteraction WHERE whatsapp_user_id = %s AND enviado_crm = FALSE"
                cursor.execute(sql, (whatsapp_user_id,))
            connection.commit()
    except pymysql.MySQLError as e:
        logging.error(f"Error deleting duplicate records: {str(e)}")

def insert_data_to_db(user_data):
    try:
        connection = pymysql.connect(host=DB_HOST, user=DB_USER, password=DB_PASSWORD, database=DB_NAME, cursorclass=pymysql.cursors.DictCursor)
        with connection:
            with connection.cursor() as cursor:
                # Se eliminaron logs excesivos "Database connection established"
                sql = """
                INSERT INTO UserInteraction (
                    whatsapp_user_id, whatsapp_phone, source, last_seen, signed_up, sessions,
                    last_visited_block_name, last_visited_block_id, last_clicked_button_name,
                    entrada_del_usuario, numero_interacciones, motivo_de_consulta, topico,
                    proyecto_id, proyecto_consultado, acuerdo, medio_de_contacto,
                    dentro_de_presupuesto, renta, situacion_de_vivienda, inicial, fechaentrega,
                    nombre_cliente, apellido_cliente, numero_ambientes, dni,
                    fecha_de_visita, horario, mail, crm_email, estado_flujo,
                    nivel_de_interes, subsidio, subsidio_puede_postular,
                    link_de_la_conversacion, observacion_bot,
                    contactar_por, credito, crm_id_cliente, crm_id_trato,
                    crm_medio_id, crm_proyecto, digitoverificador, modelo,
                    motivo_de_problema, pie, rentadeclarada, crm_Nombre_vendedor,
                    boton_interes, primer_boton, boton_seguimiento, primera_respuesta, crm_Rut_vendedor,
                    boton_abandono
                ) VALUES (
                    %(whatsapp_user_id)s, %(whatsapp_phone)s, %(source)s,
                    %(last_seen)s, %(signed_up)s, %(sessions)s,
                    %(last_visited_block_name)s, %(last_visited_block_id)s,
                    %(last_clicked_button_name)s, %(entrada_del_usuario)s,
                    %(numero_interacciones)s, %(motivo_de_consulta)s,
                    %(topico)s, %(proyecto_id)s, %(proyecto_consultado)s,
                    %(acuerdo)s, %(medio_de_contacto)s, %(dentro_de_presupuesto)s,
                    %(renta)s, %(situacion_de_vivienda)s, %(inicial)s,
                    %(fechaentrega)s, %(nombre_cliente)s, %(apellido_cliente)s,
                    %(numero_ambientes)s, %(dni)s, %(fecha_de_visita)s,
                    %(horario)s, %(mail)s, %(crm_email)s, %(estado_flujo)s,
                    %(nivel_de_interes)s, %(subsidio)s, %(subsidio_puede_postular)s,
                    %(link_de_la_conversacion)s, %(observacion_bot)s,
                    %(contactar_por)s, %(credito)s, %(crm_id_cliente)s, %(crm_id_trato)s,
                    %(crm_medio_id)s, %(crm_proyecto)s, %(digitoverificador)s, %(modelo)s,
                    %(motivo_de_problema)s, %(pie)s, %(rentadeclarada)s, %(crm_Nombre_vendedor)s,
                    %(boton_interes)s, %(primer_boton)s, %(boton_seguimiento)s, %(primera_respuesta)s, %(crm_Rut_vendedor)s,
                    %(boton_abandono)s
                )
                """
                cursor.execute(sql, user_data)
                connection.commit()
                logging.info(f"Lead insertado ID: {cursor.lastrowid} - {user_data.get('whatsapp_phone')}")
                return cursor.lastrowid
    except pymysql.MySQLError as e:
        logging.error(f"Error inserting data into database: {str(e)}")
        raise Exception(f"Error inserting data into database: {str(e)}")

# -------------------------------------------------------------------------
# NUEVA FUNCIÓN: Actualizar Respuesta PlanOK
# -------------------------------------------------------------------------
def update_planok_response_on_interaction(row_id, respuesta):
    """Guarda la respuesta de PlanOK en UserInteraction usando el ID de fila (PK)."""
    try:
        connection = pymysql.connect(host=DB_HOST, user=DB_USER, password=DB_PASSWORD, database=DB_NAME, cursorclass=pymysql.cursors.DictCursor)
        with connection:
            with connection.cursor() as cursor:
                # Asegúrate de que el nombre de columna 'planok_respuesta' coincida con tu DB
                sql = "UPDATE UserInteraction SET planok_respuesta = %s WHERE id = %s"
                cursor.execute(sql, (str(respuesta), row_id))
            connection.commit()
    except Exception as e:
        logging.error(f"Error guardando planok_respuesta en UserInteraction: {e}")

def parse_date(date_str):
    if not date_str: return None
    try:
        date_formats = ["%Y-%m-%dT%H:%M:%S.%fZ", "%Y-%m-%d %H:%M:%S", "%Y-%m-%dT%H:%M:%S", "%Y-%m-%dT%H:%M:%SZ", "%a, %d %b %Y %H:%M:%S %Z"]
        for fmt in date_formats:
            try: return datetime.strptime(date_str, fmt)
            except ValueError: pass
        return None
    except Exception: return None

def parse_int(value, default=None):
    try: return int(value)
    except (ValueError, TypeError): return default

def update_as_sent(whatsapp_user_id):
    try:
        connection = pymysql.connect(
            host=DB_HOST, user=DB_USER, password=DB_PASSWORD,
            database=DB_NAME, cursorclass=pymysql.cursors.DictCursor
        )

        with connection:
            with connection.cursor() as cursor:
                sql = """
                UPDATE UserInteraction
                SET enviado_crm = TRUE,
                    fecha_envio_crm = NOW()
                WHERE whatsapp_user_id = %s
                """
                cursor.execute(sql, (whatsapp_user_id,))
            connection.commit()

    except pymysql.MySQLError as e:
        logging.error(f"Error update_as_sent: {e}")
# -------------------------------------------------------------------------
# RUTA PRINCIPAL /inter
# -------------------------------------------------------------------------
@crear_interaccion_bp.route('/inter', methods=['POST'])
def inter():
    try:
        token = request.args.get('token')
        if token is None or token != SECRET_TOKEN:
            logging.error("Unauthorized token")
            abort(401, description="Unauthorized")

        raw_data = request.data
        save_raw_data(raw_data) # Opcional: comentar si llena mucho disco
        data = json.loads(raw_data)

        # Proyecto id
        proyecto_id_str = data.get('proyecto id')
        try:
            proyecto_id = int(proyecto_id_str) if proyecto_id_str and str(proyecto_id_str).strip().lower() not in {"null", ""} else 0
        except ValueError:
            proyecto_id = 0

        # Campos extra
        crm_id_trato_raw = data.get('crm id trato') or data.get('crm_id') or data.get('crm id')
        crm_id_trato = str(crm_id_trato_raw) if crm_id_trato_raw and str(crm_id_trato_raw).lower() not in ["null", "none"] else None

        medio_llegada_raw = data.get('crm_medio_id')
        
        try:
            medio_llegada_id = int(str(medio_llegada_raw).strip())
        except (TypeError, ValueError):
            medio_llegada_id = None        

        rut_vendedor_raw = data.get('crm_Rut vendedor') or data.get('Rut vendedor')
        crm_rut_vendedor = int(rut_vendedor_raw) if str(rut_vendedor_raw).isdigit() else None

        whatsapp_phone_norm = normalize_phone_any(data.get('whatsapp phone'))

        user_data = {
            'whatsapp_user_id':       clean(data.get('whatsapp user id')),
            'whatsapp_phone':         whatsapp_phone_norm,
            'source':                 clean(data.get('source')),
            'last_seen':              parse_date(clean(data.get('last seen'))),
            'signed_up':              parse_date(clean(data.get('signed up'))),
            'sessions':               parse_int(data.get('sessions')),
            'last_visited_block_name':clean(data.get('last visited block name')),
            'last_visited_block_id':  clean(data.get('last visited block id')),
            'last_clicked_button_name':clean(data.get('last clicked button name')),
            'entrada_del_usuario':    clean(data.get('entrada del usuario')),
            'numero_interacciones':   parse_int(data.get('numero interacciones')),
            'motivo_de_consulta':     clean(data.get('motivo de problema') or data.get('motivo_de_consulta')),
            'topico':                 clean(data.get('topico')),
            'proyecto_id':            proyecto_id,
            'proyecto_consultado':    clean(data.get('proyecto_consultado')),
            'acuerdo':                clean(data.get('acuerdo') or data.get('Acuerdo')),
            'medio_de_contacto':      clean(data.get('medio de contacto') or data.get('crm_medio_llegada') or data.get('medio_de_contacto')),
            'dentro_de_presupuesto':  clean(data.get('dentro de presupuesto')),
            'renta':                  clean(data.get('rentadeclarada')),
            'situacion_de_vivienda':  clean(data.get('situacion_de_vivienda')),
            'inicial':                clean(data.get('inicial')),
            'fechaentrega':           clean(data.get('fechaentrega')),
            'nombre_cliente':         clean(data.get('crm_nombre_cliente') or data.get('nombre_cliente')),
            'apellido_cliente':       clean(data.get('crm_apellido_cliente') or data.get('apellido_cliente')),
            'numero_ambientes':       clean(data.get('numero ambientes')),
            'dni':                    clean(data.get('dni') or data.get('dni_sin_verificador') or data.get('DNI')),
            'fecha_de_visita':        clean(data.get('fecha de visita')),
            'horario':                clean(data.get('horario')),
            'mail':                   clean(data.get('mail')),
            'crm_email':              clean(data.get('crm_email') or data.get('crm_email_cliente')),
            'estado_flujo':           clean(data.get('estado_flujo')),
            'nivel_de_interes':       parse_int(clean(data.get('nivel_de_interes_crm'))),
            'subsidio':               clean(data.get('subsidio')),
            'subsidio_puede_postular':clean(data.get('subsidio_puede_postular')),
            'link_de_la_conversacion': f"https://dashboard.chatfuel.com/bot/{os.getenv('CHATFUEL_BOT_ID')}/livechat?folder=all&conversationId=wa_{clean(data.get('whatsapp user id'))}&platform=whatsapp",
            'observacion_bot':        clean(data.get('observacion_bot')),
            'contactar_por':          clean(data.get('contactar_por')),
            'credito':                clean(data.get('credito')),
            'crm_id_cliente':         clean(data.get('crm_id_cliente') or data.get('id_cliente')),
            'id_cliente':             clean(data.get('id_cliente') or data.get('crm_id_cliente')),
            'crm_id_trato':           crm_id_trato,
            'crm_medio_id':           clean(data.get('crm_medio_id')),
            'crm_proyecto':           clean(data.get('crm_proyecto')),
            'digitoverificador':      clean(data.get('digitoverificador') or data.get('digito_dni')),
            'digito_dni':             clean(data.get('digito_dni') or data.get('digitoverificador')),
            'modelo':                 clean(data.get('modelo')),
            'motivo_de_problema':     clean(data.get('motivo_de_problema')),
            'pie':                    clean(data.get('pie')),
            'rentadeclarada':         clean(data.get('rentadeclarada')),
            'crm_Rut_vendedor':       crm_rut_vendedor,
            'crm_Nombre_vendedor':    clean(data.get('crm Nombre_vendedor')),
            'boton_interes':          clean(data.get('boton_interes')),
            'primer_boton':           clean(data.get('primer_boton')),
            'boton_seguimiento':      clean(data.get('boton_seguimiento')),
            'primera_respuesta':      clean(data.get('primera_respuesta')),
            'medio_llegada_id':       medio_llegada_id,
            'boton_abandono':         clean(data.get('boton_abandono')),
        }

        # Seguimiento extra
        obs_extra = []
        if clean(data.get('seguimiento_avances')): obs_extra.append(f"Seguimiento avances: {clean(data.get('seguimiento_avances'))}")
        if clean(data.get('seguimiento_observaciones')): obs_extra.append(f"Seguimiento observaciones: {clean(data.get('seguimiento_observaciones'))}")
        if obs_extra:
            base = user_data.get('observacion_bot') or ""
            user_data['observacion_bot'] = (base + ("\n\n" if base else "") + "\n".join(obs_extra)).strip()

        # logging.info(f"Processed user data: {user_data}") # Reducir ruido

        if not user_data['whatsapp_user_id'] or not user_data['whatsapp_phone']:
            raise ValueError("Campos whatsapp_user_id y whatsapp_phone requeridos")

        delete_duplicate_records(user_data['whatsapp_user_id'])
        last_insert_id = insert_data_to_db(user_data)
        save_json_full_to_db(raw_data)

        # ---------------------------------------------------------------------
        # INTEGRACIÓN PLANOK (Si estado_flujo == completo)
        # ---------------------------------------------------------------------
        fecha_registro = datetime.utcnow()
        if enviado_reciente(user_data['whatsapp_phone'], fecha_registro):
            logging.info(f"Lead ya enviado hoy: {user_data['whatsapp_phone']}")
            update_planok_response_on_interaction(last_insert_id, "Ya enviado hoy")
            return jsonify({
                'status': 'ok',
                'message': 'Lead ya enviado hoy'
            }), 200        
        if (user_data.get('estado_flujo') or "").strip().lower() == "completo":
            if ENVIAR_PLANOK == "1":
                id_cliente_str = (user_data.get('id_cliente') or "").strip()
                cliente_id_gci = None
                cliente_creado_ahora = False

                # 1. Buscar/Crear Cliente
                if id_cliente_str.isdigit() and int(id_cliente_str) > 0:
                    cliente_id_gci = int(id_cliente_str)
                
                if not cliente_id_gci:
                    dni_int = None
                    if user_data['dni']:
                        try: dni_int = int(user_data['dni'])
                        except: pass
                    
                    if dni_int:
                        cliente_id_gci = buscar_cliente_natural(dni_int)
                        if not cliente_id_gci:
                            # Crear
                            email_final = user_data.get('mail') or user_data.get('crm_email') or ""
                            cliente_id_gci = crear_cliente_natural(
                                identificador_personal=dni_int,
                                digito_verificador=user_data.get('digitoverificador') or "",
                                nombre=user_data.get('nombre_cliente', '') or '',
                                apellido_paterno=user_data.get('apellido_cliente', '') or '',
                                apellido_materno="",
                                celular=user_data['whatsapp_phone'],
                                email=email_final
                            )
                            cliente_creado_ahora = True
                            update_as_sent(user_data['whatsapp_user_id']) # Se marca enviado al crear cliente
                
                # 2. Crear Seguimiento
                if proyecto_id and isinstance(proyecto_id, int) and (proyecto_id in PROYECTOS_ACTIVO):
                    if cliente_id_gci:
                        rutvendedor_dni = user_data.get('crm_Rut_vendedor')
                        if not rutvendedor_dni or str(rutvendedor_dni).strip() in ('','0','None'):
                            rutvendedor_dni = obtener_rut_vendedor_por_proyecto(proyecto_id)
                        
                        # Validar rut vendedor razonable
                        try:
                            if int(rutvendedor_dni) < 1000000: rutvendedor_dni = None
                        except: rutvendedor_dni = None

                        mantener_ejecutivo_cf = not cliente_creado_ahora
                        rut_para_seguimiento = rutvendedor_dni if cliente_creado_ahora else None

                        fecha_recontacto_str = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ')
                        
                        resp_seguimiento = crear_seguimiento(
                            id_cliente=cliente_id_gci,
                            id_proyecto=proyecto_id,
                            id_medio=parse_int(user_data.get('medio_llegada_id'), 0),
                            id_tipo_contacto=TIPO_CONTACTOPOK,
                            id_expectativa=parse_int(user_data.get('nivel_de_interes')),
                            comentario=user_data.get('observacion_bot'),
                            fecha_recontacto_str=fecha_recontacto_str,
                            mantener_ejecutivo=mantener_ejecutivo_cf,
                            rutvendedor=rut_para_seguimiento
                        )

                        if resp_seguimiento is not None:
                            logging.info(f"Seguimiento GCI creado ID={resp_seguimiento}")
                            update_as_sent(user_data['whatsapp_user_id'])
                            
                            # NUEVO: GUARDAR LA RESPUESTA DE PLANOK EN LA DB
                            update_planok_response_on_interaction(last_insert_id, resp_seguimiento)
                        else:
                            logging.warning("Fallo al crear seguimiento GCI.")
                            update_planok_response_on_interaction(last_insert_id, "Error: No ID returned")
                    else:
                        logging.warning("No se pudo obtener cliente_id_gci para seguimiento.")
                else:
                    logging.debug(f"Proyecto {proyecto_id} inactivo o inválido.")

        # 9) Respuesta final
        return jsonify({
            'status': 'success',
            'message': 'Data processed',
            'insert_id': last_insert_id
        }), 200

    except Exception as e:
        logging.error(f"Error processing request: {str(e)}")
        return jsonify({'status': 'error', 'message': str(e)}), 500


#funcion put de actualizado:
@crear_interaccion_bp.route('/inter/update', methods=['PATCH'])
def update_interaccion():
    try:
        # -------------------------------
        # 1) Validación del token
        # -------------------------------
        token = request.args.get('token')
        if token is None or token != SECRET_TOKEN:
            abort(401, description="Unauthorized: Invalid or missing token")

        # -------------------------------
        # 2) Recibir JSON RAW
        # -------------------------------
        raw_body = request.data  # bytes originales

        # Guardar RAW en carpeta /interacciones_seguimiento
        try:
            folder = "interacciones_seguimiento"
            if not os.path.exists(folder):
                os.makedirs(folder)
            ts = datetime.now().strftime("%Y%m%d_%H%M%S")
            filepath = os.path.join(folder, f"inter_seguimiento_{ts}.json")
            with open(filepath, "wb") as f:
                f.write(raw_body)
        except Exception as e:
            logging.error(f"Error guardando RAW seguimiento: {e}")

        # Parsear a JSON normal
        data_raw = request.get_json(force=True)

        # -------------------------------
        # 3) Normalización de claves
        # -------------------------------
        data = {}
        for k, v in data_raw.items():
            key_norm = (
                k.replace(" ", "_")
                 .replace("á", "a").replace("é", "e")
                 .replace("í", "i").replace("ó", "o").replace("ú", "u")
                 .replace("ñ", "n")
                 .lower()
            )
            data[key_norm] = v

        # -------------------------------
        # 4) Obtener whatsapp_user_id
        # -------------------------------
        whatsapp_user_id = clean(
            data.get("whatsapp_user_id") or data.get("whatsapp_user_id")
        )
        if not whatsapp_user_id:
            return jsonify({
                "status": "error",
                "message": "Debe incluir whatsapp_user_id o whatsapp user id"
            }), 400

        # -------------------------------
        # 5) Campos permitidos
        # -------------------------------
        allowed_fields = {
            "boton_interes",
            "primera_respuesta",
            "boton_seguimiento",
            "boton_abandono",
            "seguimiento_avances",
            "seguimiento_observaciones"
        }

        update_data = {
            k: clean(v)
            for k, v in data.items()
            if k in allowed_fields
        }

        if not update_data:
            return jsonify({
                "status": "error",
                "message": "No se enviaron campos válidos para actualizar."
            }), 400

        # -------------------------------
        # 6) Ejecutar UPDATE
        # -------------------------------
        connection = pymysql.connect(
            host=DB_HOST,
            user=DB_USER,
            password=DB_PASSWORD,
            database=DB_NAME,
            cursorclass=pymysql.cursors.DictCursor
        )

        with connection:
            with connection.cursor() as cursor:

                set_clause = ", ".join([f"{k}=%s" for k in update_data.keys()])
                values = list(update_data.values())
                values.append(whatsapp_user_id)

                sql = f"""
                UPDATE UserInteraction
                   SET {set_clause}
                 WHERE whatsapp_user_id = %s
                   AND fecha_registro >= NOW() - INTERVAL 72 HOUR
                   AND fecha_registro <= NOW() - INTERVAL 24 HOUR
                """

                cursor.execute(sql, values)
                connection.commit()
                filas = cursor.rowcount

        # -------------------------------
        # 7) OK
        # -------------------------------
        return jsonify({
            "status": "success",
            "updated_rows": filas,
            "whatsapp_user_id": whatsapp_user_id,
            "updated_fields": list(update_data.keys()),
            "raw_saved": filepath
        }), 200

    except Exception as e:
        logging.error(f"Error en update_interaccion: {str(e)}")
        return jsonify({"status": "error", "message": str(e)}), 500
