/**
 * 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.hcatalog.data;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.Map.Entry;


public abstract class DataType {

    public static final byte NULL = 1;
    public static final byte BOOLEAN = 5;
    public static final byte BYTE = 6;
    public static final byte INTEGER = 10;
    public static final byte SHORT = 11;
    public static final byte LONG = 15;
    public static final byte FLOAT = 20;
    public static final byte DOUBLE = 25;
    public static final byte STRING = 55;
    public static final byte BINARY = 60;

    public static final byte MAP = 100;
    public static final byte STRUCT = 110;
    public static final byte LIST = 120;
    public static final byte ERROR = -1;

    /**
     * Determine the datatype of an object.
     * @param o Object to test.
     * @return byte code of the type, or ERROR if we don't know.
     */
    public static byte findType(Object o) {
        if (o == null) {
            return NULL;
        }

        Class<?> clazz = o.getClass();

        // Try to put the most common first
        if (clazz == String.class) {
            return STRING;
        } else if (clazz == Integer.class) {
            return INTEGER;
        } else if (clazz == Long.class) {
            return LONG;
        } else if (clazz == Float.class) {
            return FLOAT;
        } else if (clazz == Double.class) {
            return DOUBLE;
        } else if (clazz == Boolean.class) {
            return BOOLEAN;
        } else if (clazz == Byte.class) {
            return BYTE;
        } else if (clazz == Short.class) {
            return SHORT;
        } else if (o instanceof List<?>) {
            return LIST;
        } else if (o instanceof Map<?, ?>) {
            return MAP;
        } else if (o instanceof byte[]) {
            return BINARY;
        } else {
            return ERROR;
        }
    }

    public static int compare(Object o1, Object o2) {

        return compare(o1, o2, findType(o1), findType(o2));
    }

    public static int compare(Object o1, Object o2, byte dt1, byte dt2) {
        if (dt1 == dt2) {
            switch (dt1) {
            case NULL:
                return 0;

            case BOOLEAN:
                return ((Boolean) o1).compareTo((Boolean) o2);

            case BYTE:
                return ((Byte) o1).compareTo((Byte) o2);

            case INTEGER:
                return ((Integer) o1).compareTo((Integer) o2);

            case LONG:
                return ((Long) o1).compareTo((Long) o2);

            case FLOAT:
                return ((Float) o1).compareTo((Float) o2);

            case DOUBLE:
                return ((Double) o1).compareTo((Double) o2);

            case STRING:
                return ((String) o1).compareTo((String) o2);

            case SHORT:
                return ((Short) o1).compareTo((Short) o2);

            case BINARY:
                return compareByteArray((byte[]) o1, (byte[]) o2);

            case LIST:
                List<?> l1 = (List<?>) o1;
                List<?> l2 = (List<?>) o2;
                int len = l1.size();
                if (len != l2.size()) {
                    return len - l2.size();
                } else {
                    for (int i = 0; i < len; i++) {
                        int cmpVal = compare(l1.get(i), l2.get(i));
                        if (cmpVal != 0) {
                            return cmpVal;
                        }
                    }
                    return 0;
                }

            case MAP: {
                Map<?, ?> m1 = (Map<?, ?>) o1;
                Map<?, ?> m2 = (Map<?, ?>) o2;
                int sz1 = m1.size();
                int sz2 = m2.size();
                if (sz1 < sz2) {
                    return -1;
                } else if (sz1 > sz2) {
                    return 1;
                } else {
                    // This is bad, but we have to sort the keys of the maps in order
                    // to be commutative.
                    TreeMap<Object, Object> tm1 = new TreeMap<Object, Object>(m1);
                    TreeMap<Object, Object> tm2 = new TreeMap<Object, Object>(m2);
                    Iterator<Entry<Object, Object>> i1 = tm1.entrySet().iterator();
                    Iterator<Entry<Object, Object>> i2 = tm2.entrySet().iterator();
                    while (i1.hasNext()) {
                        Map.Entry<Object, Object> entry1 = i1.next();
                        Map.Entry<Object, Object> entry2 = i2.next();
                        int c = compare(entry1.getValue(), entry2.getValue());
                        if (c != 0) {
                            return c;
                        } else {
                            c = compare(entry1.getValue(), entry2.getValue());
                            if (c != 0) {
                                return c;
                            }
                        }
                    }
                    return 0;
                }
            }

            default:
                throw new RuntimeException("Unkown type " + dt1 +
                    " in compare");
            }
        } else {
            return dt1 < dt2 ? -1 : 1;
        }
    }

    private static int compareByteArray(byte[] o1, byte[] o2) {

        for (int i = 0; i < o1.length; i++) {
            if (i == o2.length) {
                return 1;
            }
            if (o1[i] == o2[i]) {
                continue;
            }
            if (o1[i] > o1[i]) {
                return 1;
            } else {
                return -1;
            }
        }

        //bytes in o1 are same as o2
        //in case o2 was longer
        if (o2.length > o1.length) {
            return -1;
        }
        return 0; //equals
    }

}
