from flask import Blueprint, request, redirect, render_template_string, jsonify, make_response
from datetime import datetime
import pymysql
import random
import string
import requests
import re
import os
import logging
from dotenv import load_dotenv

load_dotenv()


logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
formulario_widget_bp = Blueprint('formulario_widget', __name__)


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
}

CHATFUEL_TOKEN = os.getenv('CHATFUEL_TOKEN')
CHATFUEL_BOT_ID = os.getenv('CHATFUEL_BOT_ID')
CHATFUEL_URL = f"https://api.chatfuel.com/whatsapp/bots/{CHATFUEL_BOT_ID}/contacts?chatfuel_token={CHATFUEL_TOKEN}"


FORM_HTML = """
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
    <style>
        body { background: transparent; overflow: hidden; font-family: sans-serif; }
        ::-webkit-scrollbar { width: 0px; background: transparent; }
    </style>
</head>
<body class="p-2">
    <form action="/api/widget-view" method="POST" target="_top" class="flex flex-col gap-3 bg-white p-4 rounded-lg">
        <input type="hidden" name="telefono_destino" value="{{ telefono_destino }}">
        
        <div class="grid grid-cols-2 gap-2">
            <div>
                <label class="text-xs text-gray-700">Nombre</label>
                <input type="text" name="nombre" placeholder="Pablo" required class="w-full border rounded p-1 text-sm bg-gray-50 focus:bg-white focus:border-green-500 outline-none">
            </div>
            <div>
                <label class="text-xs text-gray-700">Apellido</label>
                <input type="text" name="apellido" placeholder="Castro" required class="w-full border rounded p-1 text-sm bg-gray-50 focus:bg-white focus:border-green-500 outline-none">
            </div>
        </div>

        <label class="text-xs text-gray-700">
            Correo
            <input type="email" name="correo" placeholder="mail@ejemplo.com" class="w-full border rounded p-1 text-sm bg-gray-50 focus:bg-white focus:border-green-500 outline-none">
        </label>

        <label class="text-xs text-gray-700">
            Teléfono
            <input type="text" name="telefono" placeholder="912345678" pattern="[0-9]{9}" title="9 dígitos comenzando con 9" required class="w-full border rounded p-1 text-sm bg-gray-50 focus:bg-white focus:border-green-500 outline-none">
        </label>

        <button type="submit" class="w-full bg-green-500 hover:bg-green-600 text-white font-bold py-2 rounded shadow transition duration-200 text-sm">
            💬 Ir a Chatear
        </button>
    </form>
</body>
</html>
"""

def normalize_phone(phone: str) -> str:
    d = re.sub(r'\D', '', phone or "")
    if d.startswith('0056'):
        d = d[4:]
    elif d.startswith('056'):
        d = d[3:]
    # 9XXXXXXXX -> 56 + 9XXXXXXXX
    if re.fullmatch(r"9\d{8}", d):
        d = "56" + d
    if not d.startswith('56'):
        d = '56' + d
    return d

def send_to_chatfuel_formulario(data: dict) -> None:
    """
    Envía a Chatfuel inmediatamente después de guardar el formulario en la DB.
    """
    if not CHATFUEL_TOKEN or not CHATFUEL_BOT_ID or CHATFUEL_TOKEN == "NO" or CHATFUEL_BOT_ID == "NO":
        logging.warning("Chatfuel no configurado (CHATFUEL_TOKEN/BOT_ID). Se omite envío.")
        return

    phone = normalize_phone(data.get("telefono"))
    now_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    # Tu formulario manda 'rut' (no 'Rut_cliente'), por eso hacemos fallback.
    rut_cliente = data.get("Rut_cliente") or data.get("rut")

    payload = {
        "phone": phone,
        "attributes": {
            "whatsapp_phone": phone,
            "crm Fecha_ingreso": now_str,
            "crm Hora_ingreso": now_str,
            "crm Rut_cliente": rut_cliente,
            "crm Nombre_cliente": data.get("nombre") or data.get("Nombre"),
            "crm Apellido_cliente": data.get("apellido") or data.get("Apellido"),
            "crm Proyecto": data.get("proyecto"),
            "Activar_Contacto": "Formulario"
        },
        "invokeTriggers": True,
        "tagNames": ["Nuevo_Formulario"]
    }

    try:
        r = requests.post(
            CHATFUEL_URL,
            json=payload,
            headers={"Content-Type": "application/json"},
            timeout=12
        )
        if r.status_code == 200:
            logging.info(f"[OK] Enviado a Chatfuel (formulario): {r.text}")
        else:
            logging.error(f"[ERROR] Chatfuel {r.status_code}: {r.text}")
    except Exception as e:
        logging.exception(f"[EXCEPTION] Envío a Chatfuel falló: {e}")


@formulario_widget_bp.after_request
def add_cors_headers(resp):
    origin = request.headers.get("Origin")
    resp.headers["Access-Control-Allow-Origin"] = origin if origin else "*"
    resp.headers["Vary"] = "Origin"
    resp.headers["Access-Control-Allow-Methods"] = "POST, OPTIONS"
    resp.headers["Access-Control-Allow-Headers"] = "Content-Type, Accept"
    resp.headers["Access-Control-Max-Age"] = "86400"
    return resp


@formulario_widget_bp.route("/api/widgets", methods=["POST", "OPTIONS"], strict_slashes=False)
def api_widgets():
    # Preflight
    if request.method == "OPTIONS":
        return make_response("", 204)

    data = request.get_json(silent=True) or {}

    try:
        message_id = "web-" + datetime.now().strftime("%Y%m%d-%H%M%S") + "-" + ''.join(
            random.choices(string.ascii_lowercase + string.digits, k=6)
        )

        url_val = (data.get("url") or "").strip() or (request.headers.get("Referer") or "")

        conn = pymysql.connect(**DB_CONFIG)
        try:
            with conn.cursor() as cursor:
                sql = """
                INSERT INTO formulario_datos (
                  message_id, asunto, nombre, proyecto, rut, correo, telefono,
                  fecha_registro, remitente, renta, apellido, url
                ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
                """
                cursor.execute(sql, (
                    message_id,
                    data.get("asunto"),
                    data.get("nombre"),
                    data.get("proyecto"),
                    data.get("rut"),
                    data.get("correo"),
                    data.get("telefono"),
                    datetime.now(),
                    data.get("remitente") or "Formulario wp web",
                    data.get("renta"),
                    data.get("apellido"),
                    url_val
                ))
            conn.commit()
        finally:
            conn.close()

        # ✅ Enviar a Chatfuel justo después de guardar en DB
        send_to_chatfuel_formulario({**data, "url": url_val})

        return jsonify({"success": True, "message_id": message_id})

    except Exception as e:
        logging.exception("Error en /api/widgets")
        return jsonify({"success": False, "error": str(e)}), 500

