/**
 *******************************************************************************
 * Copyright (C) 2001-2010, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */
package com.ibm.icu.impl;

import com.ibm.icu.util.VersionInfo;

public final class ICUDebug {
    private static String params;
    static {
        try {
            params = System.getProperty("ICUDebug");
        }
        catch (SecurityException e) {
        }
    }
    private static boolean debug = params != null;
    private static boolean help = debug && (params.equals("") || params.indexOf("help") != -1);

    static {
        if (debug) {
            System.out.println("\nICUDebug=" + params);
        }
    }

    public static final String javaVersionString = System.getProperty("java.version", "0");
    public static final boolean isJDK14OrHigher;
    public static final VersionInfo javaVersion;

    public static VersionInfo getInstanceLenient(String s) {
        // Extracting ASCII numbers up to 4 delimited by
        // any non digit characters
        int[] ver = new int[4];
        boolean numeric = false;
        int i = 0, vidx = 0;
        while (i < s.length()) {
            char c = s.charAt(i++);
            if (c < '0' || c > '9') {
                if (numeric) {
                    if (vidx == 3) {
                        // up to 4 numbers
                        break;
                    }
                    numeric = false;
                    vidx++;
                }
            } else {
                if (numeric) {
                    ver[vidx] = ver[vidx] * 10 + (c - '0');
                    if (ver[vidx] > 255) {
                        // VersionInfo does not support numbers
                        // greater than 255.  In such case, we
                        // ignore the number and the rest
                        ver[vidx] = 0;
                        break;
                    }
                } else {
                    numeric = true;
                    ver[vidx] = c - '0';
                }
            }
        }

        return VersionInfo.getInstance(ver[0], ver[1], ver[2], ver[3]);
    }

    static {
        javaVersion = getInstanceLenient(javaVersionString);

        VersionInfo java14Version = VersionInfo.getInstance("1.4.0");

        isJDK14OrHigher = javaVersion.compareTo(java14Version) >= 0;
    }

    public static boolean enabled() {
        return debug;
    }

    public static boolean enabled(String arg) {
        if (debug) {
            boolean result = params.indexOf(arg) != -1;
            if (help) System.out.println("\nICUDebug.enabled(" + arg + ") = " + result);
            return result;
        }
        return false;
    }

    public static String value(String arg) {
        String result = "false";
        if (debug) {
            int index = params.indexOf(arg);
            if (index != -1) {
                index += arg.length();
                if (params.length() > index && params.charAt(index) == '=') {
                    index += 1;
                    int limit = params.indexOf(",", index);
                    result = params.substring(index, limit == -1 ? params.length() : limit);
                } else {
                    result = "true";
                }
            }

            if (help) System.out.println("\nICUDebug.value(" + arg + ") = " + result);
        }
        return result;
    }

//    static public void main(String[] args) {
//        // test
//        String[] tests = {
//            "1.3.0",
//            "1.3.0_02",
//            "1.3.1ea",
//            "1.4.1b43",
//            "___41___5",
//            "x1.4.51xx89ea.7f",
//            "1.6_2009",
//            "10-100-1000-10000",
//            "beta",
//            "0",
//        };
//        for (int i = 0; i < tests.length; ++i) {
//            System.out.println(tests[i] + " => " + getInstanceLenient(tests[i]));
//        }
//    }
}
