package engine.net.client.handlers;

import engine.Enum;
import engine.exception.MsgSendException;
import engine.gameManager.BuildingManager;
import engine.gameManager.CombatManager;
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.*;

/*
 * @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;
        Enum.GameObjectType targetType;

        targetType = Enum.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
        }
        //set sources target

        playerCharacter.setCombatTarget(target);

        //put in combat if not already

        if (!playerCharacter.isCombat())
            CombatManager.toggleCombat(true, origin);

        //make character stand if sitting

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

        CombatManager.AttackTarget(playerCharacter, target);

        return true;
    }

}