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

package engine.wpak;

import engine.gameManager.ConfigManager;

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

public class PowersParser {

    public static String powersPath = ConfigManager.DEFAULT_DATA_DIR + "wpak/Powers.cfg";
    private static final Pattern POWER_REGEX = Pattern.compile("(?<=POWERBEGIN)(.+?)(?=POWEREND)", Pattern.DOTALL);
    private static final Pattern STRSPLIT_REGEX = Pattern.compile("([^\"]\\S*|\"[^\"]*\")\\s*");

    public static void parseWpakFile() throws IOException {

        // Read .wpak file from disk

        byte[] fileData = Files.readAllBytes(Paths.get(powersPath));
        String fileContents = new String(fileData);

        // Iterate over power entries from .wpak data

        Matcher matcher = POWER_REGEX.matcher(fileContents);

        while (matcher.find()) {

            PowerEntry powerEntry = parsePowerEntry(matcher.group().trim());

        }
    }

    private static PowerEntry parsePowerEntry(String powerData) {

        PowerEntry powerEntry = new PowerEntry();
        String[] powerEntries = powerData.trim().split("\n");
        ArrayList<String> powerHeader = new ArrayList<>();

        // Parse header

        String headerString = powerEntries[0];
        headerString = headerString.replace("\n", " ");

        Matcher matcher = STRSPLIT_REGEX.matcher(headerString);

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

        powerEntry.power_id = powerHeader.get(0);
        powerEntry.power_name = powerHeader.get(1).replaceAll("\"", "");
        powerEntry.power_type = powerHeader.get(2);
        powerEntry.skill_id = Integer.parseInt(powerHeader.get(3));
        powerEntry.skill_name = powerHeader.get(4).replaceAll("\"", "");
        powerEntry.target_type = powerHeader.get(5);
        powerEntry.range = Integer.parseInt(powerHeader.get(6));
        powerEntry.radiusType = powerHeader.get(7);
        powerEntry.radius = Integer.parseInt(powerHeader.get(8));
        powerEntry.groupReq = powerHeader.get(9);
        powerEntry.costType = powerHeader.get(10);
        powerEntry.cost = Float.parseFloat(powerHeader.get(11));
        powerEntry.unknown01 = Integer.parseInt(powerHeader.get(12));
        powerEntry.unknown02 = Integer.parseInt(powerHeader.get(13));
        powerEntry.cast_time = Float.parseFloat(powerHeader.get(14));
        powerEntry.cool_down = Float.parseFloat(powerHeader.get(15));
        powerEntry.recycle_time = Float.parseFloat(powerHeader.get(16));
        powerEntry.unknown03 = Integer.parseInt(powerHeader.get(17));
        powerEntry.combatRequirement = powerHeader.get(18);
        powerEntry.unknown04 = Integer.parseInt(powerHeader.get(19));
        powerEntry.unknown05 = Integer.parseInt(powerHeader.get(20));
        powerEntry.targetRequirement = powerHeader.get(21);

        for (int x = 2; x < powerEntries.length; x++) {
            // Parse key/pair values
            // via switch
        }

        return powerEntry;
    }

}