/*
 * Copyright (c) 2005, 2020 Oracle and/or its affiliates. All rights reserved.
 * Copyright (c) 2005, 2015 SAP. 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:
//     SAP - initial API and implementation

package org.eclipse.persistence.testing.models.wdf.jpa1.employee;

import java.util.Date;

import jakarta.persistence.AttributeOverride;
import jakarta.persistence.AttributeOverrides;
import jakarta.persistence.Column;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.PostUpdate;
import jakarta.persistence.Table;
import jakarta.persistence.Transient;

@Entity
@Table(name = "TMP_EMBEDD_FA")
public class EmbeddingFieldAccess {

    @Transient
    private boolean postUpdateCalled;

    public EmbeddingFieldAccess() {
    }

    public EmbeddingFieldAccess(int anId) {
        id = anId;
    }

    @Id
    protected int id;

    @Embedded
    @AttributeOverrides( { @AttributeOverride(name = "date", column = @Column(name = "EMB_FA_DATE")),
            @AttributeOverride(name = "time", column = @Column(name = "EMB_FA_LONG")) })
    protected EmbeddedFieldAccess fieldAccess;

    /*
     * Nesting different access types is currently not supported (PFD EJB-Persistence 21.01.2006) @Embedded @AttributeOverrides(
     * {
     *
     * @AttributeOverride(name = "date", column = @Column(name = "EMB_PA_DATE")), @AttributeOverride(name = "time", column =
     *
     * @Column(name = "EMB_PA_TIME")) })
     */
    @Transient
    public EmbeddedPropertyAccess propertyAccess;

    public void fill() {
        final long theTime = 123456789012345L;
        setFieldAccess(new EmbeddedFieldAccess());
        getFieldAccess().changeDate(new Date(theTime));
        getFieldAccess().changeTime(theTime);
        propertyAccess = new EmbeddedPropertyAccess();
        propertyAccess.setDate(new Date(theTime));
        propertyAccess.setTime(theTime);
    }

    public int getId() {
        return id;
    }

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

    public void clearPostUpdate() {
        postUpdateCalled = false;
    }

    @PostUpdate
    public void postUpdate() {
        postUpdateCalled = true;
    }

    public boolean postUpdateWasCalled() {
        return postUpdateCalled;
    }

    public void setFieldAccess(EmbeddedFieldAccess fieldAccess) {
        this.fieldAccess = fieldAccess;
    }

    public EmbeddedFieldAccess getFieldAccess() {
        return fieldAccess;
    }
}
