/*
 * 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.testing.oxm.mappings.compositeobject.self.plsqlcallmodel;

import static java.lang.Integer.MIN_VALUE;

public class PLSQLargument{

    public static final Integer IN = 1;
    public static final Integer OUT = 2;
    public static final Integer INOUT = 3;

    public String name;
    public int index = MIN_VALUE;
    public int direction = IN;
    public int length = 255;          //default from the EJB 3.0 spec.
    public int precision = MIN_VALUE;
    public int scale = MIN_VALUE;
    public boolean cursorOutput = false;
    public DatabaseTypeWrapper databaseTypeWrapper;

    public PLSQLargument() {
    }

    public PLSQLargument(String name, DatabaseType databaseType) {
        this(name, -1, IN, databaseType);
    }

    public PLSQLargument(String name, int index, int direction, DatabaseType databaseType) {
        this.name = name;
        this.index = index;
        this.direction = direction;
        if (!databaseType.isComplexDatabaseType() && databaseType.isJDBCType()) {
            databaseTypeWrapper = new JDBCTypeWrapper(databaseType);
        }
        else if (!databaseType.isComplexDatabaseType() && !databaseType.isJDBCType()) {
            databaseTypeWrapper = new SimplePLSQLTypeWrapper(databaseType);
        }
        else if (databaseType.isComplexDatabaseType()) {
            databaseTypeWrapper = new ComplexPLSQLTypeWrapper(databaseType);
        }
    }

    public PLSQLargument(String name, int index, int direction, DatabaseType databaseType,
        int length) {
        this(name, index, direction, databaseType);
        this.length = length;
    }

    public PLSQLargument(String name, int index, int direction, DatabaseType databaseType,
        int precision, int scale) {
        this(name, index, direction, databaseType);
        this.precision = precision;
        this.scale = scale;
    }

    public void useNamedCursorOutputAsResultSet() {
        cursorOutput = true;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder(name);
        sb.append('{');
        if (direction == IN) {
            sb.append("IN");
        }
        else if (direction == INOUT) {
            sb.append("INOUT");
        }
        else if (direction == OUT) {
            sb.append("OUT");
        }
        sb.append(',');
        sb.append(index);
        sb.append('}');
        return sb.toString();
    }

    public boolean equals(Object obj) {
        PLSQLargument pArg = null;
        try {
            pArg = (PLSQLargument) obj;
        } catch (ClassCastException ccex) {
            return false;
        }
        if (!pArg.name.equals(this.name)) {
            return false;
        }
        if (pArg.direction != this.direction) {
            return false;
        }
        if (pArg.index != this.index) {
            return false;
        }
        if (!pArg.databaseTypeWrapper.equals(this.databaseTypeWrapper)) {
            return false;
        }
        return true;
    }
}
