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


package engine.devcmd.cmds;

import engine.Enum.PowerActionType;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.ChatManager;
import engine.gameManager.PowersManager;
import engine.objects.AbstractGameObject;
import engine.objects.PlayerCharacter;
import engine.powers.ActionsBase;
import engine.powers.PowersBase;
import engine.powers.effectmodifiers.AbstractEffectModifier;
import engine.util.ThreadUtils;
import org.pmw.tinylog.Logger;

import java.util.HashMap;
import java.util.HashSet;

public class ApplyBonusCmd extends AbstractDevCmd {

    public ApplyBonusCmd() {
        super("applybonus");
    }

    @Override
    protected void _doCmd(PlayerCharacter pcSender, String[] words,
                          AbstractGameObject target) {

        String action = words[0];

        PowerActionType actionType = null;

        HashMap<String, HashSet<String>> appliedMods = new HashMap<>();

        try {

            if (action.equals("all") == false)
                for (PowerActionType powerActionType : PowerActionType.values()) {
                    if (powerActionType.name().equalsIgnoreCase(action) == false)
                        continue;
                    actionType = powerActionType;
                    break;
                }

        } catch (Exception e) {
            this.throwbackError(pcSender, "Invalid power Action type for " + action);
            this.throwbackInfo(pcSender, "Valid Types : " + this.getActionTypes());
            return;
        }
        if (action.equals("all") == false)
            if (actionType == null) {
                this.throwbackError(pcSender, "Invalid power Action type for " + action);
                this.throwbackInfo(pcSender, "Valid Types : " + this.getActionTypes());
                return;
            }


        for (PowersBase pb : PowersManager.powersBaseByIDString.values()) {
            if (pb.getActions() == null || pb.getActions().isEmpty())
                continue;

            for (ActionsBase ab : pb.getActions()) {
                if (ab.getPowerAction() == null)
                    continue;
                if (action.equals("all") == false)
                    if (ab.getPowerAction().getType().equalsIgnoreCase(action) == false)
                        continue;
                String effect1 = "";
                String effect2 = "";
                ChatManager.chatSystemInfo(pcSender, "Applying Power " + pb.getName() + " : " + pb.getDescription());
                if (ab.getPowerAction().getEffectsBase() == null) {

                    try {
                        PowersManager.runPowerAction(pcSender, pcSender, pcSender.getLoc(), ab, 1, pb);
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    ThreadUtils.sleep(500);
                    continue;
                }


                if (ab.getPowerAction().getEffectsBase().getModifiers() == null || ab.getPowerAction().getEffectsBase().getModifiers().isEmpty()) {
                    try {
                        PowersManager.runPowerAction(pcSender, pcSender, pcSender.getLoc(), ab, 1, pb);
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    continue;
                }

                boolean run = true;
                for (AbstractEffectModifier mod : ab.getPowerAction().getEffectsBase().getModifiers()) {
                    if (appliedMods.containsKey(mod.modType.name()) == false) {
                        appliedMods.put(mod.modType.name(), new HashSet<>());
                    }

//						if (appliedMods.get(mod.modType.name()).contains(mod.sourceType.name())){
//							continue;
//						}

                    appliedMods.get(mod.modType.name()).add(mod.sourceType.name());
                    try {
                        try {
                            PowersManager.runPowerAction(pcSender, pcSender, pcSender.getLoc(), ab, 1, pb);
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                    } catch (Exception e) {
                        Logger.error(e);
                    }
                    break;


                }

            }
        }
    }


    @Override
    protected String _getUsageString() {
        return "' /bounds'";
    }

    @Override
    protected String _getHelpString() {
        return "Audits all the mobs in a zone.";

    }

    private String getActionTypes() {
        String output = "";

        for (PowerActionType actionType : PowerActionType.values()) {
            output += actionType.name() + " | ";

        }

        return output.substring(0, output.length() - 3);
    }

}
