/**
    История изменений:
        1.0.0 (19.12.2024) by b0t.
            - Релиз;
*/
new const VERSION[] = "1.0.0"

#include <amxmodx>
#include <amxmisc>
#include <reapi>

#include <fvault>
#include <time>

new const g_szConfigsName[] = "ColorFlash.ini"
new const g_szNvaultDataBaseName[] = "ColorFlash";

enum _:RGB {
    Float:R,Float:G,Float:B
};

enum _:eColorStruct {
    MENU_NAME[256],
    Float:COLOR[RGB]
};

new
    Array:g_a_Colors,
    g_aData[eColorStruct],
    g_iMaxSize;

new
    p_iUseColor[33],
    p_szAuthId[33][64];

public plugin_init() {
    register_plugin("Color Flash",VERSION,"b0t.");

    fvault_prune(g_szNvaultDataBaseName,0,get_systime() - (SECONDS_IN_DAY*30));

    new szConfigsDir[128];
    get_configsdir(szConfigsDir,charsmax(szConfigsDir));

    add(szConfigsDir,charsmax(szConfigsDir),"/");
    add(szConfigsDir,charsmax(szConfigsDir),g_szConfigsName);

    g_a_Colors = ArrayCreate(eColorStruct);

    Func__CreteFile(szConfigsDir);

    new INIParser:iParser = INI_CreateParser();

    INI_SetReaders(iParser,"OnKeyValue");
    INI_ParseFile(iParser,szConfigsDir);
    INI_DestroyParser(iParser);

    g_iMaxSize = ArraySize(g_a_Colors);

    register_clcmd("flash","ClCmd__OpenMenu");
    register_clcmd(fmt("say /flash"),"ClCmd__OpenMenu");
    register_clcmd(fmt("say_team /flash"),"ClCmd__OpenMenu");

    RegisterHookChain(RG_PlayerBlind,"PlayerBlind_Pre", .post = false);
}

public ClCmd__OpenMenu(const id) {
    if(!g_iMaxSize) {
        return PLUGIN_HANDLED;
    }
    
    new iMenu = menu_create("\wВыбор цвета","FlashMenu__Handler");

    menu_additem(iMenu,fmt("\%cСтандарт^n",p_iUseColor[id] == NULLENT ? 'd' : 'r'));

    for(new i;i<g_iMaxSize;++i) {
        ArrayGetArray(g_a_Colors,i,g_aData);

        if(i == p_iUseColor[id]) {
            add(g_aData[MENU_NAME],charsmax(g_aData[MENU_NAME])," \r[Используется]");
        }

        menu_additem(iMenu,g_aData[MENU_NAME]);
    }

    menu_setprop(iMenu,MPROP_NEXTNAME,"Назад");
    menu_setprop(iMenu,MPROP_EXITNAME,"Далее");
    menu_setprop(iMenu,MPROP_BACKNAME,"Выход");

    menu_setprop(iMenu,MPROP_NUMBER_COLOR,"\y");

    menu_display(id,iMenu);

    return PLUGIN_HANDLED;
}

public FlashMenu__Handler(const id,iMenu,iItem) {
    menu_destroy(iMenu);

    if(iItem == MENU_EXIT) {
        return PLUGIN_HANDLED;
    }

    iItem--;

    p_iUseColor[id] = iItem;
    fvault_set_data(g_szNvaultDataBaseName,p_szAuthId[id],fmt("%i",p_iUseColor[id]));

    ClCmd__OpenMenu(id);

    if(iItem != NULLENT) {
        ArrayGetArray(g_a_Colors,iItem,g_aData);
    }
    else {
        formatex(g_aData[MENU_NAME],charsmax(g_aData[MENU_NAME]),"Стандарт");
    }

    client_print_color(id,print_team_default,"^3[^4ColorFlash^3]^1 Вы изменили цвет флешки на ^4%s",g_aData[MENU_NAME]);

    return PLUGIN_HANDLED;
}

public PlayerBlind_Pre(const pVictim,const inflictor,const attacker,const Float:fadeTime,const Float:fadeHold,const alpha,Float:color[3]) {
    switch(TeamName:get_member(pVictim,m_iTeam)) {
        case TEAM_TERRORIST,TEAM_CT: {
            if(p_iUseColor[pVictim] != NULLENT) {
                ArrayGetArray(g_a_Colors,p_iUseColor[pVictim],g_aData);

                color[R] = g_aData[COLOR][R];
                color[G] = g_aData[COLOR][G];
                color[B] = g_aData[COLOR][B];
            }
        }
    }

    return HC_CONTINUE;
}

public client_putinserver(id) {
    get_user_authid(id,p_szAuthId[id],charsmax(p_szAuthId[]));
    
    p_iUseColor[id] = NULLENT;

    new szData[5];
    if(fvault_get_data(g_szNvaultDataBaseName,p_szAuthId[id],szData,charsmax(szData))) {
        p_iUseColor[id] = str_to_num(szData);

        fvault_touch(g_szNvaultDataBaseName,p_szAuthId[id]);
    }
}

public Func__CreteFile(const szFile[]) {
    if(file_exists(szFile)) {
        return;
    }

    write_file(szFile,";^"Имя цвета в меню^" ^"R G B^"");
}

public bool:OnKeyValue(INIParser:handle, const key[], const value[]) {
    if(key[0] == '"') {
        new szColorsData[256];
        parse(key,
            g_aData[MENU_NAME],charsmax(g_aData[MENU_NAME]),
            szColorsData,charsmax(szColorsData)
        );

        new szColors[RGB][256];
        parse(szColorsData,
            szColors[R],charsmax(szColors[]),
            szColors[G],charsmax(szColors[]),
            szColors[B],charsmax(szColors[])
        );

        g_aData[COLOR][R] = str_to_float(szColors[R]);
        g_aData[COLOR][G] = str_to_float(szColors[G]);
        g_aData[COLOR][B] = str_to_float(szColors[B]);

        ArrayPushArray(g_a_Colors,g_aData);
    }

    return true;
}