// • ▌ ▄ ·.  ▄▄▄·  ▄▄ • ▪   ▄▄· ▄▄▄▄·  ▄▄▄·  ▐▄▄▄  ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀  █▪▀▀▀ ▀  ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀  ▀  ▀ ▀▀  █▪ ▀▀▀
//      Magicbane Emulator Project © 2013 - 2022
//                www.magicbane.com


package engine.net.client.handlers;

import engine.Enum;
import engine.Enum.GuildHistoryType;
import engine.exception.MsgSendException;
import engine.gameManager.ChatManager;
import engine.gameManager.DbManager;
import engine.gameManager.SessionManager;
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.guild.BanishUnbanishMsg;
import engine.net.client.msg.guild.GuildListMsg;
import engine.objects.Guild;
import engine.objects.GuildHistory;
import engine.objects.GuildStatusController;
import engine.objects.PlayerCharacter;
import org.joda.time.DateTime;

public class BanishUnbanishHandler extends AbstractClientMsgHandler {

	public BanishUnbanishHandler() {
		super(BanishUnbanishMsg.class);
	}

	@Override
	protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException {
		BanishUnbanishMsg msg = (BanishUnbanishMsg) baseMsg;
		Dispatch dispatch;

		int target = msg.getTarget();
		PlayerCharacter source = origin.getPlayerCharacter();

		if(source == null || source.getGuild().isErrant() || source.getGuild().getObjectUUID() == 0)
			return true;

		if (GuildStatusController.isGuildLeader(source.getGuildStatus()) == false && GuildStatusController.isInnerCouncil(source.getGuildStatus()) == false)
			return true;

		if (source.getObjectUUID() == target) {
			ErrorPopupMsg.sendErrorPopup(source, 103); // You may not banish this char
			return true;
		}

		boolean success = false;
		Guild guild = source.getGuild();
		PlayerCharacter realizedTarget = PlayerCharacter.getFromCache(target);

		if(realizedTarget != null) {
			// Guild leader can't leave guild. must pass GL or disband
			if ( GuildStatusController.isGuildLeader(realizedTarget.getGuildStatus()) == false) {
				//ICs cannot banish other ICs
				if (!(GuildStatusController.isInnerCouncil(realizedTarget.getGuildStatus()) && GuildStatusController.isGuildLeader(source.getGuildStatus()) == false)) {
					success = true;
					if (msg.getMsgType() == 1){
						if (!DbManager.GuildQueries.ADD_TO_BANISHED_FROM_GUILDLIST(guild.getObjectUUID(), realizedTarget.getObjectUUID())){
							ChatManager.chatGuildError(source, "Failed To unbanish " + realizedTarget.getName());
							return true;
						}
						guild.getBanishList().remove(realizedTarget);
					}


					else{

						if (!DbManager.GuildQueries.ADD_TO_BANISHED_FROM_GUILDLIST(guild.getObjectUUID(), realizedTarget.getObjectUUID())){
							ChatManager.chatGuildError(source, "Failed To Banish " + realizedTarget.getName());
							return true;
						}
						guild.removePlayer(realizedTarget, GuildHistoryType.BANISHED);
						guild.getBanishList().add(realizedTarget);  //TODO we might encapsulate this a bit better; also not sure that a list of PC objects is really ideal
					}

				}
			}
		} else {
			if (guild.getGuildLeaderUUID() != target) {
				PlayerCharacter toBanish = PlayerCharacter.getPlayerCharacter(target);
				if (toBanish == null)
					return true;
				//already added previously.
				if (SessionManager.getPlayerCharacterByID(toBanish.getObjectUUID()) != null)
					return true;

				if(DbManager.GuildQueries.BANISH_FROM_GUILD_OFFLINE(target, GuildStatusController.isGuildLeader(source.getGuildStatus())) != 0) {

					success = true;

					//Set guild history

					if (DbManager.GuildQueries.ADD_TO_GUILDHISTORY(guild.getObjectUUID(), toBanish, DateTime.now(), GuildHistoryType.BANISHED)){
						GuildHistory guildHistory = new GuildHistory(toBanish.getGuildUUID(),toBanish.getGuild().getName(),DateTime.now(), GuildHistoryType.BANISHED) ;
						toBanish.getGuildHistory().add(guildHistory);
					}
				}
			}
		}


		if(success) {
			//TODO re enable this once we get unbanish working!!!!
			//DbManager.GuildQueries.ADD_TO_BANISHED_FROM_GUILDLIST(guild.getobjectUUID(), target);

			// Send left guild message to rest of guild
			String targetName = PlayerCharacter.getFirstName(target);
			ChatManager.chatGuildInfo(guild,
					targetName + " has been banished from " + guild.getName() + '.');
			GuildListMsg guildListMsg = new GuildListMsg(guild);
			dispatch = Dispatch.borrow(source, guildListMsg);
			DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);
		} else {
			ErrorPopupMsg.sendErrorPopup(source, 103); // You may not banish this char
		}
		return true;

	}

}