/*
 * 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:
//     Mike Norman - from Proof-of-concept, become production code
package dbws.testing.shadowddlgeneration.oldjpub;

//javase imports
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class Util {

    public static final int CASE_SAME = 1;
    public static final int CASE_UPPER = 2;
    public static final int CASE_LOWER = 3;
    public static final int CASE_MIXED = 4;
    public static final int CASE_OPPOSITE = 5;

    public static final String ALL_OBJECTS = "ALL_OBJECTS";
    public static final String ALL_ARGUMENTS = "ALL_ARGUMENTS";
    public static final String USER_ARGUMENTS = "USER_ARGUMENTS";

    public static final String ALL_TYPES = "ALL_TYPES";
    public static final String ALL_TYPE_ATTRS = "ALL_TYPE_ATTRS";
    public static final String ALL_COLL_TYPES = "ALL_COLL_TYPES";

    public static final int SCHEMA_ALWAYS = 1;
    public static final int SCHEMA_IF_NEEDED = 2;
    public static final int SCHEMA_FROM_INTYPE = 3;
    public static final int SCHEMA_OMIT = 4;

    public static final String DUAL = "DUAL";
    public static final String PACKAGE_NAME = "PACKAGE_NAME";
    public static final String OBJECT_NAME = "OBJECT_NAME";
    public static final String ARGUMENT_NAME = "ARGUMENT_NAME";
    public static final String DATA_LEVEL = "DATA_LEVEL";
    public static final String POSITION = "POSITION";
    public static final String SEQUENCE = "SEQUENCE";
    public static final String OWNER = "OWNER";
    public static final String OVERLOAD = "OVERLOAD";
    public static final String NOT_NULL = "NOT NULL";
    public static final String IS_NULL = "IS NULL";

    public static final int METHODS_NONE = 1;
    public static final int METHODS_NAMED = 2;
    public static final int METHODS_ALL = 4;
    public static final int METHODS_ALWAYS = 8;
    public static final int METHODS_OVERLOAD = 16;
    public static final int METHODS_UNIQUE = 32;
    public static final int METHODS_RETRY = 64;
    public static final int METHODS_PARAM_INTERFACE = 128;

    public static final int JDBC_USERTYPES = 16;
    public static final int USERTYPES_MASK = JDBC_USERTYPES;

    public static final String TOPLEVEL = "TOPLEVEL";
    public static final int IS_OBJECT = 1;
    public static final int IS_COLLECTION = 2;
    public static final int IS_TYPE = 3;
    public static final int IS_PACKAGE = 4;
    public static final int IS_TYPE_OR_PACKAGE = IS_TYPE | IS_PACKAGE;
    private static final int IS_TOPLEVEL_FUNCTION_ONLY = 8;
    public static final int IS_TOPLEVEL = IS_TOPLEVEL_FUNCTION_ONLY | IS_PACKAGE;
    private static final int IS_SQLSTATEMENT_ONLY = 16;
    public static final int IS_SQLSTATEMENTS = IS_TYPE | IS_TOPLEVEL_FUNCTION_ONLY
        | IS_SQLSTATEMENT_ONLY;

    public static final String TYPE_NAME = "TYPE_NAME";
    public static final String ATTR_NAME = "ATTR_NAME";
    public static final String ATTR_TYPE_NAME = "ATTR_TYPE_NAME";
    public static final String ELEM_TYPE_NAME = "ELEM_TYPE_NAME";

    public static final String ALL_TYPE_METHODS = "ALL_TYPE_METHODS";
    public static final String ALL_METHOD_RESULTS = "ALL_METHOD_RESULTS";
    public static final String ALL_METHOD_PARAMS = "ALL_METHOD_PARAMS";
    public static final String ALL_QUEUE_TABLES = "ALL_QUEUE_TABLES";
    public static final String ALL_SYNONYMS = "ALL_SYNONYMS";
    public static final String ALL_TAB_PRIVS = "ALL_TAB_PRIVS";
    public static final String TABLE_OWNER = "TABLE_OWNER";
    public static final String TABLE_NAME = "TABLE_NAME";
    public static final String TABLE_SCHEMA = "TABLE_SCHEMA";
    public static final String PRIVILEGE = "PRIVILEGE";
    public static final String GRANTEE = "GRANTEE";
    public static final String SYNONYM_NAME = "SYNONYM_NAME";
    public static final String SUPERTYPE_NAME = "SUPERTYPE_NAME";
    public static final int MAX_IDENTIFIER_LENGTH = 29;
    public static final String DEFAULT_VARCHAR_LEN = "4000";
    public static final String DEFAULT_RAW_LEN = "1000";
    public static final String DEFAULT_LONG_LEN = "32767";

    private static Map<String, String> m_defaultTypeLen = new HashMap<String, String>();
    static {
        m_defaultTypeLen.put("VARCHAR", DEFAULT_VARCHAR_LEN);
        m_defaultTypeLen.put("VARCHAR2", DEFAULT_VARCHAR_LEN);
        m_defaultTypeLen.put("NVARCHAR2", DEFAULT_VARCHAR_LEN);
        m_defaultTypeLen.put("RAW", DEFAULT_RAW_LEN);
        m_defaultTypeLen.put("LONG", DEFAULT_LONG_LEN);
        m_defaultTypeLen.put("LONG_CHAR", DEFAULT_LONG_LEN);
        m_defaultTypeLen.put("LONG_RAW", DEFAULT_LONG_LEN);
    }

    public static String getDefaultTypeLen(String type) {
        return m_defaultTypeLen.get(type.toUpperCase().replace(' ', '_'));
    }

    public static String printTypeWithLength(String type, int length, int precision, int scale) {
        if (type == null) {
            return "<unsupported type>";
        }
        if (type.equalsIgnoreCase("NCHAR")) {
            type = "CHAR";
        }
        if (type.equalsIgnoreCase("NVARCHAR2")) {
            type = "VARCHAR2";
        }
        if (type.equalsIgnoreCase("NCLOB")) {
            type = "CLOB";
        }

        if (length != 0) {
            if (type.equals("NUMBER")) {
                if (precision != 0 && scale != 0) {
                    return type + "(" + precision + ", " + scale + ")";
                }
                else if (precision != 0) {
                    return type + "(" + precision + ")";
                }
            }
            else if (type.equals("FLOAT")) {
                if (precision != 0) {
                    return type + "(" + precision + ")";
                }
            }
            else if (type.equals("NCHAR") || type.equals("NVARCHAR2")) {
                return type + "(" + (length / 2) + ")";
            }
            else {
                return type + "(" + length + ")";
            }
        }
        if (getDefaultTypeLen(type) == null) {
            return type;
        }
        else {
            return type + "(" + getDefaultTypeLen(type) + ")";
        }
    }

    public static String getWrappedType(String s) {
        if (m_wrappedTypes == null) {
            initWrappedTypes();
        }
        return (String)m_wrappedTypes.get(s);
    }

    public static String getWrappedType(Class<?> c) {
        if (m_wrappedTypes == null) {
            initWrappedTypes();
        }
        return (String)m_wrappedTypes.get(c);
    }

    public static boolean isWrappedType(String s) {
        if (m_wrappedTypes == null) {
            initWrappedTypes();
        }
        return m_wrappedTypes.get(s) != null;
    }

    private static void initWrappedTypes() {
        m_wrappedTypes = new HashMap<Object, Object>();
        m_wrappedTypes.put("java.lang.Boolean", "boolean");
        m_wrappedTypes.put("Boolean", "boolean");
        m_wrappedTypes.put(Boolean.class, "boolean");
        m_wrappedTypes.put("java.lang.Byte", "byte");
        m_wrappedTypes.put("Byte", "byte");
        m_wrappedTypes.put(Byte.class, "byte");
        m_wrappedTypes.put("java.lang.Short", "short");
        m_wrappedTypes.put("Short", "short");
        m_wrappedTypes.put(Short.class, "short");
        m_wrappedTypes.put("java.lang.Integer", "int");
        m_wrappedTypes.put("Integer", "int");
        m_wrappedTypes.put(Integer.class, "int");
        m_wrappedTypes.put("java.lang.Long", "long");
        m_wrappedTypes.put("Long", "long");
        m_wrappedTypes.put(Long.class, "long");
        m_wrappedTypes.put("java.lang.Character", "char");
        m_wrappedTypes.put("Character", "char");
        m_wrappedTypes.put(Character.class, "char");
        m_wrappedTypes.put("java.lang.Float", "float");
        m_wrappedTypes.put("Float", "float");
        m_wrappedTypes.put(Float.class, "float");
        m_wrappedTypes.put("java.lang.Double", "double");
        m_wrappedTypes.put("Double", "double");
        m_wrappedTypes.put(Double.class, "double");
    }
    private static Map<Object, Object> m_wrappedTypes = null;

    /*
     * Common utilities
     */
    private static Map<String, String> uniqueResultTypeNames = new HashMap<String, String>();
    public static String uniqueResultTypeName(String methodName, String suffix) {
        String resultTypeName = methodName + suffix;
        int count = 0;
        while (uniqueResultTypeNames.containsKey(resultTypeName)) {
            resultTypeName = methodName + (count++) + suffix;
        }
        uniqueResultTypeNames.put(resultTypeName, resultTypeName);
        return resultTypeName;
    }

    public static String quote(String text) {
        return "\"" + escapeQuote(text) + "\"";
    }

    public static String escapeQuote(String text) {
        if (text == null) {
            return text;
        }
        String textQuoted = "";
        if (text.startsWith("\"")) {
            textQuoted += "\\\"";
        }
        StringTokenizer stn = new StringTokenizer(text, "\"");
        while (stn.hasMoreTokens()) {
            String token = stn.nextToken();
            textQuoted += token;
            if (stn.hasMoreTokens()) {
                textQuoted += "\\\"";
            }
        }
        if (text.endsWith("\"")) {
            textQuoted += "\\\"";
        }
        return textQuoted;
    }

    public static String getSchema(String schema, String type) {
        if (schema == null || schema.equals("")) {
            if (type.indexOf('.') >= 0) {
                return type.substring(0, type.indexOf('.'));
            }
        }
        return schema;
    }

    public static String getType(String schema, String type) {
        if (schema == null || schema.equals("")) {
            if (type.indexOf('.') >= 0) {
                return type.substring(type.indexOf('.') + 1);
            }
        }
        return type;
    }

    public static String unreserveSql(String word) {
        String unreserve = m_sqlReservedMap.get(word.toUpperCase());
        if (unreserve == null) {
            unreserve = word;
        }
        return unreserve;
    }

    private static final String[] SQL_RESERVED = new String[]{"ALL", "ALTER", "AND", "ANY",
        "ARRAY", "AS", "ASC", "AT", "AUTHID", "AVG", "BEGIN", "BETWEEN", "BINARY_INTEGER", "BODY",
        "BOOLEAN", "BULK", "BY", "CASE", "CHAR", "CHAR_BASE", "CHECK", "CLOSE", "CLUSTER",
        "COALESCE", "COLLECT", "COMMENT", "COMMIT", "COMPRESS", "CONNECT", "CONSTANT", "CREATE",
        "CURRENT", "CURRVAL", "CURSOR", "DATE", "DAY", "DECLARE", "DECIMAL", "DEFAULT", "DELETE",
        "DESC", "DISTINCT", "DO", "DROP", "ELSE", "ELSIF", "END", "EXCEPTION", "EXCLUSIVE",
        "EXECUTE", "EXISTS", "EXIT", "EXTENDS", "EXTRACT", "FALSE", "FETCH", "FLOAT", "FOR",
        "FORALL", "FROM", "FUNCTION", "GOTO", "GROUP", "HAVING", "HEAP", "HOUR", "IF", "IMMEDIATE",
        "IN", "INDEX", "INDICATOR", "INSERT", "INTEGER", "INTERFACE", "INTERSECT", "INTERVAL",
        "INTO", "IS", "ISOLATION", "JAVA", "LEVEL", "LIKE", "LIMITED", "LOCK", "LONG", "LOOP",
        "MAX", "MIN", "MINUS", "MINUTE", "MLSLABEL", "MOD", "MODE", "MONTH", "NATURAL", "NATURALN",
        "NEW", "NEXTVAL", "NOCOPY", "NOT", "NOWAIT", "NULL", "NULLIF", "NUMBER", "NUMBER_BASE",
        "OCIROWID", "OF", "ON", "OPAQUE", "OPEN", "OPERATOR", "OPTION", "OR", "ORDER",
        "ORGANIZATION", "OTHERS", "OUT", "PACKAGE", "PARTITION", "PCTFREE", "PLS_INTEGER",
        "POSITIVE", "POSITIVEN", "PRAGMA", "PRIOR", "PRIVATE", "PROCEDURE", "PUBLIC", "RAISE",
        "RANGE", "RAW", "REAL", "RECORD", "REF", "RELEASE", "RETURN", "REVERSE", "ROLLBACK", "ROW",
        "ROWID", "ROWNUM", "ROWTYPE", "SAVEPOINT", "SECOND", "SELECT", "SEPARATE", "SET", "SHARE",
        "SMALLINT", "SPACE", "SQL", "SQLCODE", "SQLERRM", "START", "STDDEV", "SUBTYPE",
        "SUCCESSFUL", "SUM", "SYNONYM", "SYSDATE", "TABLE", "THEN", "TIME", "TIMESTAMP",
        "TIMEZONE_REGION", "TIMEZONE_ABBR", "TIMEZONE_MINUTE", "TIMEZONE_HOUR", "TO", "TRIGGER",
        "TRUE", "TYPE", "UID", "UNION", "UNIQUE", "UPDATE", "USE", "USER", "VALIDATE", "VALUES",
        "VARCHAR", "VARCHAR2", "VARIANCE", "VIEW", "WHEN", "WHENEVER", "WHERE", "WHILE", "WITH",
        "WORK", "WRITE", "YEAR", "ZONE"};
    private static Map<String, String> m_sqlReservedMap;
    static {
        m_sqlReservedMap = new HashMap<String, String>();
        for (int i = 0; i < SQL_RESERVED.length; i++) {
            m_sqlReservedMap
                .put(SQL_RESERVED[i].toUpperCase(), SQL_RESERVED[i].toUpperCase() + "_");
        }
    }

}
