/*
 * 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.Collection;
import java.util.Deque;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;

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 DequeHolder {

    protected Deque<Integer> collection1;

    @XmlList
    protected Deque<String> collection2;

    protected Deque<Object> collection3;

    @XmlAnyElement(lax=true)
    protected Deque collection4;

    protected Deque<DequeHolder> collection5;

    @XmlElementRefs({@XmlElementRef(name="root"), @XmlElementRef(name="root2")})
    protected Deque collection6;

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

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

    protected Deque<CoinEnum> collection9;

    protected Deque<byte[]> collection11;

    @XmlAttribute
    protected Deque<String> collection12;

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

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

    @XmlElement
    protected Deque<ReferencedObject> referenced = new LinkedList<ReferencedObject>();

    public DequeHolder(){
    }

    public Deque<Integer> getCollection1() {
        return collection1;
    }
    public void setCollection1(Deque<Integer> collection1) {
        this.collection1 = collection1;
    }
    public Deque<String> getCollection2() {
        return collection2;
    }
    public void setCollection2(Deque<String> collection2) {
        this.collection2 = collection2;
    }
    public Deque<Object> getCollection3() {
        return collection3;
    }
    public void setCollection3(Deque<Object> collection3) {
        this.collection3 = collection3;
    }
    public Deque getCollection4() {
        return collection4;
    }
    public void setCollection4(Deque collection4) {
        this.collection4 = collection4;
    }
    public Deque<DequeHolder> getCollection5() {
        return collection5;
    }
    public void setCollection5(Deque<DequeHolder> collection5) {
        this.collection5 = collection5;
    }

     public Deque getCollection6() {
        return collection6;
    }

    public void setCollection6(Deque collection6) {
        this.collection6 = collection6;
    }

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

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

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

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

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

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

    public Deque<byte[]> getCollection11() {
        return collection11;
    }

    public void setCollection11(Deque<byte[]> collection11) {
        this.collection11 = collection11;
    }

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

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

    public Deque getCollection13() {
        return collection13;
    }

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

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

    public void setReferencedObject(Deque<ReferencedObject> referencedObject) {
        this.referenced = referencedObject;
    }

    public boolean equals(Object compareObject){

         if(compareObject instanceof DequeHolder){
             DequeHolder compareCollectionHolder = ((DequeHolder)compareObject);
             return compareCollections(collection1, compareCollectionHolder.getCollection1())
                    && compareCollections(collection2, compareCollectionHolder.getCollection2())
                    && compareCollections(collection3, compareCollectionHolder.getCollection3())
                    && compareCollections(collection4, compareCollectionHolder.getCollection4())
                    && compareCollections(collection5, compareCollectionHolder.getCollection5())
                    && compareCollections(collection6, compareCollectionHolder.getCollection6())
                    && compareCollections(collection7, compareCollectionHolder.getCollection7())
                    && compareCollections(collection8, compareCollectionHolder.getCollection8())
                    && compareCollections(collection9, compareCollectionHolder.getCollection9())
                    && compareCollections(collection11, compareCollectionHolder.getCollection11())
                    && 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;
     }

}
