package engine.net.client.handlers;

import engine.exception.MsgSendException;
import engine.gameManager.BuildingManager;
import engine.gameManager.CombatManager;
import engine.mbEnums;
import engine.net.client.ClientConnection;
import engine.net.client.msg.AttackCmdMsg;
import engine.net.client.msg.ClientNetMsg;
import engine.net.client.msg.TargetedActionMsg;
import engine.objects.AbstractWorldObject;
import engine.objects.Mob;
import engine.objects.NPC;
import engine.objects.PlayerCharacter;

/*
 * @Author:
 * @Summary: Processes application protocol message which keeps
 * client's tcp connection open.
 */

public class AttackCmdMsgHandler extends AbstractClientMsgHandler {

    public AttackCmdMsgHandler() {
        super(AttackCmdMsg.class);
    }

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

        PlayerCharacter playerCharacter = origin.getPlayerCharacter();

        // Member variable declaration

        AttackCmdMsg msg;

        // Member variable assignment

        msg = (AttackCmdMsg) baseMsg;

        if (TargetedActionMsg.un2cnt == 60 || TargetedActionMsg.un2cnt == 70)
            return true;

        if (playerCharacter == null)
            return true;

        AbstractWorldObject target = null;
        mbEnums.GameObjectType targetType;

        targetType = mbEnums.GameObjectType.values()[msg.getTargetType()];

        switch (targetType) {
            case Mob:
                target = Mob.getMob(msg.getTargetID());
                break;
            case PlayerCharacter:
                target = PlayerCharacter.getPlayerCharacter(msg.getTargetID());
                break;
            case Building:
                target = BuildingManager.getBuilding(msg.getTargetID());
                break;
            case NPC:
                target = NPC.getNPC(msg.getTargetID());
                break;
        }
        if (target == null) {
            playerCharacter.setCombatTarget(null);
            return true; // cannot attack a null target
        }

        // No point in setting combat target to someone you are already fighting

        if (playerCharacter.isCombat() && playerCharacter.getCombatTarget() != null &&
                playerCharacter.getCombatTarget().equals(target))
            return true;

        //set sources target

        playerCharacter.setCombatTarget(target);

        //put in combat if not already

        if (!playerCharacter.isCombat()) {
            //CombatManager.toggleCombat(true, origin);
            CombatManager.toggleCombat(true, origin);
        }
        //make character stand if sitting

        if (playerCharacter.isSit())
            CombatManager.toggleSit(false, origin);

        CombatManager.combatCycle(playerCharacter, target);

        return true;
    }

}