from flask import Flask, render_template, request, jsonify, send_from_directory, redirect, url_for, flash
import mysql.connector
from flask_mail import Mail, Message
from datetime import datetime, date, timedelta
from dateutil.relativedelta import relativedelta # REQUERIDO: pip install python-dateutil
import requests
import os
import atexit
from apscheduler.schedulers.background import BackgroundScheduler # REQUERIDO: pip install apscheduler

app = Flask(__name__)
app.secret_key = 'tu_clave_secreta_super_segura' 

# --- 1. CONFIGURACIÓN DE CORREO ---
app.config['MAIL_SERVER'] = 'smtp.gmail.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = 'roisroisomg@gmail.com' 
app.config['MAIL_PASSWORD'] = 'svcqrshaxydqyluj' 
app.config['MAIL_DEFAULT_SENDER'] = ('Contacto PlexaWeb', 'roisroisomg@gmail.com')
mail = Mail(app)

# --- 2. CONFIGURACIÓN DEL "TÚNEL" ---
CARPETA_PDF_PLEXACORE = r'C:\PlexaCore\public\archivos_glp'

# --- 3. CONEXIÓN BASE DE DATOS ---
def get_db_connection():
    return mysql.connector.connect(
        host="localhost",
        user="root",
        password="",
        database="plexa_core", 
        port=3307
    )

# ==========================================
#              RUTAS DEL SITIO WEB
# ==========================================

@app.route('/')
def index():
    try:
        conn = get_db_connection()
        cursor = conn.cursor(dictionary=True)
        query = "SELECT titulo, subtitulo, url, boton, imagen FROM `1_carrusel` WHERE estado = 1 order by orden asc"
        cursor.execute(query)
        lista_carrusel = cursor.fetchall() 
        cursor.close()
        conn.close()
        return render_template('index.html', carrusel=lista_carrusel)
    except Exception as e:
        print(f"Error: {e}")
        return "Error en el servidor"

@app.route('/servicios')
def servicios(): return render_template('servicios.html')
    
@app.route('/contactenos')
def contactenos(): return render_template('contactenos.html')

@app.route('/sobrenosotros')
def sobrenosotros(): return render_template('sobrenosotros.html')

@app.route('/nuestrosclientes')
def nuestrosclientes(): return render_template('nuestrosclientes.html')

# --- RUTA DEL PRECIO GLP ---
@app.route('/precioglp')
def precioglp():
    try:
        conn = get_db_connection()
        cursor = conn.cursor(dictionary=True)
        query = "SELECT * FROM 2_precios_glp WHERE estado = 1 ORDER BY id DESC LIMIT 1"
        cursor.execute(query)
        documento = cursor.fetchone()
        cursor.close()
        conn.close()
        return render_template('precioglp.html', documento=documento)
    except Exception as e:
        return render_template('precioglp.html', documento=None)

@app.route('/ver-pdf-compartido/<path:filename>')
def ver_pdf_compartido(filename):
    return send_from_directory(CARPETA_PDF_PLEXACORE, filename)

# --- OTRAS RUTAS ---
@app.route('/sondeodemercado')
def sondeodemercado(): return render_template('sondeodemercado.html')

@app.route('/comercializador')
def comercializador(): return render_template('comercializador.html')

@app.route('/bienesesenciales')
def bienesesenciales(): return render_template('bienesesenciales.html')

@app.route('/plexaport')
def plexaport(): return render_template('plexaport.html')

@app.route('/comerci')
def comerci(): return render_template('comerci.html')

@app.route('/logistica')
def logistica(): return render_template('logistica.html')
    
@app.route('/chile')
def chile(): return render_template('chile.html')


# =========================================================
#  LÓGICA HÍBRIDA DE INDICADORES (AUTO + MANUAL)
# =========================================================

# --- 1. CONTEXT PROCESSOR (Para que salga en el Navbar) ---
@app.context_processor
def inject_indicadores():
    data = []
    try:
        conn = get_db_connection()
        cur = conn.cursor(dictionary=True)
        cur.execute("SELECT * FROM indicadores")
        data = cur.fetchall()
        cur.close()
        conn.close()
    except Exception as e:
        print(f"Error navbar: {e}")
    return dict(indicadores_globales=data)

# --- 2. FUNCIONES PARA LÓGICA AUTOMÁTICA (ROBOT) ---

def obtener_trm_oficial(fecha_obj):
    """Consulta Datos Abiertos Colombia (Socrata) para el Dólar"""
    try:
        fecha_str = fecha_obj.strftime('%Y-%m-%d')
        url = "https://www.datos.gov.co/resource/32sa-8pi3.json"
        query = f"?$where=vigenciadesde <= '{fecha_str}T00:00:00.000' AND vigenciahasta >= '{fecha_str}T00:00:00.000'"
        resp = requests.get(url + query, timeout=10)
        data = resp.json()
        if data: return float(data[0]['valor'])
    except Exception as e:
        print(f"⚠️ Error consultando Dólar ({fecha_str}): {e}")
    return None

def obtener_euro_inteligente(fecha_obj):
    """Estrategia A prueba de Fallos para el Euro"""
    fecha_str = fecha_obj.strftime('%Y-%m-%d')
    
    # PLAN A: Frankfurter (Banco Central Europeo)
    try:
        if fecha_obj >= date.today(): endpoint = 'latest'
        else: endpoint = fecha_str
        
        url = f"https://api.frankfurter.app/{endpoint}?from=EUR&to=COP"
        resp = requests.get(url, timeout=5)
        if resp.status_code == 200:
            return float(resp.json()['rates']['COP'])
    except Exception as e:
        print(f"⚠️ Plan A Euro falló ({fecha_str}): {e}")

    # PLAN B: Open Exchange Rates (Respaldo)
    if fecha_obj >= date.today() - timedelta(days=5):
        try:
            print(f"   ℹ️ Usando Plan B (Backup) para Euro...")
            resp = requests.get('https://open.er-api.com/v6/latest/EUR', timeout=5)
            return float(resp.json()['rates']['COP'])
        except Exception as e:
            print(f"   ❌ Plan B Euro también falló: {e}")
            
    return None

def tarea_robot_divisas():
    """Esta tarea corre sola en segundo plano"""
    print("\n🔄 ROBOT: Iniciando actualización de divisas...")
    
    try:
        # Fechas Clave
        hoy = date.today()
        # Último día del mes pasado
        fin_mes_anterior = hoy.replace(day=1) - timedelta(days=1)

        print(f"📅 Comparando: Hoy ({hoy}) vs Mes Anterior ({fin_mes_anterior})")

        # 1. Obtener Dólar
        dolar_hoy = obtener_trm_oficial(hoy)
        if not dolar_hoy:
            try:
                r = requests.get("https://www.datos.gov.co/resource/32sa-8pi3.json?$limit=1&$order=vigenciahasta DESC").json()
                dolar_hoy = float(r[0]['valor'])
            except: pass
        dolar_ant = obtener_trm_oficial(fin_mes_anterior)

        # 2. Obtener Euro (Usando la función inteligente)
        euro_hoy = obtener_euro_inteligente(hoy)
        euro_ant = obtener_euro_inteligente(fin_mes_anterior)

        # 3. Guardar en BD
        conn = get_db_connection()
        cur = conn.cursor(dictionary=True)

        def guardar_auto(codigo, val_nuevo, val_ref):
            if val_nuevo is None: 
                print(f"❌ Sin datos para {codigo}. No se actualizó.")
                return

            # Si no hay histórico, usamos el de hoy como parche
            if val_ref is None: val_ref = val_nuevo

            tendencia = 'igual'
            if val_nuevo > val_ref: tendencia = 'sube'
            elif val_nuevo < val_ref: tendencia = 'baja'
            
            cur.execute("""
                UPDATE indicadores 
                SET valor=%s, valor_anterior=%s, tendencia=%s 
                WHERE codigo=%s
            """, (val_nuevo, val_ref, tendencia, codigo))
            
            # --- AQUÍ ESTABA EL ERROR, YA ESTÁ CORREGIDO: ---
            print(f"   ✅ {codigo.upper()}: Hoy ${val_nuevo:,.0f} | Ant ${val_ref:,.0f}")

        guardar_auto('dolar', dolar_hoy, dolar_ant)
        guardar_auto('euro', euro_hoy, euro_ant)
        
        conn.commit()
        cur.close()
        conn.close()
        print("🏁 Robot finalizado con éxito.\n")
        
    except Exception as e:
        print(f"❌ Error General Robot: {e}")

# --- 3. GESTIÓN MANUAL (PARA GLP, GNC, ETC.) ---
@app.route('/gestion-indicadores', methods=['GET', 'POST'])
def gestion_indicadores():
    if request.method == 'POST':
        try:
            id_ind = request.form['id']
            nuevo_valor = float(request.form['valor']) 
            
            conn = get_db_connection()
            cur = conn.cursor(dictionary=True)
            
            # Buscar precio viejo
            cur.execute("SELECT valor FROM indicadores WHERE id = %s", (id_ind,))
            row = cur.fetchone()
            
            if row:
                precio_viejo_bd = float(row['valor'])
                
                tendencia = 'igual'
                if nuevo_valor > precio_viejo_bd: tendencia = 'sube'
                elif nuevo_valor < precio_viejo_bd: tendencia = 'baja'
                
                # Guardar nuevo y mover viejo a 'valor_anterior'
                cur.execute("""
                    UPDATE indicadores 
                    SET valor=%s, valor_anterior=%s, tendencia=%s 
                    WHERE id=%s
                """, (nuevo_valor, precio_viejo_bd, tendencia, id_ind))
                
                conn.commit()
                flash('Precio actualizado correctamente.', 'success')
            
            cur.close()
            conn.close()
            return redirect(url_for('gestion_indicadores'))

        except Exception as e:
            flash(f'Error: {str(e)}', 'danger')

    # GET
    conn = get_db_connection()
    cur = conn.cursor(dictionary=True)
    cur.execute("SELECT * FROM indicadores")
    data = cur.fetchall()
    cur.close()
    conn.close()
    return render_template('gestion_indicadores.html', indicadores=data)


# --- ENVÍO DE CORREOS ---
@app.route('/enviar_mensaje', methods=['POST'])
def enviar_mensaje():
    nombre = request.form.get('nombre')
    correo_usuario = request.form.get('correo')
    asunto = request.form.get('asunto')
    mensaje = request.form.get('mensaje')

    try:
        msg_interno = Message(subject=f"Nuevo mensaje web: {asunto}",
                              recipients=['plexa@plexa.co'])
        msg_interno.body = f"Nombre: {nombre}\nCorreo: {correo_usuario}\n\nMensaje:\n{mensaje}"
        mail.send(msg_interno)

        msg_cliente = Message(subject="Recibimos tu solicitud - Plexa SAS",
                              recipients=[correo_usuario])
        msg_cliente.body = f"""Hola {nombre},\nGracias por contactarte...\n"{mensaje}"\n..."""
        mail.send(msg_cliente)

        return jsonify({"status": "success"})
    except Exception as e:
        return jsonify({"status": "error", "message": str(e)}), 500


# ==========================================
#  INICIO DE LA APP Y EL ROBOT
# ==========================================
if __name__ == '__main__':
    # Configurar el Robot
    scheduler = BackgroundScheduler()
    # Ejecutar cada hora
    scheduler.add_job(func=tarea_robot_divisas, trigger="interval", minutes=60)
    # Ejecutar al iniciar (espera 3 seg)
    scheduler.add_job(func=tarea_robot_divisas, trigger="date", run_date=datetime.now() + timedelta(seconds=3))
    
    try:
        scheduler.start()
        print("🤖 Sistema automático de divisas INICIADO.")
        atexit.register(lambda: scheduler.shutdown())
    except:
        print("⚠️ No se pudo iniciar el scheduler")

    app.run(debug=True, port=5000, use_reloader=False)

if __name__ == '__main__':
    app.run(debug=True, port=5000)