/*
 * Copyright (c) 2018, 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
 */

package org.eclipse.persistence.testing.oxm.xmlconversionmanager;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.xml.datatype.Duration;
import javax.xml.datatype.XMLGregorianCalendar;

import org.eclipse.persistence.internal.oxm.XMLConversionManager;

public class DatatypeEmployee {

    public String name;
    public int deptNumber;
    public Calendar birthDate;
    public XMLGregorianCalendar hireDate;
    public Duration vacationTaken;

    public boolean equals(Object anObject) {
        if (anObject == null) {
            return false;
        }
        if (!(anObject instanceof DatatypeEmployee)) {
            return false;
        }

        DatatypeEmployee test = (DatatypeEmployee) anObject;
        if (!test.name.equals(this.name)) {
            System.err.println("name NOT EQUAL");
            return false;
        }
        if (test.deptNumber != this.deptNumber) {
            System.err.println("deptNumber NOT EQUAL");
            return false;
        }
        if (!(test.birthDate.getTimeInMillis() == this.birthDate.getTimeInMillis())) {
            System.out.println("TEST:");
            System.out.println(test.birthDate);
            System.out.println("\nCTRL:");
            System.out.println(this.birthDate);
            return false;
        }
        if (!test.hireDate.equals(this.hireDate)) {
            System.err.println("hireDate NOT EQUAL");
            return false;
        }
        if (!test.vacationTaken.equals(this.vacationTaken)) {
            System.err.println("vacationTaken NOT EQUAL");
            return false;
        }

        return true;
    }

    public String toString() {
        SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss Z");

        String toString = "\nDatatypeEmployee@" + Integer.toHexString(hashCode());
        toString += "\n   name:          " + name;
        toString += "\n   deptNumber:    " + deptNumber;
        toString += "\n   birthDate:     " + birthDate; //format.format(birthDate.getTime());
        toString += "\n   hireDate:      " + hireDate; //format.format(hireDate.toGregorianCalendar().getTime());
        toString += "\n   vacationTaken: " + vacationTaken.toString() + "\n";

        return toString;
    }

}
