/*
 * Copyright (c) 1998, 2020 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:
//     Mike Norman - from Proof-of-concept, become production code
//     quwang - Aug 9, 2006
package dbws.testing.shadowddlgeneration.oldjpub;

//javase imports
import java.util.Map;

//EclipseLink imports
import dbws.testing.shadowddlgeneration.oldjpub.Util;

/**
 * NB - this class does <b>NOT</b> implement the {@link java.util.Map} API
 */

public class Typemap {

    public static final int UNSUPPORTED_TYPE = 0;
    public static final int BYTE_ARRAY = UNSUPPORTED_TYPE + 1;
    public static final int DOUBLE = BYTE_ARRAY + 1;
    public static final int FLOAT = DOUBLE + 1;
    public static final int INT = FLOAT + 1;
    public static final int SHORT = INT + 1;
    public static final int BOOLEAN = SHORT + 1;
    public static final int OS_BFILE = BOOLEAN + 1;
    public static final int OS_BLOB = OS_BFILE + 1;
    public static final int OS_CHAR = OS_BLOB + 1;
    public static final int OS_CLOB = OS_CHAR + 1;
    public static final int OS_DATE = OS_CLOB + 1;
    public static final int OS_NUMBER = OS_DATE + 1;
    public static final int OS_RAW = OS_NUMBER + 1;
    public static final int OS_ROWID = OS_RAW + 1;
    public static final int OS_NCHAR = OS_ROWID + 1;
    public static final int OS_NCLOB = OS_NCHAR + 1;
    public static final int OS_BINARY_FLOAT = OS_NCLOB + 1;
    public static final int OS_BINARY_DOUBLE = OS_BINARY_FLOAT + 1;
    public static final int OS_TIMESTAMP = OS_BINARY_DOUBLE + 1;
    public static final int OS_TIMESTAMPTZ = OS_TIMESTAMP + 1;
    public static final int OS_TIMESTAMPLTZ = OS_TIMESTAMPTZ + 1;
    public static final int OS_CUSTOMDATUM = OS_TIMESTAMPLTZ + 1;
    public static final int OS_NSTRING = OS_CUSTOMDATUM + 1;
    public static final int JL_DOUBLE = OS_NSTRING + 1;
    public static final int JL_FLOAT = JL_DOUBLE + 1;
    public static final int JL_INTEGER = JL_FLOAT + 1;
    public static final int JL_SHORT = JL_INTEGER + 1;
    public static final int JL_STRING = JL_SHORT + 1;
    public static final int JM_BIGDECIMAL = JL_STRING + 1;
    public static final int JS_ARRAY = JM_BIGDECIMAL + 1;
    public static final int JS_BLOB = JS_ARRAY + 1;
    public static final int JS_CLOB = JS_BLOB + 1;
    public static final int JS_REF = JS_CLOB + 1;
    public static final int JS_RESULTSET = JS_REF + 1;
    public static final int JS_SQLDATA = JS_RESULTSET + 1;
    public static final int JS_DATE = JS_SQLDATA + 1;
    public static final int JS_TIMESTAMP = JS_DATE + 1;
    public static final int OCI_BFILELOCATOR = JS_TIMESTAMP + 1;
    public static final int OCI_BLOBLOCATOR = OCI_BFILELOCATOR + 1;
    public static final int OCI_CLOBLOCATOR = OCI_BLOBLOCATOR + 1;
    public static final int OCI_DATE = OCI_CLOBLOCATOR + 1;
    public static final int OCI_DATETIME = OCI_DATE + 1;
    public static final int OCI_INTERVAL = OCI_DATETIME + 1;
    public static final int OCI_NUMBER = OCI_INTERVAL + 1;
    public static final int OCI_RAW = OCI_NUMBER + 1;
    public static final int OCI_STRING = OCI_RAW + 1;
    public static final int C_GENERATEDTYPE = OCI_STRING + 1;
    public static final int OCI_TABLE = C_GENERATEDTYPE + 1;
    public static final int OCCI_BFILE = OCI_TABLE + 1;
    public static final int OCCI_BYTES = OCCI_BFILE + 1;
    public static final int OCCI_BLOB = OCCI_BYTES + 1;
    public static final int OCCI_CLOB = OCCI_BLOB + 1;
    public static final int OCCI_DATE = OCCI_CLOB + 1;
    public static final int OCCI_TIMESTAMP = OCCI_DATE + 1;
    public static final int OCCI_INTERVALYM = OCCI_TIMESTAMP + 1;
    public static final int OCCI_INTERVALDS = OCCI_INTERVALYM + 1;
    public static final int OCCI_NUMBER = OCCI_INTERVALDS + 1;
    public static final int CPP_STRING = OCCI_NUMBER + 1;
    public static final int CPP_WSTRING = CPP_STRING + 1;
    public static final int OCCI_COLLECTION = CPP_WSTRING + 1;
    public static final int OCCI_REF = OCCI_COLLECTION + 1;
    public static final int OCCI_OBJ = OCCI_REF + 1;
    public static final int OCCI_COLLECTION_OF_REFS = OCCI_OBJ + 1;
    private static final int ORACLE_TYPES_BINARY_DOUBLE = 101;
    private static final int ORACLE_TYPES_BINARY_FLOAT = 100;
    private static final int ORACLE_TYPES_JAVA_STRUCT = 2008;
    private static final int ORACLE_TYPES_OPAQUE = 2007;
    private static final int ORACLE_TYPES_TIMESTAMPLTZ = -102;
    private static final int ORACLE_TYPES_TIMESTAMPTZ = -101;

    static final String[] NAMES = {"<unsupported type>",
        "byte[]", "double", "float", "int", "short", "boolean",
        "oracle.sql.BFILE", "oracle.sql.BLOB", "oracle.sql.CHAR", "oracle.sql.CLOB", "oracle.sql.DATE",
        "oracle.sql.NUMBER", "oracle.sql.RAW", "oracle.sql.ROWID",
        "oracle.sql.NCHAR", "oracle.sql.NCLOB",
        "oracle.sql.BINARY_FLOAT", "oracle.sql.BINARY_DOUBLE",
        "oracle.sql.TIMESTAMP", "oracle.sql.TIMESTAMPTZ", "oracle.sql.TIMESTAMPLTZ",
        null, "java.lang.String",
        "Double", "Float", "Integer", "Short", "String",
        "java.math.BigDecimal",
        "java.sql.Array", "java.sql.Blob", "java.sql.Clob", "java.sql.Ref", "java.sql.ResultSet",
        null, "java.sql.Date", "java.sql.Timestamp",
        "OCIBFileLocator *", "OCIBlobLocator *", "OCIClobLocator *", "OCIDate",
        "OCIDateTime *", "OCIInterval *",
        "OCINumber", "OCIRaw *", "OCIString *", null, null,
        "oracle::occi::Bfile", "oracle::occi::Bytes", "oracle::occi::Blob", "oracle::occi::Clob",
        "oracle::occi::Date", "oracle::occi::Timestamp", "oracle::occi::IntervalYM",
        "oracle::occi::IntervalDS", "oracle::occi::Number", "OCCI_STD_NAMESPACE::string",
        "OCCI_STD_NAMESPACE::wstring", null, null, null, null
    };
    static final String[] ACCESSOR_METHODS = {null, // "<unsupported type>",
        "Bytes", "Double", "Float", "Int", "Short", "Boolean",
        "BFILE", "BLOB", "CHAR", "CLOB", "DATE", "NUMBER", "RAW", "ROWID",
        "NCHAR", "NCLOB",
        "Object", "Object",
        "TIMESTAMP", "TIMESTAMPTZ", "TIMESTAMPLTZ",
        null, "String",
        "Double", "Float", "Int", "Short", "String",
        "BigDecimal",
        "Array", "Blob", "Clob", "Ref", "Cursor", null, "Date", "Timestamp",
        null, // "nullOCIBFileLocator *",
        null, // "OCIBlobLocator *",
        null, // "OCIClobLocator *",
        null, // "OCIDate",
        null, // "OCIDateTime *",
        null, // "OCIInterval *",
        null, // "OCINumber",
        null, // "OCIRaw *",
        null, // "OCIString *",
        null, null,
        null, // "oracle::occi::Bfile",
        null, // "oracle::occi::Bytes",
        null, // "oracle::occi::Blob",
        null, // "oracle::occi::Clob",
        null, // "oracle::occi::Date",
        null, // "oracle::occi::Timestamp",
        null, // "oracle::occi::IntervalYM",
        null, // "oracle::occi::IntervalDS",
        null, // "oracle::occi::Number",
        null, // "OCCI_STD_NAMESPACE::string",
        null, // "OCCI_STD_NAMESPACE::wstring",
        null, null, null, null
    };

    protected String m_package;
    protected Map<String, String> m_field_map = null;
    protected int m_mapping;
    protected int arrayMap;
    protected int bfileMap;
    protected int binaryMap;
    protected int blobMap;
    protected int charMap;
    protected int ncharMap;
    protected int clobMap;
    protected int cursorMap;
    protected int dateMap;
    protected int timeMap;
    protected int timestampMap;
    protected int intervalYMMap;
    protected int intervalDSMap;
    protected int decimalMap;
    protected int doubleMap;
    protected int floatMap;
    protected int integerMap;
    protected int longVarBinaryMap;
    protected int numericMap;
    protected int realMap;
    protected int refMap;
    protected int rowidMap;
    protected int smallintMap;
    protected int structMap;
    protected int varcharMap;
    protected int tableMap;
    protected int binaryFloatMap;
    protected int binaryDoubleMap;
    protected SqlReflector m_reflector;

    public Typemap(TypeClass s, SqlReflector reflector) {
        if (s != null && (s instanceof JavaType)) {
            m_field_map = null;
            m_package = s.getNameObject().getDeclPackage();
        }
        else if (s != null) {
            SqlName sn = ((SqlType)s).getSqlName();
            m_field_map = ((SqlType)s).getAttributes();
            m_package = sn.getDeclPackage();
        }
        m_reflector = reflector;
        mapInit();
    }

    void mapInit() {
        bfileMap = OS_BFILE;
        cursorMap = JS_RESULTSET;
        rowidMap = OS_ROWID;
    }

    /**
     * Determine the programming language name for a given SQL field.
     */
    public String getMemberName(String sqlName, boolean wordBoundary, boolean onlyIfRegistered,
        Name name) {
        return null;
    }

    public String getMemberNameAsSuffix(String sqlName) {
        return null;
    }

    public String getMemberName(String sqlName, Name name) {
        return getMemberName(sqlName, false, false, name);
    }

    public String getMemberName(String sqlName) {
        return getMemberName(sqlName, false, false, null);
    }

    public String getMemberName(String sqlName, boolean wordBoundary, boolean onlyIfRegistered) {
        return getMemberName(sqlName, wordBoundary, onlyIfRegistered, null);
    }

    /**
     * Determine the programming language type for a given SQL type.
     */
    public String writeTypeName(TypeClass type) {
        return null;
    }

    public String writeTypeName(TypeClass type, boolean itfIfPossible) {
        return null;
    }

    /**
     */
    public int getMapping() {
        return m_mapping;
    }

    public int getJavaTypecode(int sqlTypecode) {
        if (!m_mapInitialized) {
            javaMapping();
            m_mapInitialized = true;
        };

        switch (sqlTypecode) {
            case OracleTypes.ARRAY:
                return arrayMap;
            case OracleTypes.BFILE:
                return bfileMap;
            case OracleTypes.BINARY:
                return binaryMap;
            case OracleTypes.BLOB:
                return blobMap;
            case OracleTypes.CHAR:
                return charMap;
            case OracleTypes.CLOB:
                return clobMap;
            case OracleTypes.CURSOR:
                return cursorMap;
            case OracleTypes.DATE:
                return dateMap;
            case OracleTypes.TIME:
                return timeMap;
            case OracleTypes.TIMESTAMP:
                return timestampMap;
            case ORACLE_TYPES_TIMESTAMPTZ:
                return (timestampMap == JS_TIMESTAMP) ? timestampMap : OS_TIMESTAMPTZ;
            case ORACLE_TYPES_TIMESTAMPLTZ:
                return OS_TIMESTAMPLTZ;
            case OracleTypes.INTERVALYM:
                return intervalYMMap;
            case OracleTypes.INTERVALDS:
                return intervalDSMap;
            case OracleTypes.DECIMAL:
                return decimalMap;
            case OracleTypes.DOUBLE:
                return doubleMap;
            case OracleTypes.FLOAT:
                return floatMap;
            case OracleTypes.INTEGER:
                return integerMap;
            case OracleTypes.LONGVARBINARY:
                return longVarBinaryMap;
            case OracleTypes.NUMERIC:
                return numericMap;
            case ORACLE_TYPES_OPAQUE:
                return OS_CUSTOMDATUM;
            case ORACLE_TYPES_JAVA_STRUCT:
                return structMap;
            case OracleTypes.REAL:
                return realMap;
            case OracleTypes.REF:
                return refMap;
            case OracleTypes.ROWID:
                return rowidMap;
            case OracleTypes.SMALLINT:
                return smallintMap;
            case OracleTypes.STRUCT:
                return structMap;
            case OracleTypes.VARCHAR:
                return varcharMap;
            case OracleTypes.TABLE:
                return tableMap;
            case SqlType.ORACLE_TYPES_NCHAR:
                return ncharMap;
            case SqlType.ORACLE_TYPES_NCLOB:
                return OS_NCLOB;
            case SqlType.ORACLE_TYPES_BOOLEAN:
                return BOOLEAN;
            case OracleTypes.PLSQL_INDEX_TABLE:
                return tableMap;
            case OracleTypes.PLSQL_NESTED_TABLE:
                return tableMap;
            case OracleTypes.PLSQL_VARRAY_TABLE:
                return tableMap;
            case ORACLE_TYPES_BINARY_FLOAT:
                return binaryFloatMap;
            case ORACLE_TYPES_BINARY_DOUBLE:
                return binaryDoubleMap;
            default:
                return UNSUPPORTED_TYPE;
        }
    }

    protected boolean m_mapInitialized = false;

    protected String writePredefinedName(int typecode) {
        return NAMES[getJavaTypecode(typecode)];
    }

    protected void javaMapping() {
        bfileMap = OS_BFILE;
        cursorMap = JS_RESULTSET;
        rowidMap = OS_ROWID;
    }

    public SqlType getPlsqlTableType(SqlType elemType) {
        int typecode = getJavaTypecode(elemType.getTypecode());
        switch (typecode) {
            case DOUBLE:
                return SqlReflector.plsqlTableDouble;
            case FLOAT:
                return SqlReflector.plsqlTableFloat;
            case INT:
                return SqlReflector.plsqlTableInt;
            case SHORT:
                return SqlReflector.plsqlTableShort;
            case JL_DOUBLE:
                return SqlReflector.plsqlTableJldouble;
            case JL_FLOAT:
                return SqlReflector.plsqlTableJlfloat;
            case JL_INTEGER:
                return SqlReflector.plsqlTableJlinteger;
            case JL_SHORT:
                return SqlReflector.plsqlTableJlshort;
            case JM_BIGDECIMAL:
                return SqlReflector.plsqlTableJmbigdecimal;
            case JL_STRING:
                return SqlReflector.plsqlTableString;
            default:
                return null;
        }
    }

    // Comparable to oracle.sqlj.codegen.engine.CGUnparser#accessorMethod
    public String accessorMethod(TypeClass type) {
        if ("boolean".equals(writeTypeName(type)) || "Boolean".equals(writeTypeName(type))
            || "java.lang.Boolean".equals(writeTypeName(type))) {
            return "Boolean";
        }
        else if (type instanceof PlsqlIndexTableType) {
            return "PlsqlIndexTable";
        }
        int typecode = getJavaTypecode(type.getTypecode());
        String acc = null;
        if (typecode != UNSUPPORTED_TYPE) {
            acc = ACCESSOR_METHODS[typecode];
        }
        if (acc != null) {
            return acc;
        }
        String className = writeTypeName(type);
        if (className != null) {
            if (Util.isWrappedType(className)) {
                className = Util.getWrappedType(className);
            }
            if (className.equals("String")) {
                return "String";
            }
            else if (className.equals("byte")) {
                return "Byte";
            }
            else if (className.equals("char")) {
                return "Byte";
            }
            else if (className.equals("float")) {
                return "Float";
            }
            else if (className.equals("int")) {
                return "Int";
            }
            else if (className.equals("boolean")) {
                return "Boolean";
            }
            else if (className.equals("long")) {
                return "Long";
            }
            else if (className.equals("short")) {
                return "Short";
            }
            else if (className.equals("double")) {
                return "Double";
            }
        }
        if (m_reflector.isUserType(type) && m_mapping == 0) {
            return "CustomDatum";
        }
        else if (isOpaque(type)) {
            return "ORAData";
        }
        return "Object";
    }

    private boolean isOpaque(TypeClass type) {
        boolean opaque = false;
        if (type instanceof SqlType) {
            SqlType sqlType = (SqlType)type;
            String name = sqlType.getSqlName().getFullTargetTypeName(Util.SCHEMA_ALWAYS);
            if ("SYS.XMLTYPE".equalsIgnoreCase(name)) {
                opaque = true;
            }
        }
        return opaque;
    }

}
