/*
    RAPORT
*/

#include <YSI_Coding\y_hooks>

#define RAPORT_HOURS_NEEDED             (4)

enum E_AUTOMATIC_RAPORT
{
    raport_time,
    raport_points,
    raport_extra_points,

    raport_reset_date
}

new raportVariables[MAX_PLAYERS][E_AUTOMATIC_RAPORT];

new groupRaports[MAX_GROUPS][7][2];

hook OnPlayerConnect(playerid)
{
    raportVariables[playerid][raport_time] = raportVariables[playerid][raport_points] = raportVariables[playerid][raport_extra_points] = raportVariables[playerid][raport_reset_date] = 0;
}

CB:LoadGroupRaports()
{
    if(!cache_num_rows()) return 1; 

    for(new x; x < cache_num_rows(); x++)
    {
        new group, rank, points, extra_points;
        cache_get_value_name_int(x, "group_id", group);
        cache_get_value_name_int(x, "rank", rank);
        cache_get_value_name_int(x, "points", points);
        cache_get_value_name_int(x, "extra_points", extra_points);

        groupRaports[group][rank][0] = points;
        groupRaports[group][rank][1] = extra_points;
    }  

    return 1;
}

CB:LoadPlayerRaport(playerid)
{
    if(!cache_num_rows()) return 1;

    cache_get_value_name_int(0, "minutes", raportVariables[playerid][raport_time]);

    cache_get_value_name_int(0, "points", raportVariables[playerid][raport_points]);
    cache_get_value_name_int(0, "extra_points", raportVariables[playerid][raport_extra_points]);

    cache_get_value_name_int(0, "reset_date", raportVariables[playerid][raport_reset_date]);
    return 1;
}

CB:UpdateGroupRaports(group, rank, extra, points)
{
    gQuery[0] = EOS;
    if(cache_num_rows())
    {
        mysql_format(SQL, gQuery, sizeof(gQuery), "UPDATE `group_raports` SET `%s` = '%d' WHERE `group_id` = '%d' AND `rank` = '%d'", extra ? "extra_points" : "points", points, group, rank);
    }

    else
    {
        mysql_format(SQL, gQuery, sizeof(gQuery), "INSERT INTO `group_raports` (`%s`, `group_id`, `rank`) VALUES ('%d', '%d', '%d')", extra ? "extra_points" : "points", points, group, rank);
    }

    mysql_tquery(SQL, gQuery, "", "");
    return 1;
}

CB:ResetPlayerRaports()
{
    if(!cache_num_rows()) return 1;

    new user_id, minutes, points, extra_points;
    for(new x; x < cache_num_rows(); x++)
    {
        cache_get_value_name_int(x, "user_id", user_id);

        cache_get_value_name_int(x, "minutes", minutes);
        cache_get_value_name_int(x, "points", points);
        cache_get_value_name_int(x, "extra_points", extra_points);  

        inline GetMemberData()
        {
            new nick[MAX_PLAYER_NAME + 1], group, rank, fw;
            cache_get_value_name(0, "playerName", nick);

            cache_get_value_name_int(0, "playerGroup", group);
            cache_get_value_name_int(0, "playerGroupRank", rank);
            cache_get_value_name_int(0, "playerFactionWarns", fw);

            if(rank < 7)
            {
                // uninvite ca n are ore sau ca n-are destule puncte
                if(minutes < RAPORT_HOURS_NEEDED * 60 || points < groupRaports[group][rank][0] || points < groupRaports[group][rank][1])
                {
                    gQuery[0] = EOS;
                    mysql_format(SQL, gQuery, sizeof(gQuery), "SELECT * FROM `server_accounts` WHERE `playerID` = '%d'", user_id);
                    mysql_pquery(SQL, gQuery, "UninvitePlayer", "isis", user_id, "AdmBot", rank < 2 ? 20 : 0, "incomplete faction raport");
                }

                else
                {
                    gString[0] = EOS;
                    if(rank < 5)
                    {
                        if(fw)
                        {
                            fw--;

                            foreach(new playerid : Player)
                            {
                                if(playerVariables[playerid][pSQLID] == user_id)
                                {
                                    playerVariables[playerid][pGroupRank] = rank;

                                    SCM(playerid, COLOR_YELLOW, "* Ai scapat de un faction warn!");
                                    break;
                                }
                            }

                            format(gString, sizeof(gString), "* %s[user:%d] completed his raport activity and lost a faction warn.", nick, user_id);

                            gQuery[0] = EOS;
                            mysql_format(SQL, gQuery, sizeof(gQuery), "UPDATE `server_accounts` SET `playerFactionWarns` = '%d' WHERE `playerID` = '%d'", fw, user_id);
                            mysql_tquery(SQL, gQuery, "", "");
                        }

                        else
                        {
                            format(gString, sizeof(gString), "* %s[user:%d] completed his raport activity and his rank was changed from %d to %d.", nick, user_id, rank, rank + 1);

                            rank++;

                            gQuery[0] = EOS;
                            mysql_format(SQL, gQuery, sizeof(gQuery), "UPDATE `server_accounts` SET `playerGroupRank` = '%d' WHERE `playerID` = '%d'", rank, user_id);
                            mysql_tquery(SQL, gQuery, "", "");

                            foreach(new playerid : Player)
                            {
                                if(playerVariables[playerid][pSQLID] == user_id)
                                {
                                    playerVariables[playerid][pGroupRank] = rank;

                                    SCM(playerid, COLOR_YELLOW, "* Ai primit rank up!");
                                    break;
                                }
                            }
                        }
                    }
                    
                    else format(gString, sizeof(gString), "* %s[user:%d] completed his raport activity, rank not changed.", nick, user_id);

                    SendGroupMessage(group, COLOR_TEAL, gString);

                    gQuery[0] = EOS;
                    mysql_format(SQL, gQuery, sizeof(gQuery), "insert into `logs_factions` (Player, Date, Log, ShowInFH) values ('%d', '%d', '%e', '1')", user_id, gettime(), gString);
                    mysql_tquery(SQL, gQuery, "", "");

                    minutes -= RAPORT_HOURS_NEEDED * 60;
                    if(minutes >= RAPORT_HOURS_NEEDED * 60) minutes = RAPORT_HOURS_NEEDED * 60;

                    points -= groupRaports[group][rank][0];
                    if(points >= groupRaports[group][rank][0]) points = groupRaports[group][rank][0];

                    extra_points -= groupRaports[group][rank][1];
                    if(extra_points >= groupRaports[group][rank][1]) extra_points = groupRaports[group][rank][1];

                    new reset_date = gettime() + (86400 * 7);
                    foreach(new playerid : Player)
                    {
                        if(playerVariables[playerid][pSQLID] == user_id)
                        {
                            raportVariables[playerid][raport_time] = minutes;

                            raportVariables[playerid][raport_points] = points;
                            raportVariables[playerid][raport_extra_points] = extra_points;
                            raportVariables[playerid][raport_reset_date] = reset_date;
                            break;
                        }
                    }


                    gQuery[0] = EOS;
                    mysql_format(SQL, gQuery, sizeof(gQuery), "UPDATE `faction_raport` SET `minutes` = '%d', `points` = '%d', `extra_points` = '%d', `reset_date` = '%d' WHERE `user_id` = '%d'", minutes, points, extra_points, reset_date, user_id);
                    mysql_tquery(SQL, gQuery, "", "");
                }
            }
        }

        new string[300];
        mysql_format(SQL, string, sizeof(string), "SELECT server_accounts.playerName, server_accounts.playerGroup, server_accounts.playerGroupRank, server_accounts.playerFactionWarns FROM `server_accounts` INNER JOIN `faction_raport` ON faction_raport.user_id = server_accounts.playerID WHERE faction_raport.user_id = %d", user_id);
        MySQL_PQueryInline(SQL, using inline GetMemberData, string, "");
    }

    return 1;
}

CB:UninvitePlayer(user, admin[], fp, reason[])
{
    if(!cache_num_rows()) return 1;

    new nick[MAX_PLAYER_NAME], group, rank, join;
    cache_get_value_name(0, "playerName", nick);
    cache_get_value_name_int(0, "playerGroup", group);
    cache_get_value_name_int(0, "playerGroupRank", rank);
    cache_get_value_name_int(0, "playerGroupJoin", join);

    new days = (gettime() - join) / 86400;
    new fp_txt[16];
    format(fp_txt, 16, "with %d FP", fp);

    gString[0] = EOS;
	format(gString, sizeof(gString), "%s has been uninvited by %s from %s (rank %i), %s, after %d days, reason: %s.", nick, admin, groupVariables[group][gName], rank, fp > 0 ? fp_txt : "without FP", days, reason);
	SendGroupMessage(group, COLOR_TEAL, gString);
    SendAdminMessage(COLOR_TEAL, gString);

	gQuery[0] = EOS;
	mysql_format(SQL, gQuery, sizeof(gQuery), "insert into `logs_factions` (Player, Date, Log, ShowInFH) values ('%d', '%d', '%e', '1')", user, gettime(), gString);
	mysql_tquery(SQL, gQuery, "", "");

	gQuery[0] = EOS;
	mysql_format(SQL, gQuery, sizeof(gQuery), "update `server_accounts` set `playerGroup` = '0', `playerGroupRank` = '0', `playerGroupJoin` = '0', `playerFactionPunish` = '0', `playerFactionWarns` = '0' where `playerID` = '%d'", user);
	mysql_tquery(SQL, gQuery, "", "");

    gQuery[0] = EOS;
    mysql_format(SQL, gQuery, sizeof(gQuery), "DELETE FROM `faction_raport` WHERE `user_id` = '%d'", user);
    mysql_tquery(SQL, gQuery, "", "");

    foreach(new playerid : Player)
    {
        if(playerVariables[playerid][pSQLID] == user)
        {
            playerVariables[playerid][pGroup] = 0;
            playerVariables[playerid][pGroupRank] = 0;
            playerVariables[playerid][pGroupJoin] = 0;
            playerVariables[playerid][pFactionWarns] = 0;
            playerVariables[playerid][pFactionPunish] = 0;
            SetPlayerColorEx(playerid);
            SetPlayerSkin(playerid, playerVariables[playerid][pSkin]);
            SpawnPlayer(playerid);
            break;
        }
    }
    return 1;
}

stock ResetPlayerRaport(playerid)
{
    raportVariables[playerid][raport_time] = raportVariables[playerid][raport_points] = raportVariables[playerid][raport_extra_points] = raportVariables[playerid][raport_reset_date] = 0;

    gQuery[0] = EOS;
    mysql_format(SQL, gQuery, sizeof(gQuery), "DELETE FROM `faction_raport` WHERE `user_id` = '%d'", playerVariables[playerid][pSQLID]);
    mysql_tquery(SQL, gQuery, "", "");

    return 1;
}

stock GiveRaportPoints(playerid, extra, points)
{
    new group = playerVariables[playerid][pGroup];
    if(!group) return 1;

    new rank = playerVariables[playerid][pGroupRank];

    if(points)
    {
        if(!extra) 
        {
            raportVariables[playerid][raport_points] += points;

            if(groupRaports[group][rank][0] > 0)
            {
                switch(groupVariables[group][gType])
                {
                    // pd
                    case 1:
                    {
                        SCM(playerid, COLOR_WHITE, "Suspecti arestati/omorati: "EMBED_SERVER"%d/%d", raportVariables[playerid][raport_points], groupRaports[group][rank][0]);
                    }

                    case 2:
                    {
                        SCM(playerid, COLOR_WHITE, "Heal-uri acordate: "EMBED_SERVER"%d/%d", raportVariables[playerid][raport_points], groupRaports[group][rank][0]);
                    }

                    case 3:
                    {
                        SCM(playerid, COLOR_WHITE, "Anunturi plasate: "EMBED_SERVER"%d/%d", raportVariables[playerid][raport_points], groupRaports[group][rank][0]);
                    }

                    case 4:
                    {
                        SCM(playerid, COLOR_WHITE, "Contracte efectuate: "EMBED_SERVER"%d/%d", raportVariables[playerid][raport_points], groupRaports[group][rank][0]);
                    }

                    case 5:
                    {
                        SCM(playerid, COLOR_WHITE, "Materiale colectate: "EMBED_SERVER"%d/%d", raportVariables[playerid][raport_points], groupRaports[group][rank][0]);
                    }

                    case 6:
                    {
                        SCM(playerid, COLOR_WHITE, "Licente acordate: "EMBED_SERVER"%d/%d", raportVariables[playerid][raport_points], groupRaports[group][rank][0]);
                    }
                }
            }
        }

        else 
        {
            raportVariables[playerid][raport_extra_points] += points;

            if(groupRaports[group][rank][1] > 0)
            {
                switch(groupVariables[group][gType])
                {
                    // pd
                    case 1:
                    {
                        SCM(playerid, COLOR_WHITE, "Licente confiscate: "EMBED_SERVER"%d/%d", raportVariables[playerid][raport_extra_points], groupRaports[group][rank][1]);
                    }

                    case 3:
                    {
                        SCM(playerid, COLOR_WHITE, "Interviuri acordate: "EMBED_SERVER"%d/%d", raportVariables[playerid][raport_extra_points], groupRaports[group][rank][1]);
                    }

                    case 5:
                    {
                        SCM(playerid, COLOR_WHITE, "Droguri recoltate: "EMBED_SERVER"%d/%d", raportVariables[playerid][raport_extra_points], groupRaports[group][rank][1]);
                    }
                }
            }
        }
    }

    inline updateRaport()
    {
        gQuery[0] = EOS;

        // daca nu exista nicio linie, sa insereze, daca exista, updateaza
        if(!cache_num_rows())
        {   
            raportVariables[playerid][raport_reset_date] = gettime() + (86400 * 7);

            mysql_format(SQL, gQuery, sizeof(gQuery), "INSERT INTO `faction_raport` (`user_id`, `minutes`, `points`, `extra_points`, `reset_date`) VALUES ('%d', '%d', '%d', '%d', '%d')", playerVariables[playerid][pSQLID], raportVariables[playerid][raport_time], raportVariables[playerid][raport_points], raportVariables[playerid][raport_extra_points], raportVariables[playerid][raport_reset_date]);
        }

        else
        {
            mysql_format(SQL, gQuery, sizeof(gQuery), "UPDATE `faction_raport` SET `minutes` = '%d', `points` = '%d', `extra_points` = '%d' WHERE `user_id` = '%d'", raportVariables[playerid][raport_time], raportVariables[playerid][raport_points], raportVariables[playerid][raport_extra_points], playerVariables[playerid][pSQLID]);
        }

        mysql_tquery(SQL, gQuery, "", "");
    }

    gQuery[0] = EOS;
    mysql_format(SQL, gQuery, sizeof(gQuery), "SELECT * FROM `faction_raport` WHERE `user_id` = '%d' LIMIT 1", playerVariables[playerid][pSQLID]);
    MySQL_PQueryInline(SQL, using inline updateRaport, gQuery, "");

    return 1;
}

CB:GiveRaportHours(playerid)
{
    if(playerVariables[playerid][pGroup] && playerVariables[playerid][pGroupRank] < 7)
	{
		raportVariables[playerid][raport_time] += playerVariables[playerid][pSeconds] / 60;

		SCM(playerid, COLOR_YELLOW, "Ore jucate: %s/04:00", ConvertToMinutes(raportVariables[playerid][raport_time]));

		GiveRaportPoints(playerid, 0, 0);
	}

    return 1;
}

CMD:raport(playerid, params[])
{
    new group = playerVariables[playerid][pGroup];

    if(!group)
    {
        return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You are not the member of a faction.");
    }


    new rank = playerVariables[playerid][pGroupRank];
    if(rank < 7)
    {
        SCM(playerid, COLOR_SERVER, "[FACTION RAPORT]");
        SCM(playerid, COLOR_WHITE, "Ore jucate: "EMBED_SERVER"%s/%02d:00", ConvertToMinutes(raportVariables[playerid][raport_time]), RAPORT_HOURS_NEEDED);

        if(groupRaports[group][rank][0] > 0)
        {
            switch(groupVariables[group][gType])
            {
                // pd
                case 1:
                {
                    SCM(playerid, COLOR_WHITE, "Suspecti arestati/omorati: "EMBED_SERVER"%d/%d", raportVariables[playerid][raport_points], groupRaports[group][rank][0]);
                }

                case 2:
                {
                    SCM(playerid, COLOR_WHITE, "Heal-uri acordate: "EMBED_SERVER"%d/%d", raportVariables[playerid][raport_points], groupRaports[group][rank][0]);
                }

                case 3:
                {
                    SCM(playerid, COLOR_WHITE, "Anunturi plasate: "EMBED_SERVER"%d/%d", raportVariables[playerid][raport_points], groupRaports[group][rank][0]);
                }

                case 4:
                {
                    SCM(playerid, COLOR_WHITE, "Contracte efectuate: "EMBED_SERVER"%d/%d", raportVariables[playerid][raport_points], groupRaports[group][rank][0]);
                }

                case 5:
                {
                    SCM(playerid, COLOR_WHITE, "Materiale colectate: "EMBED_SERVER"%d/%d", raportVariables[playerid][raport_points], groupRaports[group][rank][0]);
                }

                case 6:
                {
                    SCM(playerid, COLOR_WHITE, "Licente acordate: "EMBED_SERVER"%d/%d", raportVariables[playerid][raport_points], groupRaports[group][rank][0]);
                }
            }
        }

        if(groupRaports[group][rank][1] > 0)
        {
            switch(groupVariables[group][gType])
            {
                // pd
                case 1:
                {
                    SCM(playerid, COLOR_WHITE, "Licente confiscate: "EMBED_SERVER"%d/%d", raportVariables[playerid][raport_extra_points], groupRaports[group][rank][1]);
                }

                case 3:
                {
                    SCM(playerid, COLOR_WHITE, "Interviuri acordate: "EMBED_SERVER"%d/%d", raportVariables[playerid][raport_extra_points], groupRaports[group][rank][1]);
                }

                case 5:
                {
                    SCM(playerid, COLOR_WHITE, "Droguri recoltate: "EMBED_SERVER"%d/%d", raportVariables[playerid][raport_extra_points], groupRaports[group][rank][1]);
                }
            }
        }
    }

    else
    {
        return SCM(playerid, COLOR_WHITE, "Nu ai raport de facut :).");
    }

    new time_left = raportVariables[playerid][raport_reset_date] - gettime();

    if(time_left > 0)
    {
        new days, hours, minutes, seconds;
        days = time_left / 86400;
        time_left -= days * 86400;

        hours = time_left / 3600;
        time_left -= hours * 3600;

        minutes = time_left / 60;
        time_left -= minutes * 60;

        seconds = time_left;

        new timp_ramas[64];
        if(days) format(timp_ramas, 64, "%d %s, %02d ore, %02d minute, %02d secunde", days, days == 1 ? "zi" : "zile", hours, minutes, seconds);
        else
        {
            if(hours) format(timp_ramas, 64, "%02d ore, %02d minute, %02d secunde", hours, minutes, seconds);
            else
            {
                format(timp_ramas, 64, "%02d:%02d", minutes, seconds);
            }
        }

        SCM(playerid, COLOR_WHITE, "Timp ramas pana la resetarea raportului: "EMBED_SERVER"%s", timp_ramas);
    }

    else
    {
        SCM(playerid, COLOR_WHITE, "Raportul tau va fi resetat in cateva minute...");
    }
    return 1;
}

CMD:setraport(playerid, params[])
{
    check_owner

    new group, rank, extra, points;
    if(sscanf(params, "dddd", group, rank, extra, points))
    {
        return SCM(playerid, COLOR_GREY, "Syntax: "EMBED_WHITE"/setraport [group] [rank (1-7)] [extra (0 - main / 1 - secondary)] [points]");
    }

    if(group < 1 || group > MAX_GROUPS)
    {
        return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"Invalid group.");
    }

    if(rank < 1 || rank > 6)
    {
        return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"Invalid rank.");
    }

    groupRaports[group][rank][extra] = points;

    SCM(playerid, COLOR_YELLOW, "Ai schimbat raportul la rank %d pentru factiunea %s in %d puncte.", rank, groupVariables[group][gName], points);

    new query[128];
    mysql_format(SQL, query, sizeof(query), "SELECT `id` FROM `group_raports` WHERE `group_id` = '%d' AND `rank` = '%d'", group, rank);
    mysql_tquery(SQL, query, "UpdateGroupRaports", "iiii", group, rank, extra, points);
    return 1;
}

// SELECT server_accounts.playerID, server_accounts.playerName, server_accounts.playerGroup, server_accounts.playerGroupRank FROM `server_accounts` INNER JOIN `faction_raport` ON faction_raport.user_id = server_accounts.playerID WHERE faction_raport.reset_date <= %d;

task ProcessGroupRaports[60000]()
{
    gQuery[0] = EOS;
    mysql_format(SQL, gQuery, sizeof(gQuery), "SELECT * FROM `faction_raport` WHERE reset_date <= %d;", gettime());
    mysql_tquery(SQL, gQuery, "ResetPlayerRaports", "");
}

CMD:testraport(playerid, params[])
{
    check_owner

    raportVariables[playerid][raport_reset_date] = gettime() + 20;

    gQuery[0] = EOS;
    mysql_format(SQL, gQuery, sizeof(gQuery), "UPDATE `faction_raport` SET `reset_date` = '%d' WHERE `user_id` = '%d'", gettime() + 20, playerVariables[playerid][pSQLID]);
    mysql_tquery(SQL, gQuery, "", "");
    return 1;
}

CMD:testraport2(playerid, params[])
{
    check_owner

    gQuery[0] = EOS;
    mysql_format(SQL, gQuery, sizeof(gQuery), "SELECT * FROM `faction_raport` WHERE reset_date <= %d;", gettime());
    mysql_tquery(SQL, gQuery, "ResetPlayerRaports", "");
    return 1;
}