/*
 * ============================================================
 *  Ejemplo 02 — Registro y Login de usuarios de app
 *
 *  Flujo registro:
 *    1. Usuario tiene una key sin usar
 *    2. Elige un username + password
 *    3. Se envía auth_type=user_register → la key queda vinculada
 *       al usuario, ya no se puede registrar otra vez con esa key
 *
 *  Flujo login:
 *    1. Usuario ya registrado ingresa username + password
 *    2. Se envía auth_type=user_login
 *    3. El sistema valida la key vinculada automáticamente
 * ============================================================
 */
#include "SaoAuth.hpp"
#include <iostream>

SaoAuth::api SaoAuthApp(
    "MiApp",
    "TU_OWNERID_AQUI",
    "TU_SECRET_AQUI",
    "1.0",
    "https://saoauth.com/api/client/auth"
);

void HandleAuthResult(const SaoAuth::AuthResult& result, const std::string& action) {
    if (!result.success) {
        std::string msg = "[" + action + "] Error: " + result.error;

        // Errores específicos de usuario
        if (result.error == "username_exists")
            msg = "Ese nombre de usuario ya está en uso.";
        else if (result.error == "license_already_registered")
            msg = "Esta key ya fue registrada por otro usuario.";
        else if (result.error == "invalid_credentials")
            msg = "Usuario o contraseña incorrectos.";
        else if (result.error == "account_banned")
            msg = "Tu cuenta está suspendida.";
        else if (result.error == "account_not_linked")
            msg = "Esta cuenta no tiene una licencia vinculada.";
        else if (result.error == "registration_disabled")
            msg = "El registro está desactivado temporalmente.";

        MessageBoxA(nullptr, msg.c_str(), "Error", MB_ICONERROR);
        return;
    }

    std::cout << "[" << action << "] OK — Usuario: " << result.username << "\n";
    std::cout << "  Session token : " << result.session_token << "\n";
    std::cout << "  Expira        : " << (result.expires_at.empty() ? "Permanente" : result.expires_at) << "\n";

    if (!result.announcement.empty())
        MessageBoxA(nullptr, result.announcement.c_str(), "Aviso", MB_ICONINFORMATION);
}

int main() {
    int choice;
    std::cout << "1. Registrarse (primera vez)\n";
    std::cout << "2. Iniciar sesion\n";
    std::cout << "Opcion: ";
    std::cin >> choice;

    if (choice == 1) {
        // ── REGISTRO ─────────────────────────────────────────────────────────
        std::string key, username, password;
        std::cout << "Key de licencia: "; std::cin >> key;
        std::cout << "Elige un usuario: "; std::cin >> username;
        std::cout << "Elige una contraseña (min 6 chars): "; std::cin >> password;

        auto result = SaoAuthApp.registerUser(key, username, password);
        HandleAuthResult(result, "REGISTRO");

    } else {
        // ── LOGIN ─────────────────────────────────────────────────────────────
        std::string username, password;
        std::cout << "Usuario: "; std::cin >> username;
        std::cout << "Contraseña: "; std::cin >> password;

        auto result = SaoAuthApp.loginUser(username, password);
        HandleAuthResult(result, "LOGIN");
    }

    return 0;
}
