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.AbstractWorldObject;
import engine.objects.Building;
import engine.objects.Mob;
import engine.objects.PlayerCharacter;
import org.pmw.tinylog.Logger;

/*
 * @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;

        if(msg.getTargetType() == Enum.GameObjectType.Mob.ordinal()){
            target = Mob.getMob(msg.getTargetID());
        } else if(msg.getTargetType() == Enum.GameObjectType.Building.ordinal()){
            target = BuildingManager.getBuilding(msg.getTargetID());
            Building targetBuilding = (Building) target;
                if(!targetBuilding.isVulnerable() || targetBuilding.getRank() < 0) {
                    playerCharacter.setCombatTarget(null);
                    return true;
                }
        } else if(msg.getTargetType() == Enum.GameObjectType.PlayerCharacter.ordinal()){
            target = PlayerCharacter.getPlayerCharacter(msg.getTargetID());
        } else{
            playerCharacter.setCombatTarget(null);
            return true; //cannot attack other things
        }

        if(target == null) {
            playerCharacter.setCombatTarget(target);
            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;
    }

}