# flask_server/routes/ping_routes.py

from flask import Blueprint, request, jsonify, g
from shared.utils import validate_jwt_token, verify_request_token
from urllib.parse import urlparse
from utils.connection_logger import registrar_conexion_exitosa
from utils.branch_locator import detectar_sucursal


ping_routes = Blueprint("ping_routes", __name__)
print("📦 ping_routes.py cargado correctamente")

@ping_routes.route('/validate-connection', methods=['POST', 'OPTIONS'])
def validate_connection():
    print("🔍 Iniciando validación de conexión...")

    # Manejo de preflight CORS
    if request.method == 'OPTIONS':
        response = jsonify({'status': 'ok'})
        response.status_code = 200
        return response

    # --- Headers requeridos ---
    license_key = request.headers.get("X-License-Key")
    auth_header = request.headers.get("Authorization")

    if not auth_header or not auth_header.startswith("Bearer "):
        print("⛔ Token JWT no enviado.")
        return jsonify({
            "status": "error",
            "error_code": "NO_AUTH",
            "message": "Token JWT no enviado"
        }), 401

    # --- Decodificar token ---
    token = auth_header.split(" ")[1]
    decoded = validate_jwt_token(token)
    if not decoded:
        print("⛔ Token JWT inválido.")
        return jsonify({
            "status": "error",
            "error_code": "INVALID_JWT",
            "message": "Token JWT inválido"
        }), 401

    user_email = decoded.get("email", "unknown")
    domain_key = g.cliente_id
    tenant_data = g.cliente_config

    print(f"✅ Dominio detectado: {domain_key}")
    print(f"📧 Usuario del token: {user_email}")

    # --- Validar licencia ---
    if license_key != tenant_data.get("licencia"):
        print("⛔ Clave de licencia incorrecta.")
        return jsonify({
            "status": "error",
            "error_code": "LICENSE_KEY_INVALID",
            "message": "La clave de licencia enviada es incorrecta."
        }), 403

    if tenant_data.get("license_status") != "active":
        print("⛔ Licencia inactiva o vencida.")
        return jsonify({
            "status": "error",
            "error_code": "LICENSE_INVALID",
            "message": "La licencia está inactiva o ha expirado.",
            "license_status": tenant_data.get("license_status", "unknown"),
            "apps_enabled": []
        }), 403

    # --- Validar apps activas para el usuario ---
    apps_usuario = tenant_data.get("usuarios", {}).get(user_email, {}).get("apps", {})
    apps_habilitadas = {
        nombre: datos for nombre, datos in apps_usuario.items()
        if datos.get("status", "") == "active"
    }

    print(f"📦 Apps habilitadas para este usuario: {list(apps_habilitadas.keys())}")

    # --- Registrar conexión exitosa ---
    ip = request.remote_addr
    sucursal = detectar_sucursal(ip, g.cliente_id)
    registrar_conexion_exitosa(
        cliente_id=domain_key,
        email=user_email,
        ip=request.remote_addr,
        apps=list(apps_habilitadas.keys()),
        origin=request.headers.get("Origin", "")
    )

    # Registrar conexión exitosa
    

    return jsonify({
        "status": "ok",
        "domain": domain_key,
        "user": user_email,
        "license_status": tenant_data.get("license_status"),
        "license_type": tenant_data.get("license_type"),
        "expires_on": tenant_data.get("expires_on"),
        "apps_enabled": apps_habilitadas,
        "storage": tenant_data.get("storage", {"used_mb": 0, "limit_mb": 100}),
        "traffic": tenant_data.get("traffic", {"used_gb": 0, "limit_gb": 1}),
        "features": tenant_data.get("features", {"can_sync_users": False, "can_receive_logs": False}),
        "message": "Conexión validada correctamente."
    })


@ping_routes.route('/ping', methods=['POST'])
def flask_ping():
    print("🟢 Entró a la ruta /flask/ping")
    if not verify_request_token():
        return jsonify({"error": "Unauthorized"}), 401
    return jsonify({"status": "ok"}), 200
