/*
 * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.internal.helper;

import java.math.BigDecimal;
import java.math.BigInteger;

import java.util.Date;
import java.util.HashSet;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.eclipse.persistence.descriptors.ClassDescriptor;

/**
 * INTERNAL
 * This class is a helper class providing type information.
 * Its implementation uses Java reflection to calculate the type information.
 */
public class BasicTypeHelperImpl {

    /** Set of numeric types and its wrapper classes. */
    private static Set numericTypes = new HashSet();
    /** Set of integral types and its wrapper classes. */
    private static Set integralTypes = new HashSet();
    /** Set of floating point types and its wrapper classes. */
    private static Set floatingPointTypes = new HashSet();
    /** Set of date classes. */
    private static Set dateClasses = new HashSet();
    /** Set of time classes. */
    private static Set timeClasses = new HashSet();
    /** Maps primtives types to their wrapper classes. */
    private static Map<Class, Class> primitiveToWrapper = new HashMap();
    /** Maps wrapper classes to their primitive types. */
    private static Map<Class, Class> wrapperToPrimitive = new HashMap();

    static {
        // Initialize set of integral types plus their wrapper classes
        integralTypes.add(byte.class);
        integralTypes.add(Byte.class);
        integralTypes.add(short.class);
        integralTypes.add(Short.class);
        integralTypes.add(char.class);
        integralTypes.add(Character.class);
        integralTypes.add(int.class);
        integralTypes.add(Integer.class);
        integralTypes.add(long.class);
        integralTypes.add(Long.class);

        // Initialize set of floating point types plus their wrapper classes
        floatingPointTypes.add(float.class);
        floatingPointTypes.add(Float.class);
        floatingPointTypes.add(double.class);
        floatingPointTypes.add(Double.class);

        // Initialize set of floating point types plus their wrapper classes
        dateClasses.add(java.util.Date.class);
        dateClasses.add(java.util.Calendar.class);
        dateClasses.add(java.sql.Date.class);
        dateClasses.add(java.sql.Time.class);
        dateClasses.add(java.sql.Timestamp.class);

        // Initialize set of java.time types
        timeClasses.add(java.time.LocalDate.class);
        timeClasses.add(java.time.LocalTime.class);
        timeClasses.add(java.time.LocalDateTime.class);
        timeClasses.add(java.time.OffsetTime.class);
        timeClasses.add(java.time.OffsetDateTime.class);

        numericTypes.addAll(integralTypes);
        numericTypes.addAll(floatingPointTypes);
        numericTypes.add(java.math.BigDecimal.class);
        numericTypes.add(java.math.BigInteger.class);

        // Initialize mapping primitives to their wrapper classes
        primitiveToWrapper.put(boolean.class, Boolean.class);
        primitiveToWrapper.put(byte.class, Byte.class);
        primitiveToWrapper.put(short.class, Short.class);
        primitiveToWrapper.put(char.class, Character.class);
        primitiveToWrapper.put(int.class, Integer.class);
        primitiveToWrapper.put(long.class, Long.class);
        primitiveToWrapper.put(float.class, Float.class);
        primitiveToWrapper.put(double.class, Double.class);

        // Initialize mapping wrapper classes to their primitives
        wrapperToPrimitive.put(Boolean.class, boolean.class);
        wrapperToPrimitive.put(Byte.class, byte.class);
        wrapperToPrimitive.put(Short.class, short.class);
        wrapperToPrimitive.put(Character.class, char.class);
        wrapperToPrimitive.put(Integer.class, int.class);
        wrapperToPrimitive.put(Long.class, long.class);
        wrapperToPrimitive.put(Float.class, float.class);
        wrapperToPrimitive.put(Double.class, double.class);
    }

    /** A singleton for this class */
    private static final BasicTypeHelperImpl singleton = new BasicTypeHelperImpl();

    /** Gets instance of this class */
    public static BasicTypeHelperImpl getInstance() {
        return singleton;
    }

    /** Returns the name of the specified type. */
    public String getTypeName(Object type) {
        Class clazz = getJavaClass(type);
        return (clazz == null) ? null : clazz.getName();
    }

    /** Returns the class object of the specified type. */
    public Class<?> getJavaClass(Object type) {
        Class clazz = null;
        if (type instanceof Class) {
            clazz = (Class)type;
        } else if (type instanceof ClassDescriptor) {
            clazz = ((ClassDescriptor)type).getJavaClass();
        }
        return clazz;
    }

    /** Returns the Object type representation.*/
    public Object getObjectType() {
        return Object.class;
    }

    /** Returns the boolean type representation.*/
    public Object getBooleanType() {
        return boolean.class;
    }

    /** Returns the Boolean class representation.*/
    public Object getBooleanClassType() {
        return Boolean.class;
    }

    /** Returns the char type representation.*/
    public Object getCharType() {
        return char.class;
    }

    /** Returns the Date type representation.*/
    public Object getSQLDateType() {
        return java.sql.Date.class;
    }

    /** Returns the Time type representation.*/
    public Object getTimeType() {
        return java.sql.Time.class;
    }

    /** Returns the timestamp type representation.*/
    public Object getTimestampType() {
        return java.sql.Timestamp.class;
    }

    /** Returns the Character class representation.*/
    public Object getCharacterClassType() {
        return Character.class;
    }

    /** Returns the byte type representation.*/
    public Object getByteType() {
        return byte.class;
    }

    /** Returns the Byte class representation.*/
    public Object getByteClassType() {
        return Byte.class;
    }

    /** Returns the short type representation.*/
    public Object getShortType() {
        return short.class;
    }

    /** Returns the Short class representation.*/
    public Object getShortClassType() {
        return Short.class;
    }

    /** Returns the int type representation.*/
    public Object getIntType() {
        return int.class;
    }

    /** Returns the Inter class representation.*/
    public Object getIntegerClassType() {
        return Integer.class;
    }

    /** Returns the long type representation.*/
    public Object getLongType() {
        return long.class;
    }

    /** Returns the type representation of class Long.*/
    public Object getLongClassType()  {
        return Long.class;
    }

    /** Returns the type representation of class Map.Entry.*/
    public Object getMapEntryType(){
        return Map.Entry.class;
    }

    /** Returns the float type representation.*/
    public Object getFloatType() {
        return float.class;
    }

    /** Returns the type representation of class Float.*/
    public Object getFloatClassType()  {
        return Float.class;
    }

    /** Returns the double type representation.*/
    public Object getDoubleType() {
        return double.class;
    }

    /** Returns the type representation of class Double.*/
    public Object getDoubleClassType()  {
        return Double.class;
    }

    /** Returns the String type representation.*/
    public Object getStringType() {
        return String.class;
    }

    /** Returns the BigInteger type representation.*/
    public Object getBigIntegerType() {
        return BigInteger.class;
    }

    /** Returns the BigDecimal type representation.*/
    public Object getBigDecimalType() {
        return BigDecimal.class;
    }

    /** Returns the java.util.Date type representation.*/
    public Object getDateType() {
        return Date.class;
    }

    /** */
    public boolean isEnumType(Object type) {
        Class clazz = getJavaClass(type);
        return (clazz != null) && (clazz.isEnum());
    }

    /**
     * Returns true if the class is any numeric type.
     */
    public boolean isNumericType(Object type) {
        return numericTypes.contains(type);
    }

    /**
     * Returns true if the specified type represents an
     * integral type or a wrapper class of an integral type.
     */
    public boolean isIntegralType(Object type) {
        return integralTypes.contains(type);
    }

    /**
     * Returns true if the specified type represents an
     * floating point type or a wrapper class of an floating point type.
     */
    public boolean isFloatingPointType(Object type) {
        return floatingPointTypes.contains(type);
    }

    /** Returns true if the specified type is a wrapper class. */
    public boolean isWrapperClass(Object type) {
        return wrapperToPrimitive.containsKey(type);
    }

    /**
     * Returns true if type is the boolean primitive type or the Boolean wrapper class
     */
    public boolean isBooleanType(Object type) {
        return (type == getBooleanType()) || (type == getBooleanClassType());
    }

    /**
     * Returns true if type is the char primitive type or the Character wrapper class
     */
    public boolean isCharacterType(Object type) {
        return (type == getCharType()) || (type == getCharacterClassType());
    }

    /**
     * Returns true if type is the byte primitive type or the Byte wrapper class
     */
    public boolean isByteType(Object type) {
        return (type == getByteType()) || (type == getByteClassType());
    }

    /**
     * Returns true if type is the short primitive type or the Short wrapper class
     */
    public boolean isShortType(Object type) {
        return (type == getShortType()) || (type == getShortClassType());
    }

    /**
     * Returns true if type is the int primitive type or the Integer wrapper class
     */
    public boolean isIntType(Object type) {
        return (type == getIntType()) || (type == getIntegerClassType());
    }

    /**
     * Returns true if type is the int primitive type or the Integer wrapper class
     */
    public boolean isIntegerType(Object type) {
        return isIntType(type);
    }

    /**
     * Returns true if type is the long primitive type or the Long wrapper class
     */
    public boolean isLongType(Object type) {
        return (type == getLongType()) || (type == getLongClassType());
    }

    /**
     * Returns true if type is the float primitive type or the Float wrapper class
     */
    public boolean isFloatType(Object type) {
        return (type == getFloatType()) || (type == getFloatClassType());
    }

    /**
     * Returns true if type is the double primitive type or the Double wrapper class
     */
    public boolean isDoubleType(Object type) {
        return (type == getDoubleType()) || (type == getDoubleClassType());
    }

    /** Returns true if the specified type represents java.lang.String. */
    public boolean isStringType(Object type) {
        return type == getStringType();
    }

    /** */
    public boolean isDateClass(Object type) {
        return dateClasses.contains(type);
    }

    /** */
    public boolean isBigIntegerType(Object type) {
        return type == getBigIntegerType();
    }

    /** */
    public boolean isBigDecimalType(Object type) {
        return type == getBigDecimalType();
    }

    /** Returns true if the specified type denotes an orderable type */
    public boolean isOrderableType(Object type) {
        return true;
    }

    /**
     * convenience method for java's isAssignableFrom that allows auto-boxing, taking java class or a descriptor as arguments.
     *  It will return true if both sides are in the same category (Numberic, Date or Boolean) otherwise it will use java's
     *  isAssignableFrom on the argument classes.    Returns true if either arguments is null.
     */
    public boolean isAssignableFrom(Object left, Object right) {
        if ((left == null) || (right == null)) {
            return true;
        }
        // check for identical types
        if (left == right) {
            return true;
        }
        if ((left == ClassConstants.OBJECT) || (right == ClassConstants.OBJECT)) {
            return true;
        }
        // numeric types are compatible
        else if (isNumericType(left) && isNumericType(right))  {
            return true;
        }
        // date types are compatible
        else if (isDateClass(left) && isDateClass(right))  {
            return true;
        }
        // handle boolean and Boolean
        else if (isBooleanType(left) && isBooleanType(right)) {
            return true;
        }
        // check for inheritance and implements
        return getJavaClass(left).isAssignableFrom(getJavaClass(right));
    }

    /**
     * convenience method for java's isAssignableFrom that allows auto-boxing but follows more closely Java's
     * Class.isAssignableFrom method results, and returns true if either arguments is null.
     */
    public boolean isStrictlyAssignableFrom(Object left, Object right) {
        if ((left == null) || (right == null)) {
            return true;
        }
        // check for identical types
        if (left == right) {
            return true;
        }
        if (left == ClassConstants.OBJECT) {
            return true;
        }

        Class leftClass = getJavaClass(left);
        Class rightClass = getJavaClass(right);
        if ( leftClass.isPrimitive() ){
            leftClass = this.getWrapperClass(leftClass);
        }
        if ( rightClass.isPrimitive() ){
            rightClass = this.getWrapperClass(rightClass);
        }

        // check for inheritance and implements
        return leftClass.isAssignableFrom(rightClass);
    }

    /** Implements binary numeric promotion as defined in JLS extended by
     * wrapper classes, BigDecimal and BigInteger.  */
    public Object extendedBinaryNumericPromotion(Object left, Object right) {
        if ((left == null) || (right == null) ||
            !isNumericType(left) || !isNumericType(right)) {
            return null;
        }

        // handle BigDecimal
        if (isBigDecimalType(left) || isBigDecimalType(right)) {
            return getBigDecimalType();
        }

        // handle BigInteger
        if (isBigIntegerType(left)) {
            return isFloatingPointType(right) ? right : getBigIntegerType();
        }
        if (isBigIntegerType(right)) {
            return isFloatingPointType(left) ? left : getBigIntegerType();
        }

        // check wrapper classes
        boolean wrapper = false;
        if (isWrapperClass(left)) {
            wrapper = true;
            left = getPrimitiveType(left);
        }
        if (isWrapperClass(right)) {
            wrapper = true;
            right = getPrimitiveType(right);
        }

        Object promoted = binaryNumericPromotion(left, right);
        if (wrapper && promoted != null) {
            promoted = getWrapperClass(promoted);
        }
        return promoted;
    }

    // Helper methods

    /** Returns the primitive for the specified wrapper class. */
    protected Class getPrimitiveType(Object wrapper) {
        return wrapperToPrimitive.get(wrapper);
    }

    /** Returns the wrapper class for the specified primitive. */
    protected Class getWrapperClass(Object primitive) {
        return primitiveToWrapper.get(primitive);
    }

    /** Implements binary numeric promotion as defined in JLS. */
    protected Object binaryNumericPromotion(Object left, Object right) {
        if ((left == null) || (right == null)) {
            return null;
        }
        Object type = null;

        if (left == getDoubleType() || right == getDoubleType()) {
            type = getDoubleType();
        } else if (left == getFloatType() || right == getFloatType()) {
            type = getFloatType();
        } else if (left == getLongType() || right == getLongType()) {
            type = getLongType();
        } else if (isIntegralType(left) && isIntegralType(right)) {
            type = getIntType();
        }
        return type;
    }
}

