/*
    SQUESTS
*/

#include <YSI_Coding\y_hooks>

enum E_SQUESTS
{
    squest_id,
    squest_type,
    squest_start,
    squest_end,
    squest_prop_id,
    squest_progress,
    squest_prize_type, // 0 - at finish / 1 - per point
    squest_prize_amount
}

new SeasonQuests[25][E_SQUESTS], Iterator:season_quests<25>;

new SeasonQuestsProgress[MAX_PLAYERS][25];

hook OnPlayerDisconnect(playerid, reason)
{
    for(new x; x < 25; x++) SeasonQuestsProgress[playerid][x] = 0;
}  

CB:LoadSeasonQuestsProgress(playerid)
{
    new squest;
    for(new x; x < cache_num_rows(); x++)
    {
        cache_get_value_name_int(x, "squest_id", squest);

        foreach(new y : season_quests)
        {
            if(SeasonQuests[y][squest_id] == squest)
            {
                cache_get_value_name_int(x, "progress", SeasonQuestsProgress[playerid][y]);
                break;
            }
        }
    }
}

CB:LoadSeasonQuests()
{
    Iter_Clear(season_quests);

    for(new x; x < cache_num_rows(); x++)
    {
        Iter_Add(season_quests, x);

        cache_get_value_name_int(x, "id", SeasonQuests[x][squest_id]);
        cache_get_value_name_int(x, "type", SeasonQuests[x][squest_type]);
        cache_get_value_name_int(x, "start", SeasonQuests[x][squest_start]);
        cache_get_value_name_int(x, "end", SeasonQuests[x][squest_end]);
        cache_get_value_name_int(x, "prop_id", SeasonQuests[x][squest_prop_id]);
        cache_get_value_name_int(x, "progress", SeasonQuests[x][squest_progress]);
        cache_get_value_name_int(x, "prize_type", SeasonQuests[x][squest_prize_type]);
        cache_get_value_name_int(x, "prize_amount", SeasonQuests[x][squest_prize_amount]);
    }

    return 1;
}

CB:TryToUpdateSQuestProgress(playerid, sq_id, progress)
{
    gQuery[0] = EOS;
    if(cache_num_rows())
    {
        new old_progress;
        cache_get_value_name_int(0, "old_progress", old_progress);

        mysql_format(SQL, gQuery, sizeof(gQuery), "UPDATE `squests_progress` SET `progress` = '%d' WHERE `squest_id` = '%d' AND `user_id` = '%d'", old_progress + progress, sq_id, playerVariables[playerid][pSQLID]);
    }

    else
    {
        mysql_format(SQL, gQuery, sizeof(gQuery), "INSERT INTO `squests_progress` (`squest_id`, `user_id`, `progress`) VALUES ('%d', '%d', '%d')", sq_id, playerVariables[playerid][pSQLID], progress);        
    }

    mysql_tquery(SQL, gQuery, "", "");
    return 1;
}

stock OnSeasonQuestsProgress(playerid, type, prop_id, amount)
{
    if(!IsBattlepassActive()) return 1;

    foreach(new x : season_quests)
    {
        if(SeasonQuests[x][squest_type] == type && SeasonQuests[x][squest_prop_id] == prop_id && SeasonQuestsProgress[playerid][x] < SeasonQuests[x][squest_progress])
        {
            SeasonQuestsProgress[playerid][x] += amount;

            if(type != SQ_TYPE_KM)
            {
                SendClientMessage(playerid, COLOR_YELLOW, "[Season Quest Progress]");
                SCM(playerid, COLOR_YELLOW, "%s | Progress: %d/%d", GetSeasonQuestName(x), SeasonQuestsProgress[playerid][x], SeasonQuests[x][squest_progress]);
            }
            

            if(!SeasonQuests[x][squest_prize_type])
            {
                GiveBattlepassXP(playerid, SeasonQuests[x][squest_prize_amount]);
                SCM(playerid, COLOR_YELLOW, "+%d XP", SeasonQuests[x][squest_prize_amount]);
            }

            if(SeasonQuestsProgress[playerid][x] >= SeasonQuests[x][squest_progress])
            {
                if(SeasonQuests[x][squest_prize_type])
                {
                    GiveBattlepassXP(playerid, SeasonQuests[x][squest_prize_amount]);

                    SCM(playerid, COLOR_YELLOW, "Quest-ul '%s' a fost finalizat! Ai primit %d XP.", GetSeasonQuestName(x), SeasonQuests[x][squest_progress]);
                }
            }

            gQuery[0] = EOS;
            mysql_format(SQL, gQuery, sizeof(gQuery), "SELECT `id`, `progress` FROM `squests_progress` WHERE `user_id` = '%d' AND `squest_id` = '%d'", playerVariables[playerid][pSQLID], SeasonQuests[x][squest_id]);
            mysql_pquery(SQL, gQuery, "TryToUpdateSQuestProgress", "iii", playerid, SeasonQuests[x][squest_id], SeasonQuestsProgress[playerid][x]);
        }
    }

    return 1;
}

stock GetSeasonQuestName(x)
{
    new name[64], need = SeasonQuests[x][squest_progress];
    switch(SeasonQuests[x][squest_type])
    {
        case SQ_TYPE_CHILLIAD: format(name, sizeof(name), "Viziteaza muntele Chilliad");
        case SQ_TYPE_FIND: format(name, sizeof(name), "Localizeaza %d jucatori", need);
        case SQ_TYPE_SEXSHOP: format(name, sizeof(name), "Cumpara %d iteme dintr-un sex shop", need);
        case SQ_TYPE_24_7_STORE: format(name, sizeof(name), "Cumpara %d iteme dintr-un magazin", need);
        case SQ_TYPE_REPORT: format(name, sizeof(name), "Trimite %d reporturi", need);
        case SQ_TYPE_NEWBIE: format(name, sizeof(name), "Plaseaza %d intrebari pe /n", need);
        case SQ_TYPE_KM: format(name, sizeof(name), "Mergi %d minute cu un vehicul de tip %s", need / 60, vehNames[SeasonQuests[x][squest_prop_id] - 400]);
        case SQ_TYPE_COP_KILL: format(name, sizeof(name), "Omoara %d politisti", need);
        case SQ_TYPE_GUNSHOP: format(name, sizeof(name), "Cumpara arme de %d ori", need);
        case SQ_TYPE_DAILY_QUESTS: format(name, sizeof(name), "Finalizeaza %d quest-uri zilnice", need);
        case SQ_TYPE_AD: format(name, sizeof(name), "Plaseaza %d anunturi (/ad)", need);
        case SQ_TYPE_VEH_SLOT: format(name, sizeof(name), "Obtine %d sloturi de vehicule", need);
        case SQ_TYPE_HIDD: format(name, sizeof(name), "Obtine %d culori hidden", need);
        case SQ_TYPE_VIP: format(name, sizeof(name), "Upgradeaza un vehicul la VIP de %d ori", need);
        case SQ_TYPE_JOB:
        {
            switch(SeasonQuests[x][squest_prop_id])
            {
                case 1: format(name, sizeof(name), "Livreaza %d colete", need);
                case 2: format(name, sizeof(name), "Livreaza %d cutii cu arme", need);
                case 3: format(name, sizeof(name), "Livreaza %d ziare", need);
                case 4: format(name, sizeof(name), "Aseaza haine pe raft de %d ori", need);
                case 5: format(name, sizeof(name), "Prinde %d pesti", need);
                case 7: format(name, sizeof(name), "Alimenteaza %d aparate cu suc", need);
            }
        }
        case SQ_TYPE_LICENCE: format(name, sizeof(name), "Cumpara %d licente", need);
        case SQ_TYPE_ROULETTE: format(name, sizeof(name), "Pariaza de %d ori la ruleta", need);
        case SQ_TYPE_DICE: format(name, sizeof(name), "Joaca barbut de %d ori", need);
        case SQ_TYPE_DEPOSIT: format(name, sizeof(name), "Realizeaza %d depozite bancare", need);
        case SQ_TYPE_TRANSFER: format(name, sizeof(name), "Realizeaza %d transferuri de bani", need);
        case SQ_TYPE_PAYDAY: format(name, sizeof(name), "Obtine %d payday-uri", need);
    }

    return name;
}

stock ShowSeasonQuests(playerid)
{
    new dialog[2048] = "--- \n", prize[48];
 
    if(!Iter_Count(season_quests)) dialog[0] = EOS;
    foreach(new x : season_quests)
    {
        if(SeasonQuests[x][squest_prize_type])
        {
            format(prize, sizeof(prize), "%d XP at finish", SeasonQuests[x][squest_prize_amount]);
        }
        else format(prize, sizeof(prize), "%d XP / point", SeasonQuests[x][squest_prize_amount]);

        format(dialog, sizeof(dialog), "%s{33AA33}season\t{FFFFFF}%s\t%d/%d\t%s\n", dialog, GetSeasonQuestName(x), SeasonQuestsProgress[playerid][x], SeasonQuests[x][squest_type] == _:SQ_TYPE_KM ? SeasonQuests[x][squest_progress] / 60 : SeasonQuests[x][squest_progress], prize);
    }

    return dialog;
}

task CheckSeasonQuests[60000]()
{
    gQuery[0] = EOS;
    mysql_format(SQL, gQuery, sizeof(gQuery), "SELECT * FROM `squests` WHERE `end` > %d AND `start` < %d", gettime(), gettime());
    mysql_pquery(SQL, gQuery, "LoadSeasonQuests", "");
}

CMD:addsquest(playerid, params[])
{
    if(playerVariables[playerid][pAdminLevel] < 6) return 1;

    new type, progress, prop_id, prize_amount, prize_type, end;
    if(sscanf(params, "iiiiii", type, progress, prop_id, prize_type, prize_amount, end))
    {
        return SendClientMessage(playerid, COLOR_ERROR, "/addsquest [type] [need] [prop_id] [prize_type: 0 - per point, 1 - at finish] [XP amount] [end in x days]");
    }

    gQuery[0] = EOS;
    mysql_format(SQL, gQuery, sizeof(gQuery), "INSERT INTO `squests` (`type`, `progress`, `prop_id`, `prize_type`, `prize_amount`, `start`, `end`) VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d')", type, progress, prop_id, prize_type, prize_amount, gettime() - 20, (end * 86400) + gettime());
    mysql_tquery(SQL, gQuery, "", "");

    SendClientMessage(playerid, COLOR_YELLOW, "Season quest added!");

    gQuery[0] = EOS;
    mysql_format(SQL, gQuery, sizeof(gQuery), "SELECT * FROM `squests` WHERE `end` > %d AND `start` < %d", gettime(), gettime());
    mysql_pquery(SQL, gQuery, "LoadSeasonQuests", "");
    return 1;
}