/*
    CLAN VEHICLES
*/

#include <YSI_Coding\y_hooks>

#define MAX_CLAN_VEHICLES               (1000)

new buyClanVehs[][2] = {
    {411, 200},
    {541, 175},
    {560, 150},
    {522, 125},
    {451, 110},
    {429, 110},
    {415, 100},
    {480, 75},
    {461, 50},
    {462, 10}
};

hook OnVehicleDeath(vehicleid, killerid)
{
    if(IsValidDynamicObject(ClanVIP_Text[vehicleid]))
    {
        DestroyDynamicObject(ClanVIP_Text[vehicleid]);
    }

    ClanVIP_Text[vehicleid] = INVALID_OBJECT_ID;
}

hook OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
    if(Vehicles[vehicleid][vType] == 9 && clanVehicles[Vehicles[vehicleid][vPersonal]][cv_clan] != playerVariables[playerid][pClan])
    {
        new Float:x, Float:y, Float:z;
        GetPlayerPos(playerid, x, y, z);
        SetPlayerPos(playerid, x, y, z + 3);

        SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You are not a member of %s clan.", clansVariables[playerVariables[playerid][pClan]][cName]);
        return;
    }
}

hook OnPlayerStateChange(playerid, newstate, oldstate)
{
    if(newstate == PLAYER_STATE_DRIVER)
    {
        new vehicleid = GetPlayerVehicleID(playerid);
        if(Vehicles[vehicleid][vType] == 9)
        {
            if(clanVehicles[Vehicles[vehicleid][vPersonal]][cv_clan] != playerVariables[playerid][pClan])
            {
                new Float:x, Float:y, Float:z;
                GetPlayerPos(playerid, x, y, z);
                SetPlayerPos(playerid, x, y, z + 3);

                SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You are not a member of %s clan.", clansVariables[playerVariables[playerid][pClan]][cName]);
                return;
            }

            SCM(playerid, COLOR_WHITE, "This %s (ID: %d) is owned by clan %s.", vehNames[GetVehicleModel(vehicleid) - 400], Vehicles[vehicleid][vPersonal], clansVariables[clanVehicles[Vehicles[vehicleid][vPersonal]][cv_clan]][cName]);
        }
    }
}

hook OnVehicleSpawn(vehicleid)
{
    if(Vehicles[vehicleid][vType] == 9)
    {
        new cid = Vehicles[vehicleid][vPersonal];
        SetVehiclePos(vehicleid, clanVehicles[cid][cv_pos][0], clanVehicles[cid][cv_pos][1], clanVehicles[cid][cv_pos][2]);
        SetVehicleZAngle(vehicleid, clanVehicles[cid][cv_pos][3]);
        ChangeVehicleColor(vehicleid, clanVehicles[cid][cv_colors][0], clanVehicles[cid][cv_colors][1]);
    }
}

CB:LoadClanVehicles(clan)
{
    inline load_clan_cars()
    {
        if(!cache_num_rows()) return 1;

        new id;
        for(new x; x < cache_num_rows(); x++)
        {
            cache_get_value_name_int(x, "id", id);
            clanVehicles[id][cv_clan] = clan;

            cache_get_value_name_int(x, "model", clanVehicles[id][cv_model]);

            cache_get_value_name_float(x, "x", clanVehicles[id][cv_pos][0]);
            cache_get_value_name_float(x, "y", clanVehicles[id][cv_pos][1]);
            cache_get_value_name_float(x, "z", clanVehicles[id][cv_pos][2]);
            cache_get_value_name_float(x, "angle", clanVehicles[id][cv_pos][3]);

            cache_get_value_name_int(x, "color1", clanVehicles[id][cv_colors][0]);
            cache_get_value_name_int(x, "color2", clanVehicles[id][cv_colors][1]);

            Iter_Add(clan_vehicles, id);
            clanVehicles[id][cv_spawnid] = CreateClanVehicle(clanVehicles[id][cv_model], id, clanVehicles[id][cv_pos][0], clanVehicles[id][cv_pos][1], clanVehicles[id][cv_pos][2], clanVehicles[id][cv_pos][3], clanVehicles[id][cv_colors][0], clanVehicles[id][cv_colors][1]);

            for(new y; y < 15; y++)
            {
                if(clansVariables[clan][cVehicles][y] == 0)
                {
                    clansVariables[clan][cVehicles][y] = id;
                    break;
                }
            }
        }
    }

    gQuery[0] = EOS;
    mysql_format(SQL, gQuery, sizeof(gQuery), "SELECT * FROM `server_clan_cars` WHERE `clan` = '%d' LIMIT 15", clan);
    MySQL_PQueryInline(SQL, using inline load_clan_cars, gQuery, "");
    return 1;
}

CB:ShowClanCarsForSale(playerid)
{
    if(GetClanVehicles(playerVariables[playerid][pClan]) >= 15) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"Your clan already has 15 vehicles. Try to sell some vehicles!");
    if(playerVariables[playerid][pClanRank] < 7) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"Only the clan leader can buy vehicles.");

    gDialog = "Vehicle model\tPrice\n";
    for(new x; x < sizeof(buyClanVehs); x++)
    {
        format(gDialog, sizeof(gDialog), "%s%s [model:%d]\t"EMBED_AMETHYST"%d amethysts\n", gDialog, vehNames[buyClanVehs[x][0] - 400], buyClanVehs[x][0], buyClanVehs[x][1]);
    }

    return ShowDialog(playerid, DIALOG_BUYCLANCAR, DIALOG_STYLE_TABLIST_HEADERS, ""EMBED_DIALOG"Buy clan cars", gDialog, "Select", "Exit");
}

CB:DIALOG_BUYCLANCAR(playerid, dialogid, response, listitem, inputtext[])
{
    if(!response)
    {
        return 1;
    }

    new price = buyClanVehs[listitem][1], model = buyClanVehs[listitem][0], clan = playerVariables[playerid][pClan];
    if(playerVariables[playerid][pAmethysts] < price)
    {
        return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You need %d amethysts in order to buy this vehicle.", price);
    }

    playerVariables[playerid][pAmethysts] -= price;

    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, "", "");

    new Float:x, Float:y, Float:z;
    GetPlayerPos(playerid, x, y, z);

    new Float:rot;
    GetPlayerFacingAngle(playerid, rot);

    gQuery[0] = EOS;
    mysql_format(SQL, gQuery, sizeof(gQuery), "INSERT INTO `server_clan_cars` (`clan`, `model`, `x`, `y`, `z`, `rot`, `buy_date`) VALUES ('%d', '%d', '%f', '%f', '%f', '%f', '%d')", clan, model, x, y, z, rot, gettime());
    mysql_tquery(SQL, gQuery, "OnPlayerBuyClanCar", "iii", playerid, clan, model);

    SendClanMessage(clan, -1, "{%s}[CLAN] %s bought a %s for the clan!", clansVariables[clan][cColor], GetName(playerid), vehNames[model - 400]);
    return 1;
}

CB:OnPlayerBuyClanCar(playerid, clan, model)
{
    new id = cache_insert_id();

    for(new x; x < 15; x++)
    {
        if(clansVariables[clan][cVehicles][x] == 0)
        {
            clansVariables[clan][cVehicles][x] = id;
            break;
        }
    }

    clanVehicles[id][cv_clan] = clan;
    clanVehicles[id][cv_buydate] = gettime();
    clanVehicles[id][cv_model] = model;
    for(new x; x < 2; x++) clanVehicles[id][cv_colors][x] = 0;

    GetPlayerPos(playerid, clanVehicles[id][cv_pos][0], clanVehicles[id][cv_pos][1], clanVehicles[id][cv_pos][2]);
    GetPlayerFacingAngle(playerid, clanVehicles[id][cv_pos][3]);

    clanVehicles[id][cv_spawnid] = CreateClanVehicle(model, id, clanVehicles[id][cv_pos][0], clanVehicles[id][cv_pos][1], clanVehicles[id][cv_pos][2], clanVehicles[id][cv_pos][3], 0, 0);
    return 1;
}

CB:ChangeClanCarColors(playerid)
{
    if(playerVariables[playerid][pAmethysts] < 50)
    {
        return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You don't have 50 amethysts.");
    }

    if(playerVariables[playerid][pClanRank] < 7)
    {
        return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"Only the clan leaders can change the vehicle colors.");
    }

    return ShowDialog(playerid, DIALOG_CLAN_V_COLORS, DIALOG_STYLE_INPUT, ""EMBED_DIALOG"Change vehicle colors", "Enter here a color ID between 0 and 255.\nIntrodu aici un ID de culoare de la 0 pana la 255.", "Enter", "Exit");
}

CB:DIALOG_CLAN_V_COLORS(playerid, dialogid, response, listitem, inputtext[])
{
    if(!response)
    {
        return 1;
    }

    if(strval(inputtext) < 0 || strval(inputtext) > 255)
    {
        SCM(playerid, COLOR_WARNING, "Invalid color!");
        return ShowDialog(playerid, DIALOG_CLAN_V_COLORS, DIALOG_STYLE_TABLIST_HEADERS, ""EMBED_DIALOG"Change vehicle colors", "Enter here a color ID between 0 and 255.\nIntrodu aici un ID de culoare de la 0 pana la 255.", "Enter", "Exit");
    }

    if(playerVariables[playerid][pAmethysts] < 50)
    {
        return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You don't have 50 amethysts.");
    }

    new clan = playerVariables[playerid][pClan], color = strval(inputtext);
    for(new x; x < 15; x++)
    {
        if(clansVariables[clan][cVehicles][x] != 0)
        {
            ChangeVehicleColor(clanVehicles[clansVariables[clan][cVehicles][x]][cv_spawnid], color, color);
        }
    }

    gQuery[0] = EOS;
    mysql_format(SQL, gQuery, sizeof(gQuery), "UPDATE `server_clan_cars` SET `color1` = '%d', `color2` = '%d' WHERE `clan` = '%d'", color, color, clan);
    mysql_tquery(SQL, gQuery, "", "");

    playerVariables[playerid][pAmethysts] -= 50;

    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, "", "");

    SendClanMessage(clan, -1, "{%s}[CLAN] %s changed the color of vehicles to %d/%d.", clansVariables[clan][cColor], GetName(playerid), color, color);
    SCM(playerid, COLOR_GREY, "(-) Clan vehicles colors changed to %d/%d for 50 amethysts!", color, color);

    return 1;
}

CB:DIALOG_SELLCLANCAR(playerid, dialogid, response, listitem, inputtext[])
{   
    if(!IsPlayerInAnyVehicle(playerid) || !response) return 1;

    if(playerVariables[playerid][pClanRank] < 7)
    {
        return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"Only the clan leaders can sell clan vehicles.");
    }

    new vehicleid = GetPlayerVehicleID(playerid), cid = Vehicles[vehicleid][vPersonal];
    if(Vehicles[vehicleid][vType] != 9)
    {
        return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"This vehicle is not owned by a clan.");
    }

    if(clanVehicles[cid][cv_clan] != playerVariables[playerid][pClan])
    {
        return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"This vehicle is not owned by your clan.");
    }

    new bool:can_be_sold = false, ds_id;

	foreach(new d : server_dealership) 
    {
		if(dealerVariables[d][dsModel] == GetVehicleModel(vehicleid)) 
        {
			can_be_sold = true;
			ds_id = d;
			break;
		}
	}

	new price;
	if(can_be_sold == false) price = 500000;
	else price = (dealerVariables[ds_id][dsPrice] / 100) * 80;

    new clan = playerVariables[playerid][pClan];
    SendClanMessage(clan, -1, "{%s}[CLAN] %s sold vehicle %s for $%s in safebox.", clansVariables[clan][cColor], GetName(playerid), vehNames[GetVehicleModel(vehicleid) - 400], FormatNumber(price));

    playerVariables[playerid][pClanDeposited] += price;
    clansVariables[clan][cSafeBalance] += price;

    gQuery[0] = EOS;
    mysql_format(SQL, gQuery, sizeof(gQuery), "update `server_clans` set `clanSafeBalance` = '%d' where `clanID` = '%d'", clansVariables[clan][cSafeBalance], clan);
    mysql_tquery(SQL, gQuery, "", "");

    gQuery[0] = EOS;
    mysql_format(SQL, gQuery, sizeof(gQuery), "update `server_accounts` set `playerClanDeposited` = '%d' where `playerID` = '%d'", playerVariables[playerid][pClanDeposited], playerVariables[playerid][pSQLID]);
    mysql_tquery(SQL, gQuery, "", "");

    DestroyVehicleEx(vehicleid);
    Iter_Remove(clan_vehicles, cid);

    gQuery[0] = EOS;
    mysql_format(SQL, gQuery, sizeof(gQuery), "DELETE FROM `server_clan_cars` WHERE `id` = '%d'", cid);
    mysql_tquery(SQL, gQuery, "", "");
    return 1;
}

stock CreateClanVehicle(model, cid, Float:x, Float:y, Float:z, Float:rot, color1, color2)
{
    new vehicleid = CreateVehicleEx(model, x, y, z, rot, color1, color2, 9, cid, -1);
    Vehicles[vehicleid][vType] = 9;

    new plate[16];
    format(plate, 16, "CLAN CAR #%02d", vehicleid);
    SetVehicleNumberPlate(vehicleid, plate);

    AttachClanTextToVehicle(vehicleid, clanVehicles[cid][cv_clan]);

    return vehicleid;
}

stock AttachClanTextToVehicle(vehicleid, clan)
{
    if(IsValidDynamicObject(ClanVIP_Text[vehicleid]))
    {
        DestroyDynamicObject(ClanVIP_Text[vehicleid]);
    }

    ClanVIP_Text[vehicleid] = CreateDynamicObject(19327, 0, 0, -10.0, 0, 0, 0, -1, -1, -1, 25.0, 25.0, -1);

    gString[0] = EOS;
    format(gString, sizeof(gString), "{%s}%s", clansVariables[clan][cColor], clansVariables[clan][cName]);
    SetDynamicObjectMaterialText(ClanVIP_Text[vehicleid], 0, gString, OBJECT_MATERIAL_SIZE_256x128, "Arial", 20, 1, 0xFFFFFFFF, 0, 1);

    switch(GetVehicleModel(vehicleid))
    {
        case 411: AttachDynamicObjectToVehicle(ClanVIP_Text[vehicleid], vehicleid, 0.0, -1.975, 0.234, -90.0, 0.0, 0.0);
		case 541: AttachDynamicObjectToVehicle(ClanVIP_Text[vehicleid], vehicleid, 0.0, -1.65, 0.39, -90.0, 0.0, 0.0);
		case 560: AttachDynamicObjectToVehicle(ClanVIP_Text[vehicleid], vehicleid, 0.0, -0.615, 0.8, -90.0, 0.0, 0.0);
		case 451: AttachDynamicObjectToVehicle(ClanVIP_Text[vehicleid], vehicleid, 0.0, -0.6, 0.56, 270.0, 0.0, 0.0);
		case 480: AttachDynamicObjectToVehicle(ClanVIP_Text[vehicleid], vehicleid, 0.0, -1.58, 0.27, 270.0, 0.0, 0.0);
    }

    return 1;
}

stock GetClanVehicles(clan)
{
    new count;
    for(new x; x < 15; x++)
    {
        if(clansVariables[clan][cVehicles][x] != 0) count++;
    }

    return count;
}

CMD:cpark(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] < 6)
    {
        return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"Only the clan leaders can move clan vehicles.");
    }

    new vehicleid = GetPlayerVehicleID(playerid), cid = Vehicles[vehicleid][vPersonal];
    if(Vehicles[vehicleid][vType] != 9)
    {
        return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"This vehicle is not owned by a clan.");
    }

    if(clanVehicles[cid][cv_clan] != playerVariables[playerid][pClan])
    {
        return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"This vehicle is not owned by your clan.");
    }

    GetPlayerPos(playerid, clanVehicles[cid][cv_pos][0], clanVehicles[cid][cv_pos][1], clanVehicles[cid][cv_pos][2]);
    GetPlayerFacingAngle(playerid, clanVehicles[cid][cv_pos][3]);

    gQuery[0] = EOS;
    mysql_format(SQL, gQuery, sizeof(gQuery), "UPDATE `server_clan_cars` SET `x` = '%f', `y` = '%f', `z` = '%f', `rot` = '%f' WHERE `id` = '%d'", clanVehicles[cid][cv_pos][0], clanVehicles[cid][cv_pos][1], clanVehicles[cid][cv_pos][2], clanVehicles[cid][cv_pos][3], cid);
    mysql_tquery(SQL, gQuery, "", "");

    SCM(playerid, COLOR_PINK, "Masina parcata! La urmatorul spawn masina se va afla aici.");
    return 1;
}

CMD:sellclancar(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 clan leaders can sell clan vehicles.");
    }

    new vehicleid = GetPlayerVehicleID(playerid), cid = Vehicles[vehicleid][vPersonal];
    if(Vehicles[vehicleid][vType] != 9)
    {
        return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"This vehicle is not owned by a clan.");
    }

    if(clanVehicles[cid][cv_clan] != playerVariables[playerid][pClan])
    {
        return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"This vehicle is not owned by your clan.");
    }

    new bool:can_be_sold = false, ds_id;

	foreach(new d : server_dealership) 
    {
		if(dealerVariables[d][dsModel] == GetVehicleModel(vehicleid)) 
        {
			can_be_sold = true;
			ds_id = d;
			break;
		}
	}

	new price;
	if(can_be_sold == false) price = 500000;
	else price = (dealerVariables[ds_id][dsPrice] / 100) * 80;

    gDialog[0] = EOS;
    format(gDialog, sizeof(gDialog), "Are you sure that you want to sell this vehicle for $%s?\nThe money will be deposited automatically in the safe box.", FormatNumber(price));
    return ShowDialog(playerid, DIALOG_SELLCLANCAR, DIALOG_STYLE_MSGBOX, ""EMBED_DIALOG"Sell clan vehicle", gDialog, "Confirm", "Exit");
}