/*
    HITMAN AGENCY
*/

#include <YSI_Coding\y_hooks>

#define check_hitman                    if(!IsAHitman(playerid)) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You are not a hitman.");

new ContractHitman[MAX_PLAYERS],
    ContractPlayer[MAX_PLAYERS],
    ContractValue[MAX_PLAYERS];

new Iterator:contracts<MAX_PLAYERS>;

hook OnPlayerConnect(playerid)  
{
    ContractPlayer[playerid] = INVALID_PLAYER_ID;
    ContractHitman[playerid] = INVALID_PLAYER_ID;
}

hook OnPlayerDisconnect(playerid, reason)
{
    if(ContractValue[playerid] > 0 && ContractHitman[playerid] != INVALID_PLAYER_ID)
    {
        SCM(ContractHitman[playerid], COLOR_YELLOW, "Your target has disconnected.");
        Command_ReProcess(ContractHitman[playerid], "killcp", 0);
    }

    if(ContractPlayer[playerid] != INVALID_PLAYER_ID)
    {
        ContractHitman[ContractPlayer[playerid]] = INVALID_PLAYER_ID;
    }

    ContractPlayer[playerid] = INVALID_PLAYER_ID;
    ContractHitman[playerid] = INVALID_PLAYER_ID;
    ContractValue[playerid] = 0;
    Iter_Remove(contracts, playerid);
}

hook OnPlayerDeath(playerid, killerid, reason)
{
    if(ContractValue[playerid] > 0 && Iter_Contains(contracts, playerid) && ContractHitman[playerid] != INVALID_PLAYER_ID)
    {
        if(killerid == ContractHitman[playerid])
        {
            OnContractUpdate(killerid);
        }
    }
}

CB:OnContractUpdate(playerid)
{
    if(Undercover[playerid] == 0) return FailContract(playerid, "undercover off");
    if(playerVariables[playerid][pPhoneStatus] == 1 && playerVariables[playerid][pPhoneNumber] != 0) return FailContract(playerid, "phone on");

    new weapon = GetPlayerWeapon(playerid), Float:distance = GetDistanceBetweenPlayers(playerid, ContractPlayer[playerid]);
    if(weapon == 34)
    {
        if(distance < 100) return FailContract(playerid, "distance < 100");
    }

    return OnPlayerFinishContract(playerid, distance);
}

CB:OnPlayerFinishContract(playerid, Float:distance)
{
    new target = ContractPlayer[playerid], prize = ContractValue[target];

    GivePlayerCash(playerid, prize);
    SendGroupMessage(5, COLOR_TEAL, "Hitman %s successfully completed contract on %s (%d) - distance: %0.2fm - reward: $%s.", GetName(playerid), GetName(target), target, distance, FormatNumber(prize));

    ContractHitman[target] = INVALID_PLAYER_ID;
    ContractValue[target] = 0;

    ContractPlayer[playerid] = INVALID_PLAYER_ID;
    Iter_Remove(contracts, target);

    GiveRaportPoints(playerid, 0, 1);
    return 1;
}

stock FailContract(playerid, reason[])
{
    new target = ContractPlayer[playerid];
    ContractHitman[target] = INVALID_PLAYER_ID;
    ContractValue[target] = 0;

    if(!strcmp(reason, "undercover off", true))
    {
        SendGroupMessage(5, COLOR_TEAL, "Hitman %s failed contract on %s (%d) - reason: undercover off.", GetName(playerid), GetName(target), target);
    }

    else if(!strcmp(reason, "distance < 100", true))
    {
        SendGroupMessage(5, COLOR_TEAL, "Hitman %s failed contract on %s (%d) - reason: distance under 100 meters.", GetName(playerid), GetName(target), target);
    }

    else if(!strcmp(reason, "phone on", true))
    {
        SendGroupMessage(5, COLOR_TEAL, "Hitman %s failed contract on %s (%d) - reason: phone not turned off.", GetName(playerid), GetName(target), target);
    }

    ContractPlayer[playerid] = INVALID_PLAYER_ID;
    Iter_Remove(contracts, target);
    return 1;
}

CB:RemoveHitmanContract(playerid)
{
    ContractPlayer[playerid] = INVALID_PLAYER_ID;
}

stock IsAHitman(playerid)
{
    if(groupVariables[playerVariables[playerid][pGroup]][gType] == 4) return 1;
    return 0;
}

stock GetContractsAvailable()
{
    if(!Iter_Count(contracts)) return 0;

    new count;
    foreach(new playerid : contracts)
    {
        if(ContractHitman[playerid] == INVALID_PLAYER_ID) count++;
    } 

    return count;
}

CMD:undercover(playerid, params[])
{
    check_hitman

    if(Undercover[playerid])
    {
        Undercover[playerid] = 0;
        SCM(playerid, COLOR_GREY, "You are not undercover anymore.");
    }

    else
    {
        Undercover[playerid] = 1;

        SCM(playerid, COLOR_PINK, "Now you are undercover!");
    }

    foreach(new i : Player)
    {
        ShowPlayerNameTagForPlayer(i, playerid, Undercover[playerid] == 1 ? 0 : 1);
    }

    return 1;
}

CMD:contract(playerid, params[])
{
    if(IsAHitman(playerid)) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You can't use this command as a hitman.");

    new player, price;
    if(sscanf(params, "ui", player, price)) return SCM(playerid, COLOR_GREY, "Syntax: "EMBED_WHITE"/contract [player id/name] [price]");
    if(!IsPlayerConnected(player)) return SCM(playerid, COLOR_GREY, "Player not connected.");
    if(price < 1000 || price > 100000000) return SCM(playerid, COLOR_GREY, "Invalid price.");
    if(GetPlayerCash(playerid) < price) return SCM(playerid, COLOR_GREY, "You don't have enough money.");
    if(IsAHitman(player)) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You can't place a contract on a hitman.");
    if(player == playerid) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You can't place a contract on you.");

    Iter_Add(contracts, player);
    ContractValue[player] += price;

    GivePlayerCash(playerid, -price);

    if(ContractHitman[player] == INVALID_PLAYER_ID) SendGroupMessage(5, COLOR_LIGHTBLUE, "A new contract has been placed! Type /getcontract to get it.");

    SCM(playerid, COLOR_ERROR, "Contract plasat!");
    return 1;
}

CMD:getcontract(playerid, params[])
{
    check_hitman

    if(GetContractsAvailable() == 0) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"No contracts available.");

    new player = Iter_Random(contracts);
    while(ContractHitman[player] != INVALID_PLAYER_ID && GetContractsAvailable()) 
    {
        player = Iter_Random(contracts);
    }

    ContractHitman[player] = playerid;
    ContractPlayer[playerid] = player;

    SCM(playerid, COLOR_YELLOW, "You have received a contract with $%s on %s (%d).", FormatNumber(ContractValue[player]), GetName(player), player);
    SendGroupMessage(5, COLOR_TEAL, "Hitman %s received a contract of $%s on %s (%d).", FormatNumber(ContractValue[player]), GetName(player), player);

    return 1;
}