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


package engine.net.client.msg;


import engine.Enum;
import engine.exception.SerializationException;
import engine.net.AbstractConnection;
import engine.net.ByteBufferReader;
import engine.net.ByteBufferWriter;
import engine.net.client.Protocol;
import org.pmw.tinylog.Logger;


public class AssetSupportMsg extends ClientNetMsg {

    private int npcType;
    private int npcID;
    private int buildingType;
    private int buildingID;
    private int messageType;
    private int pad = 0;
    private int objectType;
    private int objectUUID;
    private int protectedBuildingType;
    private int protectedBuildingID;
    private int profitTax;
    private int weeklyTax;
    private byte enforceKOS;
    private Enum.SupportMsgType supportMsgType;
    public static int confirmProtect;


    /**
     * 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 AssetSupportMsg(AbstractConnection origin, ByteBufferReader reader) {
        super(Protocol.ASSETSUPPORT, origin, reader);
    }

    /**
     * Deserializes the subclass specific items from the supplied NetMsgReader.
     */
    @Override
    protected void _deserialize(ByteBufferReader reader) {

        this.messageType = reader.getInt();
        this.supportMsgType = Enum.SupportMsgType.typeLookup.get(this.messageType);

        if (this.supportMsgType == null) {
            this.supportMsgType = Enum.SupportMsgType.NONE;
            Logger.error("No enumeration for support type" + this.messageType);
        }

        switch (supportMsgType) {

            case PROTECT:
                this.buildingType = reader.getInt();
                this.buildingID = reader.getInt();
                this.npcType = reader.getInt();
                this.npcID = reader.getInt();
                reader.getInt();
                reader.getInt();
                this.protectedBuildingType = reader.getInt();
                this.protectedBuildingID = reader.getInt();
                reader.getInt();
                this.weeklyTax = reader.getInt();
                this.profitTax = reader.getInt();
                this.enforceKOS = reader.get();
                reader.get();
                reader.getInt();
                reader.getInt();
                break;

            case UNPROTECT:
                this.buildingType = reader.getInt();
                this.buildingID = reader.getInt();
                this.npcType = reader.getInt();
                this.npcID = reader.getInt();
                this.protectedBuildingType = reader.getInt();
                this.protectedBuildingID = reader.getInt();
                reader.getInt();
                reader.getInt();
                reader.getInt();
                reader.getInt();
                break;
            case VIEWUNPROTECTED:
                this.buildingType = reader.getInt();
                this.buildingID = reader.getInt();
                this.npcType = reader.getInt();
                this.npcID = reader.getInt();
                reader.getInt();
                reader.getInt();
                reader.getInt();
                reader.getInt();
                reader.getInt();
                reader.getInt();
                break;
            case REMOVETAX:
                reader.getInt();
                this.buildingID = reader.getInt();

                reader.getInt();
                reader.getInt();
                reader.getInt();
                reader.getInt();
                reader.getInt();
                reader.getInt();
                reader.get();
                reader.get();
                reader.get();
                reader.getInt();
                reader.getInt();
                break;

            case ACCEPTTAX:
                reader.getInt();
                this.buildingID = 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();
                reader.getInt();

                reader.get();
                reader.get();
                reader.get();
                break;
        }
    }

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

        writer.putInt(this.messageType);
        this.supportMsgType = Enum.SupportMsgType.typeLookup.get(this.messageType);

        if (this.supportMsgType == null) {
            this.supportMsgType = Enum.SupportMsgType.NONE;
            Logger.error("No enumeration for support type" + this.messageType);
        }

        switch (this.supportMsgType) {

            case PROTECT:
                writer.putInt(this.buildingType);
                writer.putInt(this.buildingID);
                writer.putInt(npcType);
                writer.putInt(npcID);
                writer.putInt(0);
                writer.putInt(0);
                writer.putInt(this.protectedBuildingType);
                writer.putInt(this.protectedBuildingID);
                writer.putInt(0);
                writer.putInt(this.weeklyTax);
                writer.putInt(this.profitTax);
                writer.put(this.enforceKOS);
                writer.put((byte) 0);
                writer.putInt(0);
                writer.putInt(0);
                break;
            case CONFIRMPROTECT:
            	  writer.putInt(this.buildingType);
                  writer.putInt(this.buildingID);
                  writer.putInt(this.npcType);
                  writer.putInt(this.npcID);
                  writer.putInt(0);
                  writer.putInt(0);
                  writer.putInt(0);
                  writer.putInt(0);
                  writer.putInt(0);
                  writer.putInt(0);
                  writer.putInt(0);
                  writer.putInt(0);
                  writer.putInt(0);
                  writer.putInt(0);
                  writer.putInt(0);
                  writer.put((byte)0);
                  writer.put((byte)0);
                  writer.put((byte)0);
              
                  
                  break;
            case UNPROTECT:
                writer.putInt(this.buildingType);
                writer.putInt(this.buildingID);
                writer.putInt(npcType);
                writer.putInt(npcID);
                writer.putInt(this.protectedBuildingType);
                writer.putInt(this.protectedBuildingID);
                writer.putInt(0);
                writer.putInt(0);
                writer.putInt(0);
                writer.putInt(0);
                break;
            case VIEWUNPROTECTED:
                writer.putInt(this.buildingType);
                writer.putInt(this.buildingID);
                writer.putInt(npcType);
                writer.putInt(npcID);
                writer.putInt(0);
                writer.putInt(0);
                writer.putInt(0);
                writer.putInt(0);
                writer.putInt(0);
                writer.putInt(0);
                break;
        }
    }

    public int getObjectType() {
        return objectType;
    }

    public void setObjectType(int value) {
        this.objectType = value;
    }

    public void setPad(int value) {
        this.pad = value;
    }

    public int getUUID() {
        return objectUUID;
    }

    public int getPad() {
        return pad;
    }


    public int getMessageType() {
        return messageType;
    }

    public void setMessageType(int messageType) {
        this.messageType = messageType;
    }


    public int getNpcType() {
        return npcType;
    }

    public void setNpcType(int npcType) {
        this.npcType = npcType;
    }

    public int getNpcID() {
        return npcID;
    }

    public void setNpcID(int npcID) {
        this.npcID = npcID;
    }

    public int getBuildingType() {
        return buildingType;
    }

    public void setBuildingType(int buildingType) {
        this.buildingType = buildingType;
    }

    public int getBuildingID() {
        return buildingID;
    }

    public void setBuildingID(int buildingID) {
        this.buildingID = buildingID;
    }

    public int getProtectedBuildingType() {
        return protectedBuildingType;
    }

    public void setProtectedBuildingType(int protectedBuildingType) {
        this.protectedBuildingType = protectedBuildingType;
    }

    public int getProtectedBuildingID() {
        return protectedBuildingID;
    }

    public void setProtectedBuildingID(int protectedBuildingID) {
        this.protectedBuildingID = protectedBuildingID;
    }

    public int getWeeklyTax() {
        return weeklyTax;
    }

    public void setWeeklyTax(int weeklyTax) {
        this.weeklyTax = weeklyTax;
    }

    public int getProfitTax() {
        return profitTax;
    }

    public void setProfitTax(int profitTax) {
        this.profitTax = profitTax;
    }

    public byte getEnforceKOS() {
        return enforceKOS;
    }

    public void setEnforceKOS(byte enforceKOS) {
        this.enforceKOS = enforceKOS;
    }
}