/*
 * 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.models.jpa.fieldaccess.advanced;

import java.util.*;
import java.io.Serializable;
import jakarta.persistence.*;
import static jakarta.persistence.CascadeType.*;

import org.eclipse.persistence.annotations.NamedStoredProcedureQuery;
import org.eclipse.persistence.annotations.NamedStoredProcedureQueries;
import org.eclipse.persistence.annotations.StoredProcedureParameter;
import static org.eclipse.persistence.annotations.Direction.OUT;
import static org.eclipse.persistence.annotations.Direction.IN_OUT;

/**
 * <p><b>Purpose</b>: Represents the mailing address on an Employee
 * <p><b>Description</b>: Held in a private 1:1 relationship from Employee
 * @see Employee
 */
@Entity(name="Address")
@Table(name="CMP3_FA_ADDRESS")
@NamedNativeQueries({
    @NamedNativeQuery(
        name="findAllFieldAccessSQLAddresses",
        query="select * from CMP3_FA_ADDRESS",
        resultClass=org.eclipse.persistence.testing.models.jpa.fieldaccess.advanced.Address.class
    ),
    @NamedNativeQuery(
        name="findAllFieldAccessSQLAddressesByCity_QuestionMark_Number",
        query="select * from CMP3_FA_ADDRESS where CITY=?1",
        resultClass=org.eclipse.persistence.testing.models.jpa.fieldaccess.advanced.Address.class
    ),
    @NamedNativeQuery(
        name="findAllFieldAccessSQLAddressesByCity_QuestionMark",
        query="select * from CMP3_FA_ADDRESS where CITY=?",
        resultClass=org.eclipse.persistence.testing.models.jpa.fieldaccess.advanced.Address.class
    ),
    @NamedNativeQuery(
        name="findAllFieldAccessSQLAddressesByCityAndCountry_QuestionMark_Number",
        query="select * from CMP3_FA_ADDRESS where CITY=?1 and COUNTRY=?2",
        resultClass=org.eclipse.persistence.testing.models.jpa.fieldaccess.advanced.Address.class
    ),
    @NamedNativeQuery(
        name="findAllFieldAccessSQLAddressesByCityAndCountry_QuestionMark",
        query="select * from CMP3_FA_ADDRESS where CITY=? and COUNTRY=?",
        resultClass=org.eclipse.persistence.testing.models.jpa.fieldaccess.advanced.Address.class
    )}
)
@NamedQuery(
    name="findAllFieldAccessAddressesByPostalCode",
    query="SELECT OBJECT(address) FROM Address address WHERE address.postalCode = :postalcode"
)
@NamedStoredProcedureQueries({
    @NamedStoredProcedureQuery(
    name="SProcAddress",
    resultClass=org.eclipse.persistence.testing.models.jpa.fieldaccess.advanced.Address.class,
    procedureName="SProc_Read_Address",
    parameters={@StoredProcedureParameter(direction=IN_OUT, name="address_id_v", queryParameter="ADDRESS_ID", type=Integer.class),
                @StoredProcedureParameter(direction=OUT, name="street_v", queryParameter="STREET", type=String.class),
                @StoredProcedureParameter(direction=OUT, name="city_v", queryParameter="CITY", type=String.class),
                @StoredProcedureParameter(direction=OUT, name="country_v", queryParameter="COUNTRY", type=String.class),
                @StoredProcedureParameter(direction=OUT, name="province_v", queryParameter="PROVINCE", type=String.class),
                @StoredProcedureParameter(direction=OUT, name="p_code_v", queryParameter="P_CODE", type=String.class)}),
    @NamedStoredProcedureQuery(
    name="SProcInOut",
    resultClass=org.eclipse.persistence.testing.models.jpa.fieldaccess.advanced.Address.class,
    procedureName="SProc_Read_InOut",
    parameters={@StoredProcedureParameter(direction=IN_OUT, name="address_id_v", queryParameter="ADDRESS_ID", type=Long.class),
                @StoredProcedureParameter(direction=OUT, name="street_v", queryParameter="STREET", type=String.class)}),
    @NamedStoredProcedureQuery(
    name="SProcInOutReturningRawData",
    procedureName="SProc_Read_InOut",
    parameters={@StoredProcedureParameter(direction=IN_OUT, name="address_id_v", queryParameter="ADDRESS_ID", type=Long.class),
                @StoredProcedureParameter(direction=OUT, name="street_v", queryParameter="STREET", type=String.class)})
})
public class Address implements Serializable {
    @Id
    // BUG 5079973 - this should be a valid specification, that is the generator
    // trumps the AUTO strategy defaulting.
    @GeneratedValue(generator="FA_ADD_SEQ_GENERATOR")
    @SequenceGenerator(name="FA_ADD_SEQ_GENERATOR", sequenceName="ADDRESS_SEQ", allocationSize=25)
    @Column(name="ADDRESS_ID")
    private Integer id;

    private String street;
    private String city;
    private String province;

    @Column(name="P_CODE")
    private String postalCode;

    private String country;

    @OneToMany(cascade=ALL, mappedBy="address")
    private Collection<Employee> employees;

    public Address() {
        city = "";
        province = "";
        postalCode = "";
        street = "";
        country = "";
        this.employees = new Vector<Employee>();
    }

    public Address(String street, String city, String province, String country, String postalCode) {
        this.street = street;
        this.city = city;
        this.province = province;
        this.country = country;
        this.postalCode = postalCode;
        this.employees = new Vector<Employee>();
    }

    public Address copy() {
        Address copy = new Address();
        copy.id = this.id;
        copy.street = this.street;
        copy.city = this.city;
        copy.province = this.province;
        copy.country = this.country;
        copy.postalCode = this.postalCode;
        return copy;
    }

    public TransferAddress transferCopy() {
        TransferAddress copy = new TransferAddress();
        copy.id = this.id;
        copy.street = this.street;
        copy.city = this.city;
        copy.province = this.province;
        copy.country = this.country;
        copy.postalCode = this.postalCode;
        return copy;
    }

    public Integer getId() {
        return id;
    }

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

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getPostalCode() {
        return postalCode;
    }

    public void setPostalCode(String postalCode) {
        this.postalCode = postalCode;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public Collection<Employee> getEmployees() {
        return employees;
    }

    public void setEmployees(Collection<Employee> employees) {
        this.employees = employees;
    }

    public class TransferAddress {
        public Integer id;
        public String street;
        public String city;
        public String province;
        public String postalCode;
        public String country;
    }
}
