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

package engine.net.client.handlers;

import engine.Enum;
import engine.Enum.DispatchChannel;
import engine.exception.MsgSendException;
import engine.gameManager.ChatManager;
import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection;
import engine.net.client.msg.ApplyEffectMsg;
import engine.net.client.msg.ClientNetMsg;
import engine.net.client.msg.TransferItemFromEquipToInventoryMsg;
import engine.net.client.msg.TransferItemFromInventoryToEquipMsg;
import engine.objects.CharacterItemManager;
import engine.objects.Effect;
import engine.objects.Item;
import engine.objects.PlayerCharacter;
import engine.server.MBServerStatics;

public class TransferItemFromInventoryToEquipHandler extends AbstractClientMsgHandler {

    public TransferItemFromInventoryToEquipHandler() {
        super(TransferItemFromInventoryToEquipMsg.class);
    }

    @Override
    protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException {

        PlayerCharacter playerCharacter = origin.getPlayerCharacter();
        TransferItemFromInventoryToEquipMsg transferMsg = (TransferItemFromInventoryToEquipMsg) baseMsg;
        CharacterItemManager itemManager = playerCharacter.getCharItemManager();

        if (itemManager == null) {
            forceTransferFromEquipToInventory(transferMsg, origin, "Can't find your item manager");
            return true;
        }

        int uuid = transferMsg.getUUID();
        int slot = transferMsg.getSlotNumber();
        //System.out.println("loading to slot: " + slot);

        Item i = itemManager.getItemByUUID(uuid);

        if (i == null) {
            forceTransferFromEquipToInventory(transferMsg, origin, "Item not found in your item manager");
            return true;
        }

        if (!itemManager.doesCharOwnThisItem(i.getObjectUUID())) {
            forceTransferFromEquipToInventory(transferMsg, origin, "You do not own this item");
            return true;
        }

        //dupe check
        if (!i.validForInventory(origin, playerCharacter, itemManager))
            return true;

        if (i.containerType == Enum.ItemContainerType.INVENTORY) {
            if (!itemManager.equipItem(i, (byte) slot)) {
                forceTransferFromEquipToInventory(transferMsg, origin, "Failed to transfer item.");
                return true;
            }
        } else {
            forceTransferFromEquipToInventory(transferMsg, origin, "This item is not in your inventory");
            return true;
        }

        // Update player formulas
        playerCharacter.applyBonuses();
        DispatchMessage.dispatchMsgToInterestArea(playerCharacter, transferMsg, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false);

        for (String name : i.getEffects().keySet()) {
            Effect eff = i.getEffects().get(name);

            if (eff == null)
                return true;

            ApplyEffectMsg pum = new ApplyEffectMsg();
            pum.setEffectID(eff.getEffectToken());
            pum.setSourceType(playerCharacter.getObjectType().ordinal());
            pum.setSourceID(playerCharacter.getObjectUUID());
            pum.setTargetType(playerCharacter.getObjectType().ordinal());
            pum.setTargetID(playerCharacter.getObjectUUID());
            pum.setNumTrains(eff.getTrains());
            pum.setUnknown05(1);
            pum.setUnknown06((byte) 1);
            pum.setEffectSourceType(i.getObjectType().ordinal());
            pum.setEffectSourceID(i.getObjectUUID());
            pum.setDuration(-1);

            DispatchMessage.dispatchMsgToInterestArea(playerCharacter, pum, DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false);
        }

        return true;
    }

    private static void forceTransferFromEquipToInventory(TransferItemFromInventoryToEquipMsg msg, ClientConnection origin, String reason) {

        PlayerCharacter player = origin.getPlayerCharacter();

        if (player == null)
            return;

        TransferItemFromEquipToInventoryMsg back = new TransferItemFromEquipToInventoryMsg(player, msg.getSlotNumber());
        Dispatch dispatch = Dispatch.borrow(player, back);
        DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY);

        ChatManager.chatInfoError(player, "Can't equip item: " + reason);
    }

}