package com.qmth.boot.data.upgrade.utils;

import org.apache.commons.lang3.StringUtils;

import java.util.Comparator;

public class VersionComparator implements Comparator<String> {

    @Override
    public int compare(String v1, String v2) {
        if (!VersionComparator.isValidVersion(v1)) {
            throw new IllegalArgumentException("版本号" + v1 + "格式不正确！要求格式如：数字.数字.数字");
        }
        if (!VersionComparator.isValidVersion(v2)) {
            throw new IllegalArgumentException("版本号" + v2 + "格式不正确！要求格式如：数字.数字.数字");
        }

        // 分割版本号为数字段
        String[] parts1 = v1.split("\\.");
        String[] parts2 = v2.split("\\.");

        // 获取最大段数
        int maxLength = Math.max(parts1.length, parts2.length);

        for (int i = 0; i < maxLength; i++) {
            // 处理长度不一致的情况，缺失段视为0
            int num1 = (i < parts1.length) ? parseNumber(parts1[i]) : 0;
            int num2 = (i < parts2.length) ? parseNumber(parts2[i]) : 0;

            if (num1 != num2) {
                return Integer.compare(num1, num2);
            }
        }

        return 0;
    }

    public static int parseNumber(String str) {
        try {
            return Integer.parseInt(str);
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("字符串" + str + "转换为数字失败！");
        }
    }

    /**
     * 校验版本号，格式如：数字.数字.数字
     */
    public static boolean isValidVersion(String version) {
        if (StringUtils.isBlank(version)) {
            return false;
        }
        // String regex = "\\d+\\.\\d+\\.\\d+";
        String regex = "\\d+(\\.\\d+)*$";
        return version.matches(regex);
    }

}
