#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <engine>
#include <fakemeta>

#define PLUGIN  "Warfare: Main Menu & Telegram Auth"
#define VERSION "1.0"
#define AUTHOR  "Antigravity"

new const BOT_USERNAME[] = "WarZoneBase_Bot";
new const FILE_AUTH_CODES[]   = "addons/amxmodx/data/auth_codes.ini";
new const FILE_LINKED_USERS[] = "addons/amxmodx/data/linked_users.ini";

new g_szPlayerTg[33][32];
new g_iPlayerAuthCode[33];

public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR);

    register_clcmd("chooseteam", "Cmd_MainMenu");
    register_clcmd("say /menu", "Cmd_MainMenu");
    register_clcmd("say /m", "Cmd_MainMenu");
    register_clcmd("say_team /menu", "Cmd_MainMenu");
    register_clcmd("say_team /m", "Cmd_MainMenu");

    register_concmd("amx_tg_confirm", "Cmd_TgConfirm", ADMIN_RCON, "<steamid> <username>");
    register_srvcmd("amx_tg_confirm", "Cmd_TgConfirmSrv");

    LoadLinkedUsers();
}

public client_putinserver(id) {
    g_szPlayerTg[id][0] = '^0';
    g_iPlayerAuthCode[id] = 0;

    if (!is_user_bot(id)) {
        CheckPlayerLinked(id);
    }
}

public client_disconnected(id) {
    g_szPlayerTg[id][0] = '^0';
    g_iPlayerAuthCode[id] = 0;
}

stock LoadLinkedUsers() {
    if (!file_exists(FILE_LINKED_USERS)) return;

    for (new id = 1; id <= MaxClients; id++) {
        if (is_user_connected(id) && !is_user_bot(id)) {
            CheckPlayerLinked(id);
        }
    }
}

stock CheckPlayerLinked(id) {
    new szAuth[36];
    get_user_authid(id, szAuth, charsmax(szAuth));

    if (!file_exists(FILE_LINKED_USERS)) return;

    new f = fopen(FILE_LINKED_USERS, "rt");
    if (!f) return;

    new szLine[128], szFileAuth[36], szFileTg[32];
    while (!feof(f)) {
        fgets(f, szLine, charsmax(szLine));
        trim(szLine);
        if (!szLine[0] || szLine[0] == ';' || szLine[0] == '#') continue;

        parse(szLine, szFileAuth, charsmax(szFileAuth), szFileTg, charsmax(szFileTg));
        if (equal(szAuth, szFileAuth)) {
            copy(g_szPlayerTg[id], charsmax(g_szPlayerTg[]), szFileTg);
            break;
        }
    }
    fclose(f);
}

stock SavePlayerLink(const szAuth[], const szTgUser[]) {
    // Append to linked_users.ini if not present
    new bool:found = false;
    if (file_exists(FILE_LINKED_USERS)) {
        new f = fopen(FILE_LINKED_USERS, "rt");
        if (f) {
            new szLine[128], szFileAuth[36], szFileTg[32];
            while (!feof(f)) {
                fgets(f, szLine, charsmax(szLine));
                trim(szLine);
                parse(szLine, szFileAuth, charsmax(szFileAuth), szFileTg, charsmax(szFileTg));
                if (equal(szAuth, szFileAuth)) {
                    found = true;
                    break;
                }
            }
            fclose(f);
        }
    }

    if (!found) {
        new f = fopen(FILE_LINKED_USERS, "at");
        if (f) {
            fprintf(f, "%s %s^n", szAuth, szTgUser);
            fclose(f);
        }
    }
}

public Cmd_TgConfirmSrv() {
    new szAuth[36], szTgUser[32];
    read_argv(1, szAuth, charsmax(szAuth));
    read_argv(2, szTgUser, charsmax(szTgUser));

    SavePlayerLink(szAuth, szTgUser);

    for (new id = 1; id <= MaxClients; id++) {
        if (!is_user_connected(id)) continue;
        new curAuth[36];
        get_user_authid(id, curAuth, charsmax(curAuth));
        if (equal(szAuth, curAuth)) {
            copy(g_szPlayerTg[id], charsmax(g_szPlayerTg[]), szTgUser);

            client_cmd(id, "spk items/suitchargeno1.wav");
            set_hudmessage(0, 255, 120, -1.0, 0.35, 1, 6.0, 5.0, 0.1, 0.2, -1);
            show_hudmessage(id, "★ АККАУНТ УСПЕШНО ПРИВЯЗАН! ★^nTelegram: %s", szTgUser);

            new szName[32];
            get_user_name(id, szName, charsmax(szName));
            client_print(0, print_chat, "[TELEGRAM] ★ Боец %s привязал профиль к Telegram: %s!", szName, szTgUser);
            server_print("[TELEGRAM] Linked %s (%s) to %s successfully!\n", szName, szAuth, szTgUser);
            break;
        }
    }
    return PLUGIN_HANDLED;
}

public Cmd_TgConfirm(id, level, cid) {
    if (!cmd_access(id, level, cid, 2)) return PLUGIN_HANDLED;
    return Cmd_TgConfirmSrv();
}

public Cmd_MainMenu(id) {
    if (!is_user_connected(id)) return PLUGIN_HANDLED;

    new szTitle[256];
    new money = cs_get_user_money(id);

    new szTgStatus[64];
    if (g_szPlayerTg[id][0]) {
        formatex(szTgStatus, charsmax(szTgStatus), "\y%s", g_szPlayerTg[id]);
    } else {
        copy(szTgStatus, charsmax(szTgStatus), "\rНет");
    }

    formatex(szTitle, charsmax(szTitle), "\y[WARFARE] \wМеню^n\dБаланс: \y$%d \d| TG: %s",
        money, szTgStatus);

    new menu = menu_create(szTitle, "MainMenu_Handler");

    menu_additem(menu, "Выбор класса \y[/class]", "1");
    menu_additem(menu, "Постройки & Дроны \y[/build]", "2");
    menu_additem(menu, "VIP Меню \y[/vip]", "3");
    menu_additem(menu, "Донат & Магазин \y[/donate]", "4");

    if (g_szPlayerTg[id][0]) {
        menu_additem(menu, "Кабинет TG \y[Инфо]", "5");
    } else {
        menu_additem(menu, "Привязать TG \r[Бонус]", "5");
    }

    menu_additem(menu, "Сменить команду \d[T/CT]", "6");
    menu_additem(menu, "Застрял? \r[/stuck]", "7");
    menu_additem(menu, "AirDrop припасы \y[/airdrop]", "8");

    menu_setprop(menu, MPROP_PERPAGE, 0);
    menu_setprop(menu, MPROP_EXITNAME, "Закрыть");
    menu_display(id, menu, 0);
    return PLUGIN_HANDLED;
}

public MainMenu_Handler(id, menu, item) {
    if (item == MENU_EXIT) {
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }

    new szData[6], szName[64], access, callback;
    menu_item_getinfo(menu, item, access, szData, charsmax(szData), szName, charsmax(szName), callback);
    new choice = str_to_num(szData);
    menu_destroy(menu);

    switch (choice) {
        case 1: client_cmd(id, "say /class");
        case 2: client_cmd(id, "say /build");
        case 3: client_cmd(id, "say /vip");
        case 4: client_cmd(id, "say /donate");
        case 5: ShowTelegramMenu(id);
        case 6: ShowTeamMenu(id);
        case 7: client_cmd(id, "say /stuck");
        case 8: client_cmd(id, "say /airdrop");
    }
    return PLUGIN_HANDLED;
}

public ShowTelegramMenu(id) {
    if (!is_user_connected(id)) return;

    new szAuth[36];
    get_user_authid(id, szAuth, charsmax(szAuth));

    if (g_szPlayerTg[id][0]) {
        // Already linked!
        new szTitle[512];
        formatex(szTitle, charsmax(szTitle),
            "\y[ВАШ ТЕЛЕГРАМ ПРОФИЛЬ]^n\wСтатус: \yАвторизован^n\wTelegram: \r%s^n\wSteamID: \d%s^n^n\dВаш профиль и привилегии защищены ботом @%s!",
            g_szPlayerTg[id], szAuth, BOT_USERNAME);

        new menu = menu_create(szTitle, "TgLinked_Handler");
        menu_additem(menu, "Открыть магазин привилегий в игре", "1");
        menu_setprop(menu, MPROP_EXITNAME, "Назад в меню");
        menu_display(id, menu, 0);
        return;
    }

    // Generate unique 4-digit code
    new code = random_num(1000, 9999);
    g_iPlayerAuthCode[id] = code;

    new szPlayerName[32];
    get_user_name(id, szPlayerName, charsmax(szPlayerName));

    // Save code to auth_codes.ini
    new f = fopen(FILE_AUTH_CODES, "at");
    if (f) {
        fprintf(f, "%d %s ^"%s^" %d^n", code, szAuth, szPlayerName, get_systime());
        fclose(f);
    }

    new szTitle[512];
    formatex(szTitle, charsmax(szTitle),
        "\y[АВТОРИЗАЦИЯ ЧЕРЕЗ TELEGRAM]^n\wВаш персональный код: \r%d^n^n\w1. Откройте в Telegram: \y@%s^n\w2. Отправьте боту этот код: \r%d^n\d(или напишите в боте: /bind %d)^n^n\dПривязка произойдет мгновенно!",
        code, BOT_USERNAME, code, code);

    new menu = menu_create(szTitle, "TgCode_Handler");
    menu_additem(menu, "Я отправил код боту (Обновить статус)", "1");
    menu_setprop(menu, MPROP_EXITNAME, "Закрыть");
    menu_display(id, menu, 0);

    client_print(id, print_chat, "[TELEGRAM] Ваш код привязки: %d | Отправьте боту: @%s", code, BOT_USERNAME);
}

public TgLinked_Handler(id, menu, item) {
    menu_destroy(menu);
    if (item == 0) {
        client_cmd(id, "say /donate");
    } else {
        Cmd_MainMenu(id);
    }
    return PLUGIN_HANDLED;
}

public TgCode_Handler(id, menu, item) {
    menu_destroy(menu);
    if (item == 0) {
        CheckPlayerLinked(id);
        if (g_szPlayerTg[id][0]) {
            client_print(id, print_chat, "[TELEGRAM] ★ Авторизация подтверждена! Добро пожаловать, %s!", g_szPlayerTg[id]);
        } else {
            client_print(id, print_chat, "[TELEGRAM] Код пока не подтвержден в боте. Отправьте код %d боту @%s!", g_iPlayerAuthCode[id], BOT_USERNAME);
        }
        Cmd_MainMenu(id);
    }
    return PLUGIN_HANDLED;
}

public ShowTeamMenu(id) {
    new menu = menu_create("\y[ВЫБОР КОМАНДЫ]:", "TeamMenu_Handler");
    menu_additem(menu, "Террористы (T)", "1");
    menu_additem(menu, "Спецназ (CT)", "2");
    menu_additem(menu, "Авто-выбор", "3");
    menu_additem(menu, "Наблюдатель (Спектатор)", "4");
    menu_setprop(menu, MPROP_EXITNAME, "Назад");
    menu_display(id, menu, 0);
}

public TeamMenu_Handler(id, menu, item) {
    if (item == MENU_EXIT) {
        menu_destroy(menu);
        Cmd_MainMenu(id);
        return PLUGIN_HANDLED;
    }

    new szData[6], szName[64], access, callback;
    menu_item_getinfo(menu, item, access, szData, charsmax(szData), szName, charsmax(szName), callback);
    new choice = str_to_num(szData);
    menu_destroy(menu);

    switch (choice) {
        case 1: engclient_cmd(id, "jointeam", "1");
        case 2: engclient_cmd(id, "jointeam", "2");
        case 3: engclient_cmd(id, "jointeam", "5");
        case 4: engclient_cmd(id, "jointeam", "6");
    }
    return PLUGIN_HANDLED;
}
