/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.commons.imaging.util;

import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.color.ICC_Profile;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;

public final class Debug
{

    private static final boolean DEBUG = false;
    
    public static void debug(String message)
    {
        if (DEBUG) {
            System.out.println(message);
        }
    }

    public static void debug(Object o)
    {
        if (DEBUG) {
            System.out.println(o == null ? "null" : o.toString());
        }
    }

    public static String getDebug(String message)
    {
        return message;
    }

    public static void debug()
    {
        newline();
    }

    public static void newline()
    {
        if (DEBUG) {
            System.out.print(newline);
        }
    }

    public static String getDebug(String message, int value)
    {
        return getDebug(message + ": " + (value));
    }

    public static String getDebug(String message, double value)
    {
        return getDebug(message + ": " + (value));
    }

    public static String getDebug(String message, String value)
    {
        return getDebug(message + " " + value);
    }

    public static String getDebug(String message, long value)
    {
        return getDebug(message + " " + Long.toString(value));
    }

    public static String getDebug(String message, int v[])
    {
        StringBuffer result = new StringBuffer();

        if (v == null)
            result.append(message + " (" + null + ")" + newline);
        else
        {
            result.append(message + " (" + v.length + ")" + newline);
            for (int i = 0; i < v.length; i++)
                result.append("\t" + v[i] + newline);
            result.append(newline);
        }
        return result.toString();
    }

    public static String getDebug(String message, byte v[])
    {
        final int max = 250;
        return getDebug(message, v, max);
    }

    public static String getDebug(String message, byte v[], int max)
    {

        StringBuffer result = new StringBuffer();

        if (v == null)
            result.append(message + " (" + null + ")" + newline);
        else
        {
            result.append(message + " (" + v.length + ")" + newline);
            for (int i = 0; i < max && i < v.length; i++)
            {
                int b = 0xff & v[i];

                char c;
                if (b == 0 || b == 10 || b == 11 || b == 13)
                    c = ' ';
                else
                    c = (char) b;

                result.append("\t" + i + ": " + b + " (" + c + ", 0x"
                        + Integer.toHexString(b) + ")" + newline);
            }
            if (v.length > max)
                result.append("\t" + "..." + newline);

            result.append(newline);
        }
        return result.toString();
    }

    public static String getDebug(String message, char v[])
    {
        StringBuffer result = new StringBuffer();

        if (v == null)
            result.append(getDebug(message + " (" + null + ")") + newline);
        else
        {
            result.append(getDebug(message + " (" + v.length + ")") + newline);
            for (int i = 0; i < v.length; i++)
                result.append(getDebug("\t" + v[i] + " (" + (0xff & v[i]))
                        + ")" + newline);
            result.append(newline);
        }
        return result.toString();
    }

    private static long counter = 0;

    public static String getDebug(String message, java.util.List<?> v)
    {
        StringBuffer result = new StringBuffer();

        String suffix = " [" + counter++ + "]";

        result.append(getDebug(message + " (" + v.size() + ")" + suffix)
                + newline);
        for (int i = 0; i < v.size(); i++)
            result.append(getDebug("\t" + v.get(i).toString() + suffix)
                    + newline);
        result.append(newline);

        return result.toString();
    }

    public static void debug(String message, Map map)
    {
        debug(getDebug(message, map));
    }

    public static String getDebug(String message, Map map)
    {
        StringBuffer result = new StringBuffer();

        if (map == null)
            return getDebug(message + " map: " + null);

        List keys = new ArrayList(map.keySet());
        result.append(getDebug(message + " map: " + keys.size()) + newline);
        for (int i = 0; i < keys.size(); i++)
        {
            Object key = keys.get(i);
            Object value = map.get(key);
            result.append(getDebug("\t" + i + ": '" + key + "' -> '" + value
                    + "'")
                    + newline);
        }

        result.append(newline);

        return result.toString();
    }

    public static boolean compare(String prefix, Map a, Map b)
    {
        return compare(prefix, a, b, null, null);
    }

    //    public static String newline = System.getProperty("line.separator");
    public static final String newline = "\r\n";

    private static void log(StringBuffer buffer, String s)
    {
        Debug.debug(s);
        if (buffer != null)
            buffer.append(s + newline);
    }

    public static boolean compare(String prefix, Map a, Map b,
            List ignore, StringBuffer buffer)
    {
        if ((a == null) && (b == null))
        {
            log(buffer, prefix + " both maps null");
            return true;
        }
        if (a == null)
        {
            log(buffer, prefix + " map a: null, map b: map");
            return false;
        }
        if (b == null)
        {
            log(buffer, prefix + " map a: map, map b: null");
            return false;
        }

        List keys_a = new ArrayList(a.keySet());
        List keys_b = new ArrayList(b.keySet());

        if (ignore != null)
        {
            keys_a.removeAll(ignore);
            keys_b.removeAll(ignore);
        }

        boolean result = true;

        for (int i = 0; i < keys_a.size(); i++)
        {
            Object key = keys_a.get(i);
            if (!keys_b.contains(key))
            {
                log(buffer, prefix + "b is missing key '" + key + "' from a");
                result = false;
            }
            else
            {
                keys_b.remove(key);
                Object value_a = a.get(key);
                Object value_b = b.get(key);
                if (!value_a.equals(value_b))
                {
                    log(buffer, prefix + "key(" + key + ") value a: " + value_a
                            + ") !=  b: " + value_b + ")");
                    result = false;
                }
            }
        }
        for (int i = 0; i < keys_b.size(); i++)
        {
            Object key = keys_b.get(i);

            log(buffer, prefix + "a is missing key '" + key + "' from b");
            result = false;
        }

        if (result)
            log(buffer, prefix + "a is the same as  b");

        return result;
    }

    private static final String byteQuadToString(int bytequad)
    {
        byte b1 = (byte) ((bytequad >> 24) & 0xff);
        byte b2 = (byte) ((bytequad >> 16) & 0xff);
        byte b3 = (byte) ((bytequad >> 8) & 0xff);
        byte b4 = (byte) ((bytequad >> 0) & 0xff);

        char c1 = (char) b1;
        char c2 = (char) b2;
        char c3 = (char) b3;
        char c4 = (char) b4;
        //        return new String(new char[] { c1, c2, c3, c4 });
        StringBuffer fStringBuffer = new StringBuffer();
        fStringBuffer.append(new String(new char[]{
                c1, c2, c3, c4
        }));
        fStringBuffer.append(" bytequad: " + bytequad);
        fStringBuffer.append(" b1: " + b1);
        fStringBuffer.append(" b2: " + b2);
        fStringBuffer.append(" b3: " + b3);
        fStringBuffer.append(" b4: " + b4);

        return fStringBuffer.toString();
    }

    public static String getDebug(String message, ICC_Profile value)
    {

        StringBuffer result = new StringBuffer();

        result.append(getDebug("ICC_Profile " + message + ": "
                + ((value == null) ? "null" : value.toString()))
                + newline);
        if (value != null)
        {
            result.append(getDebug("\t getProfileClass: "
                    + byteQuadToString(value.getProfileClass()))
                    + newline);
            result.append(getDebug("\t getPCSType: "
                    + byteQuadToString(value.getPCSType()))
                    + newline);
            result.append(getDebug("\t getColorSpaceType() : "
                    + byteQuadToString(value.getColorSpaceType()))
                    + newline);
        }

        return result.toString();

    }

    public static String getDebug(String message, boolean value)
    {
        return getDebug(message + " " + ((value) ? ("true") : ("false")));
    }

    public static String getDebug(String message, File file)
    {
        return getDebug(message + ": "
                + ((file == null) ? "null" : file.getPath()));
    }

    public static String getDebug(String message, Date value)
    {
        DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        return getDebug(message, (value == null) ? "null" : df.format(value));
    }

    public static String getDebug(String message, Calendar value)
    {
        DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        return getDebug(message, (value == null) ? "null" : df.format(value
                .getTime()));
    }

    public static void debug(String message, Object value)
    {
        if (value == null)
            debug(message, "null");
        else if (value instanceof char[])
            debug(message, (char[]) value);
        else if (value instanceof byte[])
            debug(message, (byte[]) value);
        else if (value instanceof int[])
            debug(message, (int[]) value);
        else if (value instanceof String)
            debug(message, (String) value);
        else if (value instanceof java.util.List)
            debug(message, (java.util.List) value);
        else if (value instanceof Map)
            debug(message, (Map) value);
        //        else if (value instanceof Object)
        //            debug(message, (Object) value);
        else if (value instanceof ICC_Profile)
            debug(message, (ICC_Profile) value);
        else if (value instanceof File)
            debug(message, (File) value);
        else if (value instanceof Date)
            debug(message, (Date) value);
        else if (value instanceof Calendar)
            debug(message, (Calendar) value);
        else
            debug(message, value.toString());
    }

    public static void debug(String message, Object value[])
    {
        if (value == null) {
            debug(message, "null");
        } else {
            debug(message, value.length);
            final int max = 10;
            for (int i = 0; i < value.length && i < max; i++) {
                debug("\t" + i, value[i]);
            }
            if (value.length > max) {
                debug("\t...");
            }
        }
        debug();
    }

    public static String getDebug(String message, Object value)
    {
        if (value == null)
            return getDebug(message, "null");
        else if (value instanceof Calendar)
            return getDebug(message, (Calendar) value);
        else if (value instanceof Date)
            return getDebug(message, (Date) value);
        else if (value instanceof File)
            return getDebug(message, (File) value);
        else if (value instanceof ICC_Profile)
            return getDebug(message, (ICC_Profile) value);
        else if (value instanceof Map)
            return getDebug(message, (Map) value);
        else if (value instanceof Map)
            return getDebug(message, (Map) value); //
        //        else if (value instanceof Object) // getDebug(message, (Object) value);
        else if (value instanceof String)
            return getDebug(message, (String) value);
        else if (value instanceof byte[])
            return getDebug(message, (byte[]) value);
        else if (value instanceof char[])
            return getDebug(message, (char[]) value);
        else if (value instanceof int[])
            return getDebug(message, (int[]) value);
        else if (value instanceof java.util.List)
            return getDebug(message, (java.util.List) value);
        else
            return getDebug(message, value.toString());
    }

    public static String getType(Object value)
    {
        if (value == null)
            return "null";
        else if (value instanceof Object[])
            return "[Object[]: " + ((Object[]) value).length + "]";
        else if (value instanceof char[])
            return "[char[]: " + ((char[]) value).length + "]";
        else if (value instanceof byte[])
            return "[byte[]: " + ((byte[]) value).length + "]";
        else if (value instanceof short[])
            return "[short[]: " + ((short[]) value).length + "]";
        else if (value instanceof int[])
            return "[int[]: " + ((int[]) value).length + "]";
        else if (value instanceof long[])
            return "[long[]: " + ((long[]) value).length + "]";
        else if (value instanceof float[])
            return "[float[]: " + ((float[]) value).length + "]";
        else if (value instanceof double[])
            return "[double[]: " + ((double[]) value).length + "]";
        else if (value instanceof boolean[])
            return "[boolean[]: " + ((boolean[]) value).length + "]";
        else
            return value.getClass().getName();
    }

    public static boolean isArray(Object value)
    {
        if (value == null)
            return false;
        else if (value instanceof Object[])
            return true;
        else if (value instanceof char[])
            return true;
        else if (value instanceof byte[])
            return true;
        else if (value instanceof short[])
            return true;
        else if (value instanceof int[])
            return true;
        else if (value instanceof long[])
            return true;
        else if (value instanceof float[])
            return true;
        else if (value instanceof double[])
            return true;
        else if (value instanceof boolean[])
            return true;
        else
            return false;
    }

    public static String getDebug(String message, Object value[])
    {
        StringBuffer result = new StringBuffer();

        if (value == null) {
            result.append(getDebug(message, "null") + newline);
        } else {
            result.append(getDebug(message, value.length));
            final int max = 10;
            for (int i = 0; i < value.length && i < max; i++) {
                result.append(getDebug("\t" + i, value[i]) + newline);
            }
            if (value.length > max) {
                result.append(getDebug("\t...") + newline);
            }
        }
        result.append(newline);

        return result.toString();
    }

    public static String getDebug(Class fClass, Throwable e)
    {
        return getDebug(fClass == null ? "[Unknown]" : fClass.getName(), e);
    }

    public static void debug(Class fClass, Throwable e)
    {
        debug(fClass.getName(), e);
    }

    public static void debug(String message, boolean value)
    {
        debug(message + " " + ((value) ? ("true") : ("false")));
    }

    public static void debug(String message, byte v[])
    {
        debug(getDebug(message, v));
    }

    public static void debug(String message, char v[])
    {
        debug(getDebug(message, v));
    }

    public static void debug(String message, Calendar value)
    {
        DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        debug(message, (value == null) ? "null" : df.format(value.getTime()));
    }

    public static void debug(String message, Date value)
    {
        DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        debug(message, (value == null) ? "null" : df.format(value));
    }

    public static void debug(String message, double value)
    {
        debug(message + ": " + (value));
    }

    public static void debug(String message, File file)
    {
        debug(message + ": " + ((file == null) ? "null" : file.getPath()));
    }

    //    public static void debug(String message, Object value)
    //    {
    //        debug("Unknown Object " + message + ": "
    //                + ((value == null) ? "null" : value.toString()));
    //    }

    public static void debug(String message, ICC_Profile value)
    {
        debug("ICC_Profile " + message + ": "
                + ((value == null) ? "null" : value.toString()));
        if (value != null)
        {
            debug("\t getProfileClass: "
                    + byteQuadToString(value.getProfileClass()));
            debug("\t getPCSType: " + byteQuadToString(value.getPCSType()));
            debug("\t getColorSpaceType() : "
                    + byteQuadToString(value.getColorSpaceType()));
        }
    }

    public static void debug(String message, int value)
    {
        debug(message + ": " + (value));
    }

    public static void debug(String message, int v[])
    {
        debug(getDebug(message, v));
    }

    public static void debug(String message, byte v[], int max)
    {
        debug(getDebug(message, v, max));
    }

    public static void debug(String message, java.util.List v)
    {
        String suffix = " [" + counter++ + "]";

        debug(message + " (" + v.size() + ")" + suffix);
        for (int i = 0; i < v.size(); i++)
            debug("\t" + v.get(i).toString() + suffix);
        debug();
    }

    public static void debug(String message, long value)
    {
        debug(message + " " + Long.toString(value));
    }

    public static void debug(String prefix, Point p)
    {
        System.out.println(prefix + ": "
                + ((p == null) ? "null" : (p.x + ", " + p.y)));
    }

    public static void debug(String prefix, Rectangle r)
    {
        debug(getDebug(prefix, r));
    }

    public static void debug(String message, String value)
    {
        debug(message + " " + value);
    }

    public static void debug(String message, Throwable e)
    {
        debug(getDebug(message, e));
    }

    public static void debug(Throwable e)
    {
        debug(getDebug(e));
    }

    public static void debug(Throwable e, int value)
    {
        debug(getDebug(e, value));
    }

    public static void dumpStack()
    {
        debug(getStackTrace(new Exception("Stack trace"), -1, 1));
    }

    public static void dumpStack(int limit)
    {
        debug(getStackTrace(new Exception("Stack trace"), limit, 1));
    }

    public static String getDebug(String message, Throwable e)
    {
        return message + newline + getDebug(e);
    }

    public static String getDebug(Throwable e)
    {
        return getDebug(e, -1);
    }

    public static String getDebug(Throwable e, int max)
    {
        StringBuffer result = new StringBuffer();

        final SimpleDateFormat timestamp = new SimpleDateFormat(
                "yyyy-MM-dd kk:mm:ss:SSS");
        String datetime = timestamp.format(new Date()).toLowerCase();

        result.append(newline);
        result.append("Throwable: "
                + ((e == null) ? "" : ("(" + e.getClass().getName() + ")"))
                + ":" + datetime + newline);
        result.append("Throwable: "
                + ((e == null) ? "null" : e.getLocalizedMessage()) + newline);
        result.append(newline);

        result.append(getStackTrace(e, max));

        result.append("Caught here:" + newline);
        result.append(getStackTrace(new Exception(), max, 1));
        //        Debug.dumpStack();
        result.append(newline);
        return result.toString();
    }

    public static String getStackTrace(Throwable e)
    {
        return getStackTrace(e, -1);
    }

    public static String getStackTrace(Throwable e, int limit)
    {
        return getStackTrace(e, limit, 0);
    }

    public static String getStackTrace(Throwable e, int limit, int skip)
    {
        StringBuffer result = new StringBuffer();

        if (e != null)
        {
            StackTraceElement stes[] = e.getStackTrace();
            if (stes != null)
            {
                for (int i = skip; i < stes.length && (limit < 0 || i < limit); i++)
                {
                    StackTraceElement ste = stes[i];

                    result.append("\tat " + ste.getClassName() + "."
                            + ste.getMethodName() + "(" + ste.getFileName()
                            + ":" + ste.getLineNumber() + ")" + newline);
                }
                if (limit >= 0 && stes.length > limit)
                    result.append("\t..." + newline);
            }

            //            e.printStackTrace(System.out);
            result.append(newline);
        }

        return result.toString();
    }

    public static void debugByteQuad(String message, int i)
    {
        int alpha = (i >> 24) & 0xff;
        int red = (i >> 16) & 0xff;
        int green = (i >> 8) & 0xff;
        int blue = (i >> 0) & 0xff;

        System.out.println(message + ": " + "alpha: " + alpha + ", " + "red: "
                + red + ", " + "green: " + green + ", " + "blue: " + blue);
    }

    public static void debugIPQuad(String message, int i)
    {
        int b1 = (i >> 24) & 0xff;
        int b2 = (i >> 16) & 0xff;
        int b3 = (i >> 8) & 0xff;
        int b4 = (i >> 0) & 0xff;

        System.out.println(message + ": " + "b1: " + b1 + ", " + "b2: " + b2
                + ", " + "b3: " + b3 + ", " + "b4: " + b4);
    }

    public static void debugIPQuad(String message, byte bytes[])
    {
        System.out.print(message + ": ");
        if (bytes == null)
            System.out.print("null");
        else
        {
            for (int i = 0; i < bytes.length; i++)
            {
                if (i > 0)
                    System.out.print(".");
                System.out.print(0xff & bytes[i]);
            }
        }
        System.out.println();
    }

    public static String getDebug(String prefix, Dimension r)
    {
        String s_ar1 = "null";
        String s_ar2 = "null";

        if (r != null)
        {
            double aspect_ratio = ((double) r.width) / ((double) r.height);
            double aspect_ratio2 = 1.0 / aspect_ratio;

            s_ar1 = "" + aspect_ratio;
            s_ar2 = "" + aspect_ratio2;

            if (s_ar1.length() > 7)
                s_ar1 = s_ar1.substring(0, 7);
            if (s_ar2.length() > 7)
                s_ar2 = s_ar2.substring(0, 7);
        }

        return (prefix + ": "
                + ((r == null) ? "null" : (r.width + "x" + r.height))
                + " aspect_ratio: " + s_ar1 + " (" + s_ar2 + ")");
    }

    public static void debug(String prefix, Dimension r)
    {
        debug(getDebug(prefix, r));
    }

    public static String getDebug(String prefix, Rectangle r)
    {
        String s_ar1 = "null";
        String s_ar2 = "null";

        if (r != null)
        {
            double aspect_ratio = ((double) r.width) / ((double) r.height);
            double aspect_ratio2 = 1.0 / aspect_ratio;

            s_ar1 = "" + aspect_ratio;
            s_ar2 = "" + aspect_ratio2;

            if (s_ar1.length() > 7)
                s_ar1 = s_ar1.substring(0, 7);
            if (s_ar2.length() > 7)
                s_ar2 = s_ar2.substring(0, 7);
        }

        return (prefix
                + ": "
                + ((r == null) ? "null" : (r.x + "x" + r.y + "," + r.width
                        + "x" + r.height)) + " aspect_ratio: " + s_ar1 + " ("
                + s_ar2 + ")");
    }

    public static String getDebug(String prefix, Point p)
    {
        return (prefix + ": " + ((p == null) ? "null" : (p.x + ", " + p.y)));
    }

    public static void dump(String prefix, Object value)
    {
        if (value == null)
            debug(prefix, "null");
        else if (value instanceof Object[])
        {
            Object[] array = (Object[]) value;
            debug(prefix, array);
            for (int i = 0; i < array.length; i++)
                dump(prefix + "\t" + i + ": ", array[i]);
        }
        else if (value instanceof int[])
        {
            int[] array = (int[]) value;
            debug(prefix, array);
            for (int i = 0; i < array.length; i++)
                debug(prefix + "\t" + i + ": ", array[i]);
        }
        else if (value instanceof char[])
        {
            char[] array = (char[]) value;
            debug(prefix, "[" + new String(array) + "]");
        }
        else if (value instanceof long[])
        {
            long[] array = (long[]) value;
            debug(prefix, array);
            for (int i = 0; i < array.length; i++)
                debug(prefix + "\t" + i + ": ", array[i]);
        }
        else if (value instanceof boolean[])
        {
            boolean[] array = (boolean[]) value;
            debug(prefix, array);
            for (int i = 0; i < array.length; i++)
                debug(prefix + "\t" + i + ": ", array[i]);
        }
        else if (value instanceof byte[])
        {
            byte[] array = (byte[]) value;
            debug(prefix, array);
            for (int i = 0; i < array.length; i++)
                debug(prefix + "\t" + i + ": ", array[i]);
        }
        else if (value instanceof float[])
        {
            float[] array = (float[]) value;
            debug(prefix, array);
            for (int i = 0; i < array.length; i++)
                debug(prefix + "\t" + i + ": ", array[i]);
        }
        else if (value instanceof double[])
        {
            double[] array = (double[]) value;
            debug(prefix, array);
            for (int i = 0; i < array.length; i++)
                debug(prefix + "\t" + i + ": ", array[i]);
        }
        else if (value instanceof java.util.List)
        {
            java.util.List list = (java.util.List) value;
            debug(prefix, "list");
            for (int i = 0; i < list.size(); i++)
                dump(prefix + "\t" + "list: " + i + ": ", list.get(i));
        }
        else if (value instanceof Map)
        {
            java.util.Map map = (java.util.Map) value;
            debug(prefix, "map");
            List keys = new ArrayList(map.keySet());
            Collections.sort(keys);
            for (int i = 0; i < keys.size(); i++)
            {
                Object key = keys.get(i);
                dump(prefix + "\t" + "map: " + key + " -> ", map.get(key));
            }
        }
        //        else if (value instanceof String)
        //            debug(prefix, value);
        else
        {
            debug(prefix, value.toString());
            debug(prefix + "\t", value.getClass().getName());
        }
    }

    public static final void purgeMemory()
    {
//        try
//        {
//            //            Thread.sleep(50);
//            System.runFinalization();
//            Thread.sleep(50);
//            System.gc();
//            Thread.sleep(50);
//        }
//        catch (Throwable e)
//        {
//            Debug.debug(e);
//        }
    }

}
