/*
 * Copyright (c) 2011, 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:
//     mmacivor - Initial implementation
package org.eclipse.persistence.testing.jaxb.annotations.xmlpath;

import java.util.Iterator;
import java.util.List;
import java.util.Map;

import jakarta.xml.bind.annotation.XmlAnyAttribute;
import jakarta.xml.bind.annotation.XmlAttribute;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlIDREF;
import javax.xml.namespace.QName;

import org.eclipse.persistence.oxm.annotations.XmlPath;

public class Employee {
    @XmlAttribute
    @XmlPath("employee-info/@id")
    public Integer id;

    @XmlElement
    @XmlPath("personal-info/first-name/text()")
    public String firstName;

    @XmlPath("personal-info/last-name/text()")
    public String lastName;

    @XmlPath("contact-info/address-id/text()")
    @XmlIDREF
    public Address address;

    @XmlPath("contact-info/phones/phone-number")
    public List<PhoneNumber> phones;

    @XmlPath("responsibilities/responsibility/text()")
    public List<String> responsibilities;

    @XmlPath("extra-attributes")
    @XmlAnyAttribute
    public Map<QName, String> attributes;

    @XmlPath("any-object-root")
    public Object anyObject;

    @XmlPath("any-collection-root")
    public List<Object> anyCollection;

    public boolean equals(Object obj) {
        if(!(obj instanceof Employee)) {
            return false;
        }

        Employee emp = (Employee)obj;
        boolean equal = this.firstName.equals(emp.firstName);
        equal = equal && this.lastName.equals(emp.lastName);
        equal = equal && this.address.equals(emp.address);

        Iterator<PhoneNumber> phones1 = this.phones.iterator();
        Iterator<PhoneNumber> phones2 = emp.phones.iterator();
        while(phones1.hasNext()) {
            equal = (phones1.next().equals(phones2.next())) && equal;
        }

        for(QName nextKey:this.attributes.keySet()) {
            String value1 = this.attributes.get(nextKey);
            String value2 = emp.attributes.get(nextKey);
            equal = equal && value1.equals(value2);
        }
        return equal;
    }
}
