/*
 * Copyright (c) 2012, 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:
//     Blaise Doughan - 2.4.1 - initial implementation
package org.eclipse.persistence.testing.jaxb.collections;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.NavigableSet;
import java.util.TreeSet;

import jakarta.xml.bind.JAXBElement;
import jakarta.xml.bind.annotation.XmlAnyAttribute;
import jakarta.xml.bind.annotation.XmlAnyElement;
import jakarta.xml.bind.annotation.XmlAttribute;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlElementRef;
import jakarta.xml.bind.annotation.XmlElementRefs;
import jakarta.xml.bind.annotation.XmlElements;
import jakarta.xml.bind.annotation.XmlIDREF;
import jakarta.xml.bind.annotation.XmlList;
import jakarta.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "container")
public class NavigableSetHolder implements Comparable {

    protected NavigableSet<Integer> collection1;

    @XmlList
    protected NavigableSet<String> collection2;

    protected NavigableSet<Object> collection3;

    protected NavigableSet<NavigableSetHolder> collection5;

    @XmlElement(name = "referenced-id")
    @XmlIDREF
    @XmlList
    protected NavigableSet<ReferencedObject> collection7;

    @XmlAttribute(name = "attribute-referenced-id")
    @XmlIDREF
    public NavigableSet<ReferencedObject> collection8;

    protected NavigableSet<CoinEnum> collection9;

    @XmlAnyAttribute
    protected Map collection10;

    @XmlAttribute
    protected NavigableSet<String> collection12;

    @XmlElements({ @XmlElement(name = "collection13integer", type = Integer.class), @XmlElement(name = "collection13string", type = String.class) })
    protected NavigableSet collection13;

    @XmlElements({ @XmlElement(name = "collection14integer", type = Integer.class), @XmlElement(name = "collection14string", type = String.class, nillable = true) })
    protected NavigableSet collection14;

    @XmlElement
    protected List<ReferencedObject> referenced = new ArrayList<ReferencedObject>();

    public NavigableSetHolder() {
    }

    public NavigableSet<Integer> getCollection1() {
        return collection1;
    }

    public void setCollection1(NavigableSet<Integer> collection1) {
        this.collection1 = collection1;
    }

    public NavigableSet<String> getCollection2() {
        return collection2;
    }

    public void setCollection2(NavigableSet<String> collection2) {
        this.collection2 = collection2;
    }

    public NavigableSet<Object> getCollection3() {
        return collection3;
    }

    public void setCollection3(NavigableSet<Object> collection3) {
        this.collection3 = collection3;
    }

    public NavigableSet<NavigableSetHolder> getCollection5() {
        return collection5;
    }

    public void setCollection5(NavigableSet<NavigableSetHolder> collection5) {
        this.collection5 = collection5;
    }

    public NavigableSet<ReferencedObject> getCollection7() {
        return collection7;
    }

    public void setCollection7(NavigableSet<ReferencedObject> collection7) {
        this.collection7 = collection7;
    }

    public NavigableSet<ReferencedObject> getCollection8() {
        return collection8;
    }

    public void setCollection8(NavigableSet<ReferencedObject> collection8) {
        this.collection8 = collection8;
    }

    public NavigableSet<CoinEnum> getCollection9() {
        return collection9;
    }

    public void setCollection9(NavigableSet<CoinEnum> collection9) {
        this.collection9 = collection9;
    }

    public Map getCollection10() {
        return collection10;
    }

    public void setCollection10(Map collection10) {
        this.collection10 = collection10;
    }

    public NavigableSet<String> getCollection12() {
        return collection12;
    }

    public void setCollection12(NavigableSet<String> collection12) {
        this.collection12 = collection12;
    }

    public NavigableSet getCollection13() {
        return collection13;
    }

    public void setCollection13(NavigableSet collection13) {
        this.collection13 = collection13;
    }

    public List<ReferencedObject> getReferenced() {
        return referenced;
    }

    public void setReferenced(List<ReferencedObject> referenced) {
        this.referenced = referenced;
    }

    public boolean equals(Object compareObject){

         if(compareObject instanceof NavigableSetHolder){
             NavigableSetHolder compareCollectionHolder = ((NavigableSetHolder)compareObject);
             return compareCollections(collection1, compareCollectionHolder.getCollection1())
                    && compareCollections(collection2, compareCollectionHolder.getCollection2())
                    && compareCollections(collection3, compareCollectionHolder.getCollection3())
                    && compareCollections(collection5, compareCollectionHolder.getCollection5())
                    && compareCollections(collection7, compareCollectionHolder.getCollection7())
                    && compareCollections(collection8, compareCollectionHolder.getCollection8())
                    && compareCollections(collection9, compareCollectionHolder.getCollection9())
                    && compareMaps(collection10, compareCollectionHolder.getCollection10())
                    && compareCollections(collection12, compareCollectionHolder.getCollection12())
                    && compareCollections(collection13, compareCollectionHolder.getCollection13())
                    ;
         }
         return false;
     }

    private boolean compareMaps(Map map1, Map map2) {
        if (map1 == null) {
            return map2 == null;
        }
        if (map1.size() != map2.size()) {
            return false;
        }
        return map1.equals(map2);
    }

    private boolean compareCollections(Collection compareList1, Collection compareList2) {
        if (compareList1 == null) {
            return compareList2 == null;
        } else {
            if (compareList2 == null) {
                return false;
            }
            if (compareList1.size() != compareList2.size()) {
                return false;
            }
            Iterator iter1 = compareList1.iterator();
            Iterator iter2 = compareList2.iterator();
            while (iter1.hasNext()) {
                Object next1 = iter1.next();
                Object next2 = iter2.next();
                if (!compareObjects(next1, next2)) {
                    return false;
                }
            }
            return true;
        }
    }

    private boolean compareObjects(Object obj1, Object obj2) {
        if (obj1 == null & obj2 == null) {
            return true;
        }
        if (obj1 instanceof JAXBElement) {
            if (obj2 instanceof JAXBElement) {
                if (!((JAXBElement) obj1).getName().getLocalPart().equals(((JAXBElement) obj2).getName().getLocalPart())) {
                    return false;
                }
                if (!((JAXBElement) obj1).getDeclaredType().equals(((JAXBElement) obj2).getDeclaredType())) {
                    return false;
                }
                if (!((JAXBElement) obj1).getValue().equals(((JAXBElement) obj2).getValue())) {
                    return false;
                }
                return true;
            }
            return false;
        } else {
            if (obj1.getClass().isArray() && obj2.getClass().isArray()) {
                return compareArrays(obj1, obj2);
            } else {
                return obj1.equals(obj2);
            }
        }
    }

    protected boolean compareArrays(Object controlValue, Object testValue) {
        int controlSize = Array.getLength(controlValue);
        int objSize = Array.getLength(testValue);
        if (controlSize != objSize) {
            return false;
        }
        for (int x = 0; x < controlSize; x++) {
            Object controlItem = Array.get(controlValue, x);
            Object testItem = Array.get(testValue, x);

            if (!controlItem.equals(testItem)) {
                return false;
            }
        }
        return true;
    }

    @Override
    public int compareTo(Object o) {
        if (this.equals(o)) {
            return 0;
        }
        return 1;
    }

}
