package com.dynious.versionchecker.checker;

import org.apache.commons.lang3.StringUtils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class NEMUtils
{
    public static final String versionDelimiters = "[\\.\\-_]";

    public static final String allVersionRegex = "[a-zA-Z0-9]+(" + versionDelimiters + "[a-zA-Z0-9]+)*";
    public static final String numericalVersionRegex = "[0-9]+(" + versionDelimiters + "[0-9]+)*";

    public static boolean isNumericalVersion(String version) {
        Pattern numVersionPattern = Pattern.compile(numericalVersionRegex);
        Matcher matcher = numVersionPattern.matcher(version);
        return matcher.matches();
    }

    public static String[] versionSplitting(String version, String regexVersionDelimiters) {
        Pattern pattern = Pattern.compile(regexVersionDelimiters);
        return pattern.split(version);
    }

    public static boolean isNewer(String version, String compareVersion) {
        if (version.equals(compareVersion))
            return false;

        boolean numericalCompare = isNumericalVersion(version) && isNumericalVersion(compareVersion);

        String[] versionParts = versionSplitting(version, versionDelimiters);
        String[] compareVersionParts = versionSplitting(compareVersion, versionDelimiters);

        // ignore versions with different numbers of tokens
        // because they are false positives more often than not
        if (versionParts.length != compareVersionParts.length)
            return false;

        if(numericalCompare) {
            for(int i = 0; i < Math.min(versionParts.length, compareVersionParts.length); i++) {
                Integer currentVersionNumber = Integer.parseInt(versionParts[i]);
                Integer currentCompareNumber = Integer.parseInt(compareVersionParts[i]);

                if(currentVersionNumber > currentCompareNumber) {
                    return true;
                } else if(currentVersionNumber < currentCompareNumber) {
                    return false;
                }
            }
            return false;
        } else {
            for(int i = 0; i < Math.min(versionParts.length, compareVersionParts.length); i++) {
                String currentVersionPart = versionParts[i];
                String currentComparePart = compareVersionParts[i];
                for(int c = 0; c < Math.min(currentVersionPart.length(), currentComparePart.length()); c++) {
                    if(currentVersionPart.charAt(c) > currentComparePart.charAt(c)) {
                        return true;
                    } else if(currentVersionPart.charAt(c) < currentComparePart.charAt(c)) {
                        return false;
                    }
                }
                if(currentVersionPart.length() > currentComparePart.length()) {
                    return true;
                } else if(currentVersionPart.length() < currentComparePart.length()) {
                    return false;
                }
            }
            return false;
        }
    }

    public static String patchVersion(String modVersion) {
        modVersion = modVersion.replaceAll(Pattern.quote("(" + NEMChecker.getMcVersion() + ")"), "");
        modVersion = modVersion.replaceAll(Pattern.quote("[" + NEMChecker.getMcVersion() + "]"), "");
        modVersion = modVersion.replaceAll("[\\)\\]]", "").replaceAll("[\\(\\[]", ".");
        modVersion = modVersion.replaceAll(Pattern.quote("_" + NEMChecker.getMcVersion()), "");
        modVersion = modVersion.replaceAll(Pattern.quote(NEMChecker.getMcVersion() + "_"), "");
        modVersion = modVersion.replaceAll(Pattern.quote(NEMChecker.getMcVersion() + "-"), "");
        modVersion = modVersion.replaceAll("^v", "").replaceAll("^V", "");
        modVersion = modVersion.replaceAll(" build ", ".").replaceAll("\\s","");

        int index = modVersion.lastIndexOf('-');
        if (index != -1)
        {
            String lastPart = modVersion.substring(index + 1);
            if (StringUtils.isAlpha(lastPart))
                modVersion = modVersion.substring(0, index);
        }

        return modVersion;
    }

    public static boolean isDevVersion(String version)
    {
        return version.equals("dev-only") || version.equals("alpha-only") || version.equals("beta-only");
    }
}