/*
 * 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 java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import static org.eclipse.persistence.testing.oxm.mappings.compositeobject.self.plsqlcallmodel.PLSQLargument.IN;

public class PLSQLrecord implements ComplexDatabaseType, OraclePLSQLType {

    protected String recordName;
    protected String typeName;
    protected String compatibleType;
    protected List<PLSQLargument> fields = new ArrayList<PLSQLargument>();

    public PLSQLrecord() {
        super();
    }

    @Override
    public boolean isComplexDatabaseType() {
        return true;
    }

    @Override
    public boolean isJDBCType() {
        return false;
    }

    public String getRecordName() {
        return recordName;
    }
    public void setRecordName(String name) {
        this.recordName = name;
    }

    public String getTypeName() {
        return typeName;
    }
    public void setTypeName(String typeName) {
        this.typeName = typeName;
    }

    public void addField(String fieldName, DatabaseType databaseType, int precision, int scale) {
        fields.add(
            new PLSQLargument(fieldName, -1, IN, databaseType, precision, scale));
    }
    public void addField(String fieldName, DatabaseType databaseType, int length) {
        fields.add(new PLSQLargument(fieldName, -1, IN, databaseType, length));
    }

    public void addField(String fieldName, DatabaseType databaseType) {
        fields.add(new PLSQLargument(fieldName, databaseType));
    }

    public boolean equals(Object obj) {
        PLSQLrecord complexObj;
        try {
            complexObj = (PLSQLrecord) obj;
        } catch (Exception x) {
            return false;
        }
        if (!complexObj.recordName.equals(this.recordName)) {
            return false;
        }
        if (!complexObj.typeName.equals(this.typeName)) {
            return false;
        }
        if ((complexObj.compatibleType == null && this.compatibleType != null) ||(complexObj.compatibleType != null && this.compatibleType == null)) {
            return false;
        }
        if (complexObj.compatibleType != null && (!complexObj.compatibleType.equals(this.compatibleType))) {
            return false;
        }
        if (complexObj.fields == null) {
            return fields == null;
        }
        if (fields == null) {
            return false;
        }
        if (fields.size() != complexObj.fields.size()) {
            return false;
        }
        Iterator<PLSQLargument> fieldIt = fields.iterator();
        while (fieldIt.hasNext()) {
            PLSQLargument arg = fieldIt.next();
            if (!complexObj.fields.contains(arg)) {
                return false;
            }
        }
        return true;
    }
}
