/*
 * 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:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.oxm.mappings.namespaces;

import java.util.ArrayList;
import java.util.List;
import org.eclipse.persistence.oxm.XMLRoot;

public class Company {
    String companyName;
    Employee manager;
    List departments;

    public Company() {
        departments = new ArrayList();
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public String getCompanyName() {
        return companyName;
    }

    public void setManager(Employee manager) {
        this.manager = manager;
    }

    public Employee getManager() {
        return manager;
    }

    public void setDepartments(List departments) {
        this.departments = departments;
    }

    public List getDepartments() {
        return departments;
    }

    public boolean equals(Object o) {
        try {
            Company theCompany = (Company)o;
            if (!theCompany.getCompanyName().equals(getCompanyName())) {
                return false;
            }
            if (((getManager() == null) && (theCompany.getManager() != null)) || ((theCompany.getManager() == null) && (getManager() != null))) {
                return false;
            }
            if ((getManager() != null) && (!getManager().equals(theCompany.getManager()))) {
                return false;
            }
            if (getDepartments().size() != theCompany.getDepartments().size()) {
                return false;
            }
            //if ((!theCompany.getDepartments().containsAll(getDepartments())) || (!getDepartments().containsAll(theCompany.getDepartments()))) {
                //return false;
            //}
            for (int i = 0; i < getDepartments().size(); i++) {
                Object first = getDepartments().get(i);
                Object second = theCompany.getDepartments().get(i);
                if (first instanceof Department && second instanceof Department) {
                    if (!first.equals(second)) {
                        return false;
                    }
                } else if (first instanceof XMLRoot && second instanceof XMLRoot) {
                    if (!(((XMLRoot)first).getLocalName().equals(((XMLRoot)second).getLocalName()))) {
                        return false;
                    }
                    if (!(((XMLRoot)first).getNamespaceURI().equals(((XMLRoot)second).getNamespaceURI()))) {
                        return false;
                    }
                } else {
                    return false;
                }
            }
        } catch (ClassCastException e) {
            return false;
        }
        return true;
    }
     public String toString() {
        String string = "Company( name:";
          string += getCompanyName() +" ";
          if(getManager() != null){
            string += getManager().toString();
          }

        for (int i = 0; i < getDepartments().size(); i++) {
            string += getDepartments().get(i).toString();
        }
        return string;
    }
}
