import json
from datetime import datetime
import hashlib
import sys
import os
import base64
import smtplib
import ssl
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

sys.path.append("/var/www/html/config")

from cnxpdo import get_connection
from dotenv import load_dotenv

# Cargar las variables de entorno desde el archivo .env
# load_dotenv('/var/www/html/api/crm/configuraciones/.env')

""" script_dir = os.path.dirname(os.path.abspath(__file__))  # Directorio del script
crm_dir = os.path.dirname(script_dir)  # Sube un nivel hasta crm
env_path = os.path.join(crm_dir, "configuraciones", ".env")  # Ahora sí apunta bien

load_dotenv(env_path)


# Obtener las variables de entorno
hostname = os.getenv('SMTP_HOST')
port = int(os.getenv('SMTP_PORT'))
username = os.getenv('SMTP_USER')
password = os.getenv('SMTP_PASS')
appUrl = os.getenv('APP_URL')
appName = os.getenv('APP_NAME')
senderName = os.getenv('SMTP_NOTIFY') """


def cargar_configuracion_smtp():
    # Obtener la ruta del .env
    script_dir = os.path.dirname(
        os.path.abspath(__file__)
    )  # Directorio del script actual
    crm_dir = os.path.dirname(script_dir)  # Sube un nivel hasta 'crm'
    env_path = os.path.join(crm_dir, "configuraciones", ".env")  # Ruta al .env

    # Cargar variables de entorno
    load_dotenv(env_path)

    # Variables requeridas
    required_vars = [
        "SMTP_HOST",
        "SMTP_PORT",
        "SMTP_USER",
        "SMTP_PASS",
        "APP_URL",
        "APP_NAME",
        "SMTP_NOTIFY",
    ]

    # Obtener valores y validar que no falten
    config = {}
    for var in required_vars:
        value = os.getenv(var)
        if value is None or value.strip() == "":
            raise ValueError(
                f"❌ ERROR: La variable de entorno '{var}' no está definida o está vacía en {env_path}"
            )
        config[var] = value.strip()

    # Convertir el puerto a entero
    try:
        config["SMTP_PORT"] = int(config["SMTP_PORT"])
    except ValueError:
        raise ValueError(
            f"❌ ERROR: SMTP_PORT ('{config['SMTP_PORT']}') debe ser un número entero válido."
        )

    print("✅ Configuración SMTP cargada correctamente.")
    return config


# Cargar configuración SMTP
smtp_config = cargar_configuracion_smtp()

# === OVERRIDE (CREDENCIALES QUEMADAS PARA PRUEBA) ===
hostname = "smtp.office365.com"
port = 587  # Office 365 usa 587 con STARTTLS

# Opción 1 (activa)
username = "notificacionelectronica@mascredimas.us"

password = "dSU#oH+z$%RTak"

# Branding del correo (ajústalo si quieres)
appUrl = "https://dev.crm.imparables.cic-ware.com/"
appName = "Imparables"
senderName = "Notificaciones Electrónicas"
# === /OVERRIDE ===


def sendEmail(input_data):
    # =========================
    # DEBUG: imprimir lo que llega
    # =========================
    try:

        def _mask(s: str, visible: int = 3) -> str:
            if not s:
                return ""
            if len(s) <= visible * 2:
                return s[0] + "…" if len(s) > 1 else s
            return s[:visible] + "…" + s[-visible:]

        print("[DEBUG][sendEmail] input_data keys:", list(input_data.keys()))
    except Exception:
        pass  # por si input_data no es dict

    destinatario = (input_data.get("destinatario") or "").strip()
    asunto = (input_data.get("asunto") or f"Notificación {appName}").strip()
    cuerpo = input_data.get("cuerpo_correo") or ""

    print("[DEBUG][sendEmail] destinatario:", _mask(destinatario))
    print("[DEBUG][sendEmail] asunto:", asunto)
    print("[DEBUG][sendEmail] cuerpo_correo.len:", len(cuerpo))
    print(
        "[DEBUG][sendEmail] SMTP host:",
        hostname,
        "port:",
        port,
        "user:",
        _mask(username),
    )
    print("[DEBUG][sendEmail] senderName:", senderName)
    # Si quieres ver el cuerpo completo descomenta:
    # print("[DEBUG][sendEmail] cuerpo_correo.raw:", cuerpo)

    # Soporte para texto plano o HTML
    def _parece_html(s: str) -> bool:
        return "<" in s and ">" in s

    if _parece_html(cuerpo):
        cuerpo_html = cuerpo
    else:
        from html import escape

        cuerpo_html = "<p>" + escape(cuerpo).replace("\n", "<br>") + "</p>"

    # Crear el mensaje de correo
    message = MIMEMultipart("alternative")
    message["From"] = f"{senderName} <{username}>"
    message["To"] = destinatario
    message["Subject"] = asunto

    html_body = f"""
    <!DOCTYPE html>
    <html lang="es">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>{asunto}</title>
        <style>
            body {{
                font-family: Arial, sans-serif;
            }}
            .container {{
                max-width: 600px;
                margin: 0 auto;
                padding: 20px;
                border: 1px solid #e0e0e0;
                border-radius: 5px;
            }}
            .header {{
                text-align: center;
                margin-bottom: 20px;
            }}
            .footer {{
                text-align: center;
                margin-top: 20px;
                color: #666;
                font-size: 12px;
            }}
            a {{ color: #0b57d0; text-decoration: none; }}
        </style>
    </head>
    <body>
        <div class="container">
            <div class="header">
                <h1>{appName}</h1>
                <p>{asunto}</p>
            </div>

            <div class="content">
                {cuerpo_html}
            </div>

            <div class="footer">
                <p>🖥 Equipo {appName}</p>
            </div>
        </div>
    </body>
    </html>
    """

    part = MIMEText(html_body, "html")
    message.attach(part)

    # Conexión SMTP y envío de correo
    try:
        print("[DEBUG][sendEmail] Abriendo conexión SMTP…")
        context = ssl.create_default_context()
        with smtplib.SMTP(hostname, port) as server:
            server.ehlo()
            print("[DEBUG][sendEmail] STARTTLS…")
            server.starttls(context=context)
            server.ehlo()
            print("[DEBUG][sendEmail] Intentando login como:", _mask(username))
            # Si necesitas ver el intercambio SMTP (¡cuidado, es muy verboso!):
            # server.set_debuglevel(1)
            server.login(username, password)
            print("[DEBUG][sendEmail] Login OK. Enviando mensaje…")
            server.sendmail(username, destinatario, message.as_string())
            print("[DEBUG][sendEmail] Mensaje enviado.")

        return {
            "success": True,
            "message": "El correo electrónico ha sido enviado correctamente.",
        }

    except smtplib.SMTPAuthenticationError as e:
        # Captura específica para diagnosticar el 535
        try:
            code = getattr(e, "smtp_code", None)
            err = getattr(e, "smtp_error", b"").decode(errors="ignore")
        except Exception:
            code, err = None, str(e)
        print(f"[DEBUG][sendEmail] SMTPAuthenticationError code={code} error={err}")
        return {
            "success": False,
            "message": f"Error en el envío del correo electrónico: ({code}) {err or str(e)}",
        }

    except Exception as e:
        print("[DEBUG][sendEmail] Exception:", repr(e))
        return {
            "success": False,
            "message": f"Error en el envío del correo electrónico: {str(e)}",
        }
