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


package engine.net.client.handlers;


import engine.Enum;
import engine.Enum.GameObjectType;
import engine.exception.MsgSendException;
import engine.gameManager.ChatManager;
import engine.gameManager.ConfigManager;
import engine.gameManager.GuildManager;
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.InviteToGuildMsg;
import engine.objects.GuildStatusController;
import engine.objects.PlayerCharacter;

public class InviteToGuildHandler extends AbstractClientMsgHandler {

    public InviteToGuildHandler() {
        super(InviteToGuildMsg.class);
    }

    @Override
    protected boolean _handleNetMsg(ClientNetMsg baseMsg, ClientConnection origin) throws MsgSendException {
        InviteToGuildMsg msg;
        PlayerCharacter sourcePlayer;
        PlayerCharacter targetPlayer;
        Dispatch dispatch;

        msg = (InviteToGuildMsg) baseMsg;

        // First see if this is a refusal to another guild invite

        if (msg.getResponse() == 4)
            return true; // Player refused invite

        // get sourcePlayer player

        sourcePlayer = SessionManager.getPlayerCharacter(origin);

        if (sourcePlayer == null)
            return true;

        if (msg.getTargetUUID() == 0) {
            // get targetPlayer player by name
            targetPlayer = SessionManager.getPlayerCharacterByLowerCaseName(msg.getTargetName());

            if (targetPlayer == null) {
                ChatManager.chatGuildError(sourcePlayer,
                        "No such player exists!");
                return true;
            }
        } else if (msg.getTargetType() == GameObjectType.PlayerCharacter.ordinal()) {

            targetPlayer = SessionManager.getPlayerCharacterByID(msg.getTargetUUID());

            if (targetPlayer == null) {
                ChatManager.chatGuildError(sourcePlayer,
                        "No such player exists!");
                return true;
            }
        } else {
            ChatManager.chatGuildError(sourcePlayer,
                    "You cannot invite that character!");
            return true;
        }

        // get sourcePlayer guild. Verify sourcePlayer player is in guild

        if (sourcePlayer.getGuild().getObjectUUID() == 0 || sourcePlayer.getGuild().isEmptyGuild()) {
            ChatManager.chatGuildError(sourcePlayer,
                    "You cannot invite someone for errant!");
            return true;
        }

        Enum.GuildCharterType guildCharterType = Enum.GuildCharterType.values()[sourcePlayer.getGuild().getCharter()];

        if (guildCharterType == null) {
            ErrorPopupMsg.sendErrorPopup(sourcePlayer, GuildManager.NO_CHARTER_FOUND);
            return true;
        }


        // verify sourcePlayer player is full member so they can invite

        if (GuildStatusController.isFullMember(sourcePlayer.getGuildStatus()) == false) {
            ChatManager.chatGuildError(sourcePlayer,
                    "You do not have authority to invite!");
            return true;
        }

        //block invite is targetPlayer is ignoring sourcePlayer

        if (targetPlayer.isIgnoringPlayer(sourcePlayer))
            return true;

        if ((targetPlayer.getGuild().isEmptyGuild() == false)) {
            ChatManager.chatGuildError(sourcePlayer,
                    targetPlayer.getFirstName() + " already belongs to a guild!");
            return true;
        }

        // verify targetPlayer player is not on banish list

        if (sourcePlayer.getGuild().getBanishList().contains(targetPlayer)) {
            ErrorPopupMsg.sendErrorPopup(sourcePlayer, 135);// Character is considered BANISHED by guild leadership
            return true;
        }

        //verify targetPlayer meets level requirements of guild

        if ((targetPlayer.getLevel() < sourcePlayer.getGuild().getRepledgeMin()) || targetPlayer.getLevel() > sourcePlayer.getGuild().getRepledgeMax()) {
            ErrorPopupMsg.sendErrorPopup(sourcePlayer, 135);// you do not meet the level required for this SWORN guild
            return true;
        }
        if(ConfigManager.MB_RULESET.getValue() == "LORE") {
            if (GuildManager.meetsLoreRequirements(sourcePlayer.guild, targetPlayer) == false) {
                ChatManager.chatGuildError(sourcePlayer,targetPlayer.getFirstName() + " does not meet charter requirements!");
                return true;
            }
        }
        targetPlayer.setLastGuildToInvite(sourcePlayer.getGuild().getObjectUUID());

        // setup guild invite message to send to targetPlayer

        msg.setSourceType(sourcePlayer.getObjectType().ordinal());
        msg.setSourceUUID(sourcePlayer.getObjectUUID());
        msg.setTargetType(targetPlayer.getObjectType().ordinal());

        msg.setTargetUUID(targetPlayer.getObjectUUID());
        msg.setGuildTag(sourcePlayer.getGuild().getGuildTag());
        msg.setGuildName(sourcePlayer.getGuild().getName());
        msg.setGuildType(sourcePlayer.getGuild().getObjectType().ordinal());
        msg.setGuildUUID(sourcePlayer.getGuild().getObjectUUID());
        msg.setTargetName("");

        dispatch = Dispatch.borrow(targetPlayer, msg);
        DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY);

        return true;
    }

}