/*
 * 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.ArrayList;
import java.util.List;

import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.JoinTable;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.OneToOne;
import jakarta.persistence.OrderBy;
import jakarta.persistence.PrimaryKeyJoinColumn;
import jakarta.persistence.Table;
import jakarta.persistence.TableGenerator;

@Entity
@Table(name = "TMP_COURSE")
@TableGenerator(name = "CourseGenerator", table = "TMP_COURSE_GEN", pkColumnName = "BEAN_NAME", valueColumnName = "MAX_ID")
public class Course {
    private long m_id;
    private List<Employee> m_attendees = new ArrayList<Employee>();
    private Material material;

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "CourseGenerator")
    @Column(name = "COURSE_ID")
    public long getCourseId() {
        return m_id;
    }

    @Deprecated
    // for use by the entity manager only
    protected void setCourseId(long id) {
        m_id = id;
    }

    // <attribute name="attendees">
    // <many-to-many target-entity="com.sap.jpa.example.Employee" fetch="EAGER"/>
    // <join-table name="TMP_COURSE_EMP">
    // <join-column name="COURSE_ID"/>
    // <inverse-join-column name="EMP_ID"/>
    // </join-table>
    // <order-by>lastname</order-by>
    // </attribute>
    @ManyToMany(targetEntity = Employee.class, fetch = FetchType.EAGER)
    @JoinTable(name = "TMP_COURSE_EMP", joinColumns = { @JoinColumn(name = "COURSE_ID") }, inverseJoinColumns = { @JoinColumn(name = "EMP_ID") })
    @OrderBy("lastname")
    public List<Employee> getAttendees() {
        return m_attendees;
        // FIXME bugzilla 309681
//        return Collections.unmodifiableList(m_attendees);
    }

    public void setAttendees(final List<Employee> attendees) {
        m_attendees.clear();
        m_attendees.addAll(attendees);
    }

    public void addAttendee(final Employee attendee) {
        m_attendees.add(attendee);
    }

    public void removeAttendee(final Employee attendee) {
        m_attendees.remove(attendee);
    }

    public void clearAttendees() {
        m_attendees.clear();
    }

    @PrimaryKeyJoinColumn
    @OneToOne(cascade = CascadeType.PERSIST, optional=true)
    public Material getMaterial() {
        return material;
    }

    public void setMaterial(Material material) {
        this.material = material;
    }
}
