/*
    CLAN HQs
*/

#include <YSI_Coding\y_hooks>

#define MAX_CLAN_HQS                (50)
#define CLAN_HQ_VIRTUAL             (50000)
#define CLAN_HQ_PICKUP              (1314)

enum E_CLAN_HQS
{
    chq_owner,

    Float:chq_x,
    Float:chq_y,
    Float:chq_z,
    Float:chq_i_x,
    Float:chq_i_y,
    Float:chq_i_z,
    chq_interior,

    Text3D:chq_label,
    chq_pickup,
    chq_area
}

new clanHQs[MAX_CLAN_HQS][E_CLAN_HQS],
    Iterator:clan_hqs<MAX_CLAN_HQS>;

// called at iniClans ==> main.pwn
CB:OnClanHQsLoaded()
{
    Iter_Clear(clan_hqs);

    if(!cache_num_rows())
    {
        return 1;
    }

    for(new x; x < cache_num_rows(); x++)
    {
        new id; cache_get_value_name_int(x, "id", id);
        cache_get_value_name_int(x, "clan_id", clanHQs[id][chq_owner]);

        cache_get_value_name_float(x, "x", clanHQs[id][chq_x]);
        cache_get_value_name_float(x, "y", clanHQs[id][chq_y]);
        cache_get_value_name_float(x, "z", clanHQs[id][chq_z]);

        cache_get_value_name_float(x, "i_x", clanHQs[id][chq_i_x]);
        cache_get_value_name_float(x, "i_y", clanHQs[id][chq_i_y]);
        cache_get_value_name_float(x, "i_z", clanHQs[id][chq_i_z]);

        cache_get_value_name_int(x, "interior", clanHQs[id][chq_interior]);

        Iter_Add(clan_hqs, id);

        UpdateClanHQLabel(id);
    }

    printf("[LOADING] %d clan HQs loaded.", Iter_Count(clan_hqs));
    return 1;
}

CB:OnPlayerSetSpawnAtCHQ(playerid)
{
    new clan = playerVariables[playerid][pClan], chq = GetClanHQ(clan);
    if(clan == 0) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You are not in a clan.");
    if(GetClanHQ(clan) == 0) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"Your clan doesn't have a HQ.");

    if(playerVariables[playerid][pSpawn] == CLAN_HQ_VIRTUAL + chq)
    {
        return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You already have this spawn option.");
    }

    playerVariables[playerid][pSpawn] = CLAN_HQ_VIRTUAL + chq;

    SCM(playerid, COLOR_GREY, "Spawn changed! Now you will be spawned at clan hq #%d.", chq);
    return 1;
}

CB:OnPlayerEnterClanHQ(playerid)
{
    new chq = GetClosestClanHQ(playerid, 2.0);
    if(GetClanHQ(playerVariables[playerid][pClan]) != chq)
    {
        return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You can't enter in this HQ.");
    }

    SetPlayerPosEx(playerid, clanHQs[chq][chq_i_x], clanHQs[chq][chq_i_y], clanHQs[chq][chq_i_z]);
    SetPlayerFacingAngle(playerid, 180.0);

    SetPlayerInterior(playerid, clanHQs[chq][chq_interior]);
    SetPlayerVirtualWorld(playerid, CLAN_HQ_VIRTUAL + chq);
    return 1;   
}

CB:OnPlayerExitClanHQ(playerid)
{
    new chq = GetPlayerClanHQ(playerid);

    if(IsPlayerInRangeOfPoint(playerid, 2.0, clanHQs[chq][chq_i_x], clanHQs[chq][chq_i_y], clanHQs[chq][chq_i_z]))
    {
        SetPlayerPosEx(playerid, clanHQs[chq][chq_x], clanHQs[chq][chq_y], clanHQs[chq][chq_z]);
        SetPlayerInterior(playerid, 0);
        SetPlayerVirtualWorld(playerid, 0);
    }

    return 1;
}

stock IsPlayerSpawnedAtCHQ(playerid)
{
    new clan = playerVariables[playerid][pClan];
    if(clan < 1) return 0;

    if(GetClanHQ(clan) != 0 && playerVariables[playerid][pSpawn] >= CLAN_HQ_VIRTUAL + 1 && playerVariables[playerid][pSpawn] <= CLAN_HQ_VIRTUAL + MAX_CLAN_HQS)
    {
        return 1;
    }

    return 0;
}

stock SetPlayerSpawnToCHQ(playerid)
{
    new chq = GetClanHQ(playerVariables[playerid][pClan]);
    if(chq == -1)
    {
        SetPlayerPosEx(playerid, serverVariables[serverSpawnX], serverVariables[serverSpawnY], serverVariables[serverSpawnZ]);
		SetPlayerFacingAngle(playerid, serverVariables[serverSpawnAngle]);

		SetPlayerHealthEx(playerid, 100.0);
		SetPlayerInterior(playerid, 0);
    }

    else
    {
        SetPlayerPosEx(playerid, clanHQs[chq][chq_i_x], clanHQs[chq][chq_i_y], clanHQs[chq][chq_i_z]);
        SetPlayerFacingAngle(playerid, 0.0);

        SetPlayerInterior(playerid, clanHQs[chq][chq_interior]);
        SetPlayerVirtualWorld(playerid, chq + CLAN_HQ_VIRTUAL);
    }
    return 1;
}

stock UpdateClanHQLabel(id)
{
    if(IsValidDynamicPickup(clanHQs[id][chq_pickup]))
    {
        DestroyDynamicPickup(clanHQs[id][chq_pickup]);
        DestroyDynamic3DTextLabel(clanHQs[id][chq_label]);
        DestroyDynamicArea(clanHQs[id][chq_area]);
    }

    clanHQs[id][chq_pickup] = CreateDynamicPickup(CLAN_HQ_PICKUP, 23, clanHQs[id][chq_x], clanHQs[id][chq_y], clanHQs[id][chq_z], 0, 0, -1, 10.0, -1, -1);
    clanHQs[id][chq_area] = CreateDynamicSphere(clanHQs[id][chq_x], clanHQs[id][chq_y], clanHQs[id][chq_z], 25.0, 0, 0, -1);

    new label[200];
    if(clanHQs[id][chq_owner] == 0) format(label, sizeof(label), "{75ade6}[CLAN HQ #%d]"EMBED_WHITE"\n\nAvailable to purchase (/buyclanhq)!\nCost: {75ade6}200 amethysts", id);
    else format(label, sizeof(label), "{75ade6}[CLAN HQ #%d]"EMBED_WHITE"\nOwner: {75ade6}%s "EMBED_WHITE"(ID: {75ade6}%d"EMBED_WHITE")", id, clansVariables[clanHQs[id][chq_owner]][cName], clanHQs[id][chq_owner]);

    clanHQs[id][chq_label] = CreateDynamic3DTextLabel(label, COLOR_WHITE, clanHQs[id][chq_x], clanHQs[id][chq_y], clanHQs[id][chq_z], 10.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0);
    return 1;
}

stock GetClanHQ(clan)
{
    foreach(new chq : clan_hqs)
    {
        if(clanHQs[chq][chq_owner] == clan)
        {
            return chq;
        }
    }

    return 0;
}

stock GetPlayerClanHQ(playerid)
{
    new chq = -1;
    if(GetPlayerVirtualWorld(playerid) >= CLAN_HQ_VIRTUAL && GetPlayerVirtualWorld(playerid) <= CLAN_HQ_VIRTUAL + MAX_CLAN_HQS)
    {
        chq = GetPlayerVirtualWorld(playerid) - CLAN_HQ_VIRTUAL;
    }

    return chq;
}

stock GetClosestClanHQ(playerid, Float:range)
{
    new chq = -1, Float:distance;
    foreach(new c : clan_hqs)
    {
        distance = GetPlayerDistanceFromPoint(playerid, clanHQs[c][chq_x], clanHQs[c][chq_y], clanHQs[c][chq_z]);

        if(distance <= range)
        {
            chq = c;

            if(chq != -1)
            {
                if(GetPlayerDistanceFromPoint(playerid, clanHQs[c][chq_x], clanHQs[c][chq_y], clanHQs[c][chq_z]) < distance)
                {
                    distance = GetPlayerDistanceFromPoint(playerid, clanHQs[c][chq_x], clanHQs[c][chq_y], clanHQs[c][chq_z]);
                    chq = c;
                }
            }
        }
    }

    return chq;
}

CB:DIALOG_BUYCLANHQ(playerid, dialogid, response, listitem, string:inputtext[])
{
    if(!response)
    {
        return 1;
    }

    if(playerVariables[playerid][pAmethysts] < 200) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You need 200 amethysts to purchase a HQ for your clan.");

    new chq = GetClosestClanHQ(playerid, 2.0);
    if(chq == -1) return 1;
    if(clanHQs[chq][chq_owner] != 0) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"This HQ is already owned by a clan.");

    new clan = playerVariables[playerid][pClan];
    clanHQs[chq][chq_owner] = clan;

    SendClanMessage(clan, COLOR_WHITE, "{%s}[CLAN] Leader %s bought HQ #%d for the clan.", clansVariables[clan][cColor], GetName(playerid), chq);
    SCM(playerid, COLOR_MONEY, "Felicitari! Ai cumparat HQ-ul #%d pentru clanul %s (#%d) cu 200 ametiste.", chq, clansVariables[clan][cName], clan);

    gQuery[0] = EOS;
    mysql_format(SQL, gQuery, sizeof(gQuery), "insert into `logs_clan` (Clan, Date, Log) values ('%d', '%d', '%s bought chq #%d')", clan, gettime(), GetName(playerid), chq);
    mysql_tquery(SQL, gQuery, "", "");

    playerVariables[playerid][pAmethysts] -= 200;
    gQuery[0] = EOS;
	mysql_format(SQL, gQuery, sizeof(gQuery), "update `server_accounts` set `playerAmethysts` = '%d' where `playerID` = '%d'", playerVariables[playerid][pAmethysts], playerVariables[playerid][pSQLID]);
	mysql_tquery(SQL, gQuery, "", "");

    gQuery[0] = EOS;
    mysql_format(SQL, gQuery, sizeof(gQuery), "insert into `logs_shop` (Player, Date, Text) values ('%d', '%d', '* %s bought [clanhq:%d] with 200 amethysts.')", playerVariables[playerid][pSQLID], gettime(), GetName(playerid), chq);
    mysql_tquery(SQL, gQuery, "", "");

    gQuery[0] = EOS;
    mysql_format(SQL, gQuery, sizeof(gQuery), "UPDATE `server_clan_hqs` SET `clan_id` = '%d' WHERE `id` = '%d'", clan, chq);
    mysql_tquery(SQL, gQuery, "", "");

    UpdateClanHQLabel(chq);
    return 1;
}

CMD:buyclanhq(playerid, params[])
{
    if(playerVariables[playerid][pClan] == 0) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You are not in a clan.");
    if(playerVariables[playerid][pClanRank] < 7) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"Only the leader can purchase a HQ for the clan.");

    new clan = playerVariables[playerid][pClan];
    if(GetClanHQ(clan) != 0) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"Your clan already has an HQ.");
    if(playerVariables[playerid][pAmethysts] < 200) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You need 200 amethysts to purchase a HQ for your clan.");

    new chq = GetClosestClanHQ(playerid, 2.0);
    if(chq == -1) return 1;
    if(clanHQs[chq][chq_owner] != 0) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"This HQ is already owned by a clan.");

    Dialog_ShowCallback(playerid, using public DIALOG_BUYCLANHQ<iiiis>, DIALOG_STYLE_MSGBOX, ""EMBED_SERVER"broland.ro: "EMBED_WHITE"Buy clan HQ", "Esti sigur ca vrei sa platesti 200 ametiste pentru clan HQ?\nNu iti vei putea recupera ametistele!", "Confirm", "Exit");
    return 1;
}

CMD:moveclanhq(playerid, params[])
{
    check_owner

    new chq;
    if(sscanf(params, "i", chq))
    {
        return SCM(playerid, COLOR_GREY, "Syntax: "EMBED_WHITE"/moveclanhq [clan HQ]");
    }

    if(!Iter_Contains(clan_hqs, chq)) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"Invalid clan HQ.");

    GetPlayerPos(playerid, clanHQs[chq][chq_x], clanHQs[chq][chq_y], clanHQs[chq][chq_z]);

    gQuery[0] = EOS;
    mysql_format(SQL, gQuery, sizeof(gQuery), "UPDATE `server_clan_hqs` SET `x` = '%f', `y` = '%f', `z` = '%f' WHERE `id` = '%d'", clanHQs[chq][chq_x], clanHQs[chq][chq_y], clanHQs[chq][chq_z], chq);
    mysql_tquery(SQL, gQuery, "", "");

    SCM(playerid, COLOR_LIGHTBLUE, "You moved clan HQ #%d.", chq);

    return UpdateClanHQLabel(chq);
}

YCMD:findclanhq(playerid, params[], help) 
{
	if(playerVariables[playerid][pCheckpoint] != 0) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You already have an active checkpoint.");

	new chq;
    if(sscanf(params, "i", chq))
    {
        return SCM(playerid, COLOR_GREY, "Syntax: "EMBED_WHITE"/findclanhq [clan HQ]");
    }

    if(!Iter_Contains(clan_hqs, chq)) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"Invalid clan HQ.");

	SetPlayerCheckpointEx(playerid, CHECKPOINT_LOCATE, clanHQs[chq][chq_x], clanHQs[chq][chq_y], clanHQs[chq][chq_z], 3.0);

	if(playerVariables[playerid][pLanguage] == 2) SCM(playerid, COLOR_YELLOW, "Mergi la checkpoint-ul de pe minimap pentru a ajunge la clan HQ %d. Distanta: %0.1f metri.", chq, GetPlayerDistanceFromPoint(playerid, clanHQs[chq][chq_x], clanHQs[chq][chq_y], clanHQs[chq][chq_z]));
	else SCM(playerid, COLOR_YELLOW, "Follow the checkpoint to reach clan HQ %d. Distance: %0.1f meters.", chq, GetPlayerDistanceFromPoint(playerid, clanHQs[chq][chq_x], clanHQs[chq][chq_y], clanHQs[chq][chq_z]));
	return 1;
}