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

package engine.wpak;

import engine.gameManager.ConfigManager;
import engine.wpak.data.EffectDescription;
import engine.wpak.data.PowerActionEntry;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PowerActionParser {
    private static final Pattern STRSPLIT_REGEX = Pattern.compile("([^\"]\\S*|\"[^\"]*\")\\s*");
    private static final Pattern POWER_ACTION_REGEX = Pattern.compile("(?<=POWERACTIONBEGIN)(.+?)(?=POWERACTIONEND)", Pattern.DOTALL);
    private static final String powerActionPath = ConfigManager.DEFAULT_DATA_DIR + "wpak/PowerActions.cfg";

    public static void parseWpakFile() {

        // Read .wpak file from disk

        byte[] fileData;

        try {
            fileData = Files.readAllBytes(Paths.get(powerActionPath));
        } catch (
                IOException e) {
            throw new RuntimeException(e);
        }

        String fileContents = new String(fileData);

        // Iterate over power entries from .wpak data

        Matcher matcher = POWER_ACTION_REGEX.matcher(fileContents);

        while (matcher.find()) {

            PowerActionEntry powerActionEntry = parsePowerActionEntry(matcher.group().trim());

        }
    }

    private static PowerActionEntry parsePowerActionEntry(String powerActionData) {

        PowerActionEntry powerActionEntry = new PowerActionEntry();
        EffectDescription effectDescription;

        // Remove all lines that contain a # and leading/trailing blank lines

        powerActionData = powerActionData.replaceAll("(?m)^(\\s*#.*|\\s*)\r?\n?", "").trim();

        String[] lineData = powerActionData.split("\n");

        // Parse effect entry header

        Iterator<String> entryIterator = Arrays.stream(lineData).iterator();

        String headerLine = entryIterator.next();
        ArrayList<String> headerData = new ArrayList<>();

        Matcher matcher = STRSPLIT_REGEX.matcher(headerLine.trim());

        while (matcher.find())
            headerData.add(matcher.group().trim());

        Iterator<String> headerIterator = headerData.iterator();

        powerActionEntry.action_id = headerIterator.next();
        powerActionEntry.action_type = headerIterator.next();

        while (headerIterator.hasNext()) {
            effectDescription = new EffectDescription();
            effectDescription.effect_id = headerIterator.next();
            effectDescription.level = Integer.parseInt(headerIterator.next());
        }

        // Process key value pairs after header

        return powerActionEntry;
    }
}