/*
 * 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.compositeobject.self;

import java.util.Calendar;

public class Employee {
    Period _StartDateAndEndDate;
    Address address;
    int id;

    public Employee() {
        _StartDateAndEndDate = new Period();
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public Period getStartDateAndEndDate() {
        return _StartDateAndEndDate;
    }

    public void setStartDateAndEndDate(Period value) {
        _StartDateAndEndDate = value;
    }

    public boolean equals(Object object) {
        try {
            Employee employee = (Employee)object;
            if (this == employee) {
                return true;
            }
            if (id != employee.getId()) {
                return false;
            }
            if (null == _StartDateAndEndDate) {
                if (null != employee.getStartDateAndEndDate()) {
                    return false;
                }
            } else {
                if (!_StartDateAndEndDate.equals(employee.getStartDateAndEndDate())) {
                    return false;
                }
            }
            if (null == address) {
                if (null != employee.address) {
                    return false;
                }
            } else {
                if (!address.equals(employee.address)) {
                    return false;
                }
            }
            return true;
        } catch (ClassCastException e) {
            return false;
        }
    }

    public String toString() {
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("Employee(_StartDateAndEndDate=");
        stringBuffer.append(_StartDateAndEndDate);
        stringBuffer.append(" address=");
        stringBuffer.append(address);
        stringBuffer.append("\")");
        return stringBuffer.toString();
    }

    public static class Period {
        Calendar _StartDate;
        Calendar _EndDate;

        public Period() {
        }

        public void setStartDate(Calendar value) {
            _StartDate = value;
        }

        public Calendar getStartDate() {
            return _StartDate;
        }

        public void setEndDate(Calendar value) {
            _EndDate = value;
        }

        public Calendar getEndDate() {
            return _EndDate;
        }

        public boolean equals(Object object) {
            try {
                Period period = (Period)object;
                if ((getStartDate() == period.getStartDate()) && (getEndDate() == period.getEndDate())) {
                    return true;
                }
                if ((getStartDate().getTime().compareTo(period.getStartDate().getTime()) != 0) || (getEndDate().getTime().compareTo(period.getEndDate().getTime()) != 0)) {
                    return false;
                }
                return true;
            } catch (ClassCastException e) {
                return false;
            }
        }
    }

}
