package engine.net.client.handlers;

import engine.Enum.BuildingGroup;
import engine.Enum.GuildState;
import engine.exception.MsgSendException;
import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
import engine.gameManager.GuildManager;
import engine.gameManager.ZoneManager;
import engine.net.client.ClientConnection;
import engine.net.client.msg.ChatFilterMsg;
import engine.net.client.msg.ClientNetMsg;
import engine.objects.*;
import org.pmw.tinylog.Logger;

/*
 * @Author:
 * @Summary: Processes application protocol message which processes
 * client requests to abandon a building.
 */
public class ChannelMuteMsgHandler extends AbstractClientMsgHandler {

    // Instance variables

    public ChannelMuteMsgHandler() {
        super(ChatFilterMsg.class);

    }

    private static void AbandonSingleAsset(PlayerCharacter sourcePlayer,
                                           Building targetBuilding) {

        // Transfer the building asset ownership and refresh all clients

        DbManager.BuildingQueries.CLEAR_FRIENDS_LIST(targetBuilding.getObjectUUID());
        targetBuilding.getFriends().clear();

        DbManager.BuildingQueries.CLEAR_CONDEMNED_LIST(targetBuilding.getObjectUUID());
        targetBuilding.getCondemned().clear();
        targetBuilding.setOwner(null);
        targetBuilding.refreshGuild();
    }

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

        return true;
    }

    private void AbandonAllCityObjects(PlayerCharacter sourcePlayer,
                                       Building targetBuilding) {
        Guild sourceGuild;
        Zone cityZone;

        sourceGuild = sourcePlayer.getGuild();

        if (sourceGuild == null)
            return;

        if (sourceGuild.getSubGuildList().size() > 0) {
            ChatManager.chatCityError(sourcePlayer, "You Cannot abandon a nation city.");
            return;
        }

        cityZone = ZoneManager.findSmallestZone(targetBuilding.getLoc());

        // Can't abandon a tree not within a player city zone
        if (cityZone.guild_zone == false)
            return;

        if (targetBuilding.getCity().hasBeenTransfered == true) {
            ChatManager.chatCityError(sourcePlayer, "City can only be abandoned once per rebooting.");
            return;
        }

        // Guild no longer owns his tree.
        if (!DbManager.GuildQueries.SET_GUILD_OWNED_CITY(sourceGuild.getObjectUUID(), 0)) {
            Logger.error("Failed to update Owned City to Database");
            return;
        }

        sourceGuild.setCityUUID(0);
        sourceGuild.setGuildState(GuildState.Errant);
        sourceGuild.setNation(null);

        // Transfer the city assets
        TransferCityAssets(sourcePlayer, targetBuilding);

        GuildManager.updateAllGuildTags(sourceGuild);
        GuildManager.updateAllGuildBinds(sourceGuild, null);

    }

    private void TransferCityAssets(PlayerCharacter sourcePlayer,
                                    Building cityTOL) {

        Zone cityZone;

        // Build list of buildings within this parent zone
        cityZone = ZoneManager.findSmallestZone(cityTOL.getLoc());

        for (Building cityBuilding : cityZone.zoneBuildingSet) {

            Blueprint cityBlueprint;
            cityBlueprint = cityBuilding.getBlueprint();

            // Buildings without blueprints cannot be abandoned
            if (cityBlueprint == null)
                continue;

            // Transfer ownership of valid city assets
            if ((cityBlueprint.getBuildingGroup() == BuildingGroup.TOL)
                    || (cityBlueprint.getBuildingGroup() == BuildingGroup.SPIRE)
                    || (cityBlueprint.getBuildingGroup() == BuildingGroup.BARRACK)
                    || (cityBlueprint.isWallPiece())
                    || (cityBuilding.getBlueprint().getBuildingGroup() == BuildingGroup.SHRINE))
                AbandonSingleAsset(sourcePlayer, cityBuilding);

        }

    }

}