/*
 * 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;

public class PLSQLMap extends Typemap {
    public PLSQLMap(TypeClass s, SqlReflector reflector) {
        super(s, reflector);
        mapInit();
    }

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

    @Override
    public String writeTypeName(TypeClass type) {
        return writeTypeName2(type, false);
    }

    @Override
    public String writeTypeName(TypeClass type, boolean intfIfPossible) {
        return writeTypeName2(type, intfIfPossible);
    }

    private String writeTypeName2(TypeClass type, boolean itfIfPossible) {
        // In case the type is a Java type, which has no SQL correspondence
        if (type instanceof JavaType) {
            return ((JavaType)type).getTypeName(this);
        }
        SqlType sqlType = (SqlType)type;
        String predefinedName = null;
        if (sqlType == null) {
            return null;
        }
        String sql = (sqlType.getSqlName() == null) ? null : sqlType.getSqlName().toString();
        if (sql != null && m_reflector.getTypeMap().get(sql) != null) {
            predefinedName = m_reflector.getTypeMap().get(sql).getSqlName().getUseClass(
                m_package);
        }
        else {
            predefinedName = writePredefinedName(sqlType.getJdbcTypecode());
        }
        if (predefinedName != null) {
            return predefinedName;
        }
        if (sqlType.isRef()) {
            // SqlType componentType =
            // (SqlType) Publisher.getComponentTypeAndCatch(sqlType);
            return writeTypeName(sqlType) + "Ref";
        }
        else {
            SqlName sqlName = sqlType.getSqlName();
            return interfaceIfPossible(sqlName, m_package, itfIfPossible);
        }
    }

    private static String interfaceIfPossible(SqlName sqlName, String mpackage,
        boolean itfIfPossible) {
        if (itfIfPossible && sqlName.hasUseItf()) {
            return sqlName.getUseItf(mpackage);
        }
        else if (sqlName.hasUseClass()) {
            return sqlName.getUseClass(mpackage);
        }
        else if (itfIfPossible && sqlName.hasDeclItf()) {
            return sqlName.getDeclItf(mpackage);
        }
        else {
            return sqlName.getDeclClass(mpackage);
        }
    }

    /**
     * Determine the java name for a given SQL field.
     */
    @Override
    public String getMemberName(String sqlName, boolean wordBoundary, boolean onlyIfRegistered,
                                Name name) {
        String s = null;

        if (m_field_map != null && (s = m_field_map.get(sqlName)) != null) {
            if (s.equals("null")) {
                return null;
            }
            return s;
        }
        else {
            return onlyIfRegistered ? null : SqlName.sqlIdToJavaId(sqlName, wordBoundary, true);
        }
    }

    @Override
    public String getMemberNameAsSuffix(String sqlName) {
        return getMemberName(sqlName, true, false);
    }
}
