// • ▌ ▄ ·.  ▄▄▄·  ▄▄ • ▪   ▄▄· ▄▄▄▄·  ▄▄▄·  ▐▄▄▄  ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀  █▪▀▀▀ ▀  ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀  ▀  ▀ ▀▀  █▪ ▀▀▀
//      Magicbane Emulator Project © 2013 - 2022
//                www.magicbane.com


package engine.net.client.msg;

import engine.Enum;
import engine.gameManager.DbManager;
import engine.net.AbstractConnection;
import engine.net.ByteBufferReader;
import engine.net.ByteBufferWriter;
import engine.net.client.Protocol;
import engine.objects.*;


public class ViewResourcesMessage extends ClientNetMsg {

    //resource hashes
    //0001240F
    //002339C7 (locked)
    //00263669
    //00270DC3
    //002D6DEF
    //047636B3 (locked)
    //047B0CC1
    //04AB3761
    //1AF5DB3A
    //47033237
    //4F8EFB0F
    //5B57C3E4
    //86A0AC24
    //9705591E
    //98378CB4
    //98D78D15
    //A0703E8C (locked)
    //A0DA3807
    //A1723A93
    //A26E59CF
    //D665C60F
    //E3D05AE3
    //ED13904D

    private Guild guild;
    private Building warehouseBuilding;
    private Warehouse warehouseObject;
    private PlayerCharacter player;
    private City city;

    /**
     * This is the general purpose constructor.
     */

    public ViewResourcesMessage(PlayerCharacter player) {
        super(Protocol.VIEWRESOURCES);
        this.guild = null;
        this.player = player;
    }

    /**
     * This constructor is used by NetMsgFactory. It attempts to deserialize the ByteBuffer into a message. If a BufferUnderflow occurs (based on reading past the limit) then this constructor Throws that Exception to the caller.
     */
    public ViewResourcesMessage(AbstractConnection origin, ByteBufferReader reader) {
        super(Protocol.VIEWRESOURCES, origin, reader);
    }

    public boolean configure() {

        if (this.warehouseBuilding.getParentZone() == null)
            return false;

        this.city = (City) DbManager.getObject(Enum.GameObjectType.City, this.warehouseBuilding.getParentZone().getPlayerCityUUID());

        if (this.city == null)
            return false;

        this.warehouseObject = this.city.getWarehouse();

        return this.warehouseObject != null;
    }

    /**
     * Serializes the subclass specific items to the supplied NetMsgWriter.
     */
    @Override
    protected void _serialize(ByteBufferWriter writer) {

        writer.putInt(warehouseObject.getResources().size());

        for (ItemBase ib : (warehouseObject.getResources().keySet())) {

            writer.putInt(ib.getHashID());
            writer.putInt((warehouseObject.getResources().get(ib)));


            if (warehouseObject.isResourceLocked(ib) == true)
                writer.put((byte) 1);
            else
                writer.put((byte) 0);
        }

        writer.putInt(warehouseObject.getResources().size());

        for (ItemBase ib : warehouseObject.getResources().keySet()) {
            writer.putInt(ib.getHashID());
            writer.putInt(0); //available?
            writer.putInt(Warehouse.getMaxResources().get(ib.getUUID())); //max?
        }
        GuildTag._serializeForDisplay(guild.getGuildTag(), writer);

        // Serialize what tags?  Errant?

        writer.putInt(16);
        writer.putInt(16);
        writer.putInt(16);
        writer.putInt(0);
        writer.putInt(0);

        if (GuildStatusController.isTaxCollector(player.getGuildStatus())) {
            writer.putInt(1);
            writer.putString("Deposit");
            writer.putInt(-1760114543);
            writer.putInt(1);
            writer.put((byte) 0);

        } else if (this.player.getGuild().equals(warehouseBuilding.getGuild()) && (GuildStatusController.isInnerCouncil(this.player.getGuildStatus()))) {
            writer.putInt(4);
            writer.putString("Lock");
            writer.putInt(2393548);
            writer.putInt(1); //locked? on/off
            writer.put((byte) 0);
            writer.putString("Deposit");
            writer.putInt(-1760114543);

            writer.putInt(1);
            writer.put((byte) 0);
            writer.putString("Manage Mines");
            writer.putInt(-820683698);
            writer.putInt(1);
            writer.put((byte) 0);
            writer.putString("Withdraw");
            writer.putInt(-530228289);
            writer.putInt(1);
            writer.put((byte) 0);
        } else {
            writer.putInt(2);
            writer.putString("Lock");
            writer.putInt(2393548);
            writer.putInt(0); //locked? on/off
            writer.put((byte) 0);
            writer.putString("Deposit");
            writer.putInt(-1760114543);
            writer.putInt(1);
            writer.put((byte) 0);
        }

    }

    /**
     * Deserializes the subclass specific items from the supplied NetMsgReader.
     */
    @Override
    protected void _deserialize(ByteBufferReader reader) {
        reader.getInt();
        reader.getInt();
        reader.getInt();
        reader.getInt();
        reader.getInt();
        reader.getInt();
        reader.getInt();
        reader.getInt();
        reader.getInt();
        reader.getInt();
        reader.getInt();
        reader.getInt();
        reader.getInt();
        //		this.locX = reader.getFloat();
        //		this.locY = reader.getFloat();
        //		this.locZ = reader.getFloat();
        //		this.name = reader.getString();
        //		this.unknown01 = reader.getInt();
    }

    public void setGuild(Guild guild) {
        this.guild = guild;
    }

    public void setWarehouseBuilding(Building warehouseBuilding) {
        this.warehouseBuilding = warehouseBuilding;
    }
}
