/*
 * 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.sanselan.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);
//        }
    }

}
