/*
 * ============================================================
 *  Ejemplo 01 — Autenticación por licencia (license key)
 *
 *  Flujo:
 *    1. Usuario ingresa su key
 *    2. Se envía a /api/client/auth con auth_type=license
 *    3. Si es válida → session_token, expires_at, version, etc.
 *    4. Si falla → result.error contiene el mensaje configurado
 *       en Alert Messages del panel
 * ============================================================
 */
#include "SaoAuth.hpp"
#include <iostream>

// ── Configura con tus datos del panel (Aplicaciones → Credenciales) ──────────
SaoAuth::api SaoAuthApp(
    "MiApp",                                        // name
    "TU_OWNERID_AQUI",                              // ownerid
    "TU_SECRET_AQUI",                               // secret
    "1.0",                                          // version
    "https://saoauth.com/api/client/auth"          // url
);

int main() {
    // ── 1. Pedir la key al usuario ────────────────────────────────────────────
    std::string key;
    std::cout << "Ingresa tu licencia: ";
    std::cin >> key;

    // ── 2. Autenticar ─────────────────────────────────────────────────────────
    auto result = SaoAuthApp.login(key);

    // ── 3. Manejar errores ────────────────────────────────────────────────────
    if (!result.success) {
        // result.error es el mensaje que configuraste en Alert Messages
        // Si no configuraste nada, son los códigos por defecto:
        //   "invalid_key"         → clave no existe
        //   "key_expired"         → clave vencida
        //   "key_banned"          → clave baneada
        //   "device_limit_reached"→ demasiados dispositivos
        //   "outdated_version"    → versión vieja
        //   "app_disabled"        → app desactivada
        //   "app_paused"          → app pausada
        //   "network_error"       → sin conexión

        MessageBoxA(nullptr, result.error.c_str(), "Error de autenticación", MB_ICONERROR);
        return 1;
    }

    // ── 4. Auth exitosa ───────────────────────────────────────────────────────
    std::cout << "[OK] Autenticado correctamente\n";
    std::cout << "  Session token : " << result.session_token << "\n";
    std::cout << "  Expira        : " << (result.expires_at.empty() ? "Permanente" : result.expires_at) << "\n";
    std::cout << "  Version app   : " << result.version << "\n";
    std::cout << "  Vendedor      : " << result.seller << "\n";
    std::cout << "  Suscripcion   : " << (result.sub.empty() ? "default" : result.sub) << " (nivel " << result.sub_level << ")\n";

    // ── 5. Mostrar anuncio global si existe ───────────────────────────────────
    if (!result.announcement.empty()) {
        MessageBoxA(nullptr, result.announcement.c_str(), "Aviso", MB_ICONINFORMATION);
    }

    // ── 6. Verificar versión y ofrecer actualización ──────────────────────────
    // La versión que devuelve la API es la que configuraste en el panel
    // Compara con la versión hardcodeada en tu exe para forzar updates
    const std::string LOCAL_VERSION = "1.0";
    if (result.version != LOCAL_VERSION) {
        std::string msg = "Nueva version disponible: " + result.version +
                          "\nTu version: " + LOCAL_VERSION;
        if (!result.file_url.empty())
            msg += "\nDescarga: " + result.file_url;
        MessageBoxA(nullptr, msg.c_str(), "Actualización disponible", MB_ICONINFORMATION);
    }

    // ── 7. Usar el nivel de suscripción para desbloquear features ────────────
    // sub_level 0 = default, 1 = básico, 2 = pro, etc. (configurable en panel)
    if (result.sub_level >= 2) {
        std::cout << "[PRO] Features premium desbloqueadas\n";
    }

    // Tu código principal aquí...
    std::cout << "Bienvenido al programa!\n";
    return 0;
}
