package engine.net.client.handlers;

import engine.Enum;
import engine.InterestManagement.RealmMap;
import engine.exception.MsgSendException;
import engine.gameManager.BuildingManager;
import engine.net.Dispatch;
import engine.net.DispatchMessage;
import engine.net.client.ClientConnection;
import engine.net.client.msg.ClientNetMsg;
import engine.net.client.msg.ErrorPopupMsg;
import engine.net.client.msg.TaxCityMsg;
import engine.net.client.msg.ViewResourcesMessage;
import engine.objects.*;

/*
 * @Author:
 * @Summary: Processes application protocol message which handles
 * protecting and unprotecting city assets
 */
public class TaxCityMsgHandler extends AbstractClientMsgHandler {

    public TaxCityMsgHandler() {
        super(TaxCityMsg.class);
    }

    private static boolean ViewTaxes(TaxCityMsg msg, PlayerCharacter player) {

        // Member variable declaration
        Building building = BuildingManager.getBuildingFromCache(msg.getGuildID());
        Guild playerGuild = player.getGuild();

        if (building == null) {
            ErrorPopupMsg.sendErrorMsg(player, "Not a valid Building!");
            return true;
        }

        City city = building.getCity();
        if (city == null) {
            ErrorPopupMsg.sendErrorMsg(player, "This building does not belong to a city.");
            return true;
        }

        if (city.getWarehouse() == null) {
            ErrorPopupMsg.sendErrorMsg(player, "This city does not have a warehouse!");
            return true;
        }


        if (playerGuild == null || playerGuild.isEmptyGuild()) {
            ErrorPopupMsg.sendErrorMsg(player, "You must belong to a guild to do that!");
            return true;
        }

        if (playerGuild.getOwnedCity() == null) {
            ErrorPopupMsg.sendErrorMsg(player, "Your Guild needs to own a city!");
            return true;
        }

        if (playerGuild.getOwnedCity().getWarehouse() == null) {
            ErrorPopupMsg.sendErrorMsg(player, "Your Guild needs to own a warehouse!");
            return true;
        }

        if (playerGuild.getOwnedCity().getTOL() == null) {
            ErrorPopupMsg.sendErrorMsg(player, "Cannot find Tree of Life for your city!");
            return true;
        }

//		if (playerGuild.getOwnedCity().getTOL().getRank() != 8){
//			ErrorPopupMsg.sendErrorMsg(player, "Your City needs to Own a realm!");
//			return true;
//		}

        if (playerGuild.getOwnedCity().getRealm() == null) {
            ErrorPopupMsg.sendErrorMsg(player, "Cannot find realm for your city!");
            return true;
        }
        Realm targetRealm = RealmMap.getRealmForCity(city);

        if (targetRealm == null) {
            ErrorPopupMsg.sendErrorMsg(player, "Cannot find realm for city you are attempting to tax!");
            return true;
        }

//		if (targetRealm.getRulingCity() == null){
//			ErrorPopupMsg.sendErrorMsg(player, "Realm Does not have a ruling city!");
//			return true;
//		}

//		if (targetRealm.getRulingCity().getObjectUUID() != playerGuild.getOwnedCity().getObjectUUID()){
//			ErrorPopupMsg.sendErrorMsg(player, "Your guild does not rule this realm!");
//			return true;
//		}

//		if (playerGuild.getOwnedCity().getObjectUUID() == city.getObjectUUID()){
//			ErrorPopupMsg.sendErrorMsg(player, "You cannot tax your own city!");
//			return true;
//		}


        if (!GuildStatusController.isTaxCollector(player.getGuildStatus())) {
            ErrorPopupMsg.sendErrorMsg(player, "You Must be a tax Collector!");
            return true;
        }


//		if (!city.isAfterTaxPeriod(DateTime.now(), player))
//			return true;


        ViewResourcesMessage vrm = new ViewResourcesMessage(player);
        vrm.setGuild(building.getGuild());
        vrm.setWarehouseBuilding(BuildingManager.getBuildingFromCache(building.getCity().getWarehouse().getBuildingUID()));
        vrm.configure();
        Dispatch dispatch = Dispatch.borrow(player, msg);
        DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
        dispatch = Dispatch.borrow(player, vrm);
        DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
        return true;


    }

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

        // Member variable declaration

        PlayerCharacter player;
        TaxCityMsg msg;

        player = origin.getPlayerCharacter();


        msg = (TaxCityMsg) baseMsg;

        ViewTaxes(msg, player);


        return true;

    }


}