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


package engine.ConfigParsing;

import engine.ConfigParsing.EffectsData.Condition;
import engine.ConfigParsing.EffectsData.EffectData;
import engine.ConfigParsing.EffectsData.Mod;
import engine.gameManager.ConfigManager;
import engine.mbEnums;
import org.pmw.tinylog.Logger;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class EffectsParser {

    public static String EffectsPath = ConfigManager.DEFAULT_DATA_DIR + "wpak/Effects.cfg";
    public static HashMap<String, EffectData> effect_data = new HashMap<>();

    public static void init() throws IOException {

        ArrayList<ArrayList<String>> compiledData = new ArrayList<>();
        List<String> fileData = Files.readAllLines(Paths.get(EffectsPath));
        ArrayList<String> modData = new ArrayList<>();

        for (String line : fileData) {

            if (line.contains("EFFECTBEGIN")) {
                modData = new ArrayList<>();
                continue;
            }

            if (line.contains("EFFECTEND"))
                compiledData.add(modData);
            else
                modData.add(line);
        }

        CreateBlocks(compiledData);
    }

    public static void CreateBlocks(ArrayList<ArrayList<String>> compiledData) {

        for (ArrayList<String> compiledLines : compiledData) {

            EffectData effectData = new EffectData();
            effectData.id = compiledLines.get(1).replace("     ", "").split(" ")[0];
            effectData.sources = new ArrayList<>();
            effectData.mods = new ArrayList<>();
            effectData.conditions = new ArrayList<>();

            try {
                effectData.name = compiledLines.get(1).replace("     ", "").replace("\"", "").split(" ")[1];
                effectData.icon = Integer.parseInt(compiledLines.get(1).replace("     ", "").split(" ")[2]);
            } catch (Exception e) {
                Logger.error(e);
            }

            int index = 0;

            //log all sources

            for (String line : compiledLines) {

                if (line.contains("SOURCEBEGIN"))
                    effectData.sources.add(mbEnums.EffectSourceType.valueOf(compiledLines.get(index + 1).replace("          ", "")));

                index++;
            }

            //log all mods

            index = 0;

            for (String line : compiledLines) {

                if (line.contains("MODSBEGIN")) {

                    int extra = 1;
                    Mod mod = new Mod();

                    while (!compiledLines.get(index + extra).contains("MODSEND")) {
                        //data.mods.add(lines[index + extra].Replace("          ", ""));
                        mod.type = mbEnums.ModType.valueOf(compiledLines.get(index + extra).replace("          ", "").split(" ")[0]);
                        GenerateModValues(mod, compiledLines.get(index + extra).replace("          ", "").replace("    ", "").split(" "));
                        extra++;
                    }
                    effectData.mods.add(mod);
                }
                index++;
            }

            //log all conditions

            index = 0;
            for (String line : compiledLines) {

                if (line.contains("CONDITIONBEGIN")) {

                    int extra = 1;

                    while (!compiledLines.get(index + extra).contains("CONDITIONEND")) {

                        if (!compiledLines.get(index + extra).contains("#")) {
                            //data.conditions.add(lines[index + extra].Replace("          ", ""));
                            Condition condition = new Condition();
                            condition.type = compiledLines.get(index + extra).replace("          ", "").split(" ")[0];
                            condition.value = compiledLines.get(index + extra).replace("          ", "").split(" ")[1];
                        }
                        extra++;
                    }
                }
                index++;
            }
            effect_data.put(effectData.id, effectData);
        }
    }

    public static void GenerateModValues(Mod inMod, String[] data) {

        inMod.values = new ArrayList<>();

        for (int i = 1; i < data.length; i++)
            if (!data[i].isEmpty())
                inMod.values.add(data[i]);

    }
}