/*
 * Copyright (c) 2005, 2021 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.types;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import jakarta.persistence.Basic;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.Id;
import jakarta.persistence.Lob;
import jakarta.persistence.PostUpdate;
import jakarta.persistence.Table;
import jakarta.persistence.Temporal;
import jakarta.persistence.TemporalType;
import jakarta.persistence.Transient;
import jakarta.persistence.Version;

import org.eclipse.persistence.annotations.Customizer;
import org.eclipse.persistence.annotations.Mutable;
import org.eclipse.persistence.testing.framework.wdf.customizer.AdjustArrayTypeCustomizer;

/*
 * This entity class contains all supported <i>basic </i> data types.
 *
 * The Basic annotation is the simplest type of mapping to a database column. It can optionally be applied to any persistent
 * property or instance variable of the following type: Java primitive types, wrappers of the primitive types, java.lang.String,
 * java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time,
 * java.sql.Timestamp, byte[], Byte[], char[], Character[], enums, and any other type that implements Serializable.
 */

@Entity
@Table(name = "TMP_BASIC_TYPES_FA")
@Customizer(AdjustArrayTypeCustomizer.class)
public class BasicTypesFieldAccess {

    @Transient
    private boolean postUpdateCalled;

    public BasicTypesFieldAccess() {
    }

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

    @Version
    protected long version;

    @Id
    @Column(name = "ID")
    protected int id;

    // Java primitive types
    @Basic
    @Column(name = "P_BOOLEAN")
    protected boolean primitiveBoolean; // TODO ?

    @Basic
    @Column(name = "P_BYTE")
    protected byte primititveByte; // SMALLINT

    @Basic
    @Column(name = "P_CHAR")
    protected char primitiveChar = '0'; // INTEGER

    @Basic
    @Column(name = "P_SHORT")
    protected short primitiveShort; // SMALLINT

    @Basic
    @Column(name = "P_INT")
    protected int primitiveInt; // INTEGER

    @Basic
    @Column(name = "P_LONG")
    protected long primitiveLong; // BIGINT

    @Basic
    @Column(name = "P_FLOAT")
    protected float primitiveFloat; // REAL

    @Basic
    @Column(name = "P_DOUBLE")
    protected double primitiveDouble; // DOUBLE

    // wrappers of primitive types
    @Basic
    @Column(name = "W_BOOLEAN")
    protected Boolean wrapperBoolean; // TODO ?

    @Basic
    @Column(name = "W_BYTE")
    protected Byte wrapperByte; // SMALLINT

    @Basic
    @Column(name = "W_CHARACTER")
    protected Character wrapperCharacter; // INTEGER

    @Basic
    @Column(name = "W_SMALLINT")
    protected Short wrapperShort; // SMALLINT

    @Basic
    @Column(name = "W_INTEGER")
    protected Integer wrapperInteger; // INTEGER

    @Basic
    @Column(name = "W_LONG")
    protected Long wrapperLong; // BIGINT

    @Basic
    @Column(name = "W_FLOAT")
    protected Float wrapperFloat; // REAL

    @Basic
    @Column(name = "W_DOUBLE")
    protected Double wrapperDouble; // DOUBLE

    // immutable types
    @Basic
    @Column(name = "STRING_VC", length = 128)
    protected String string2Varchar; // VARCHAR

    @Basic
    @Column(name = "STRING_CLOB")
    @Lob
    protected String string2Clob; // CLOB

    @Basic
    @Column(name = "BIG_DECIMAL", precision = 12, scale = 2)
    protected BigDecimal bigDecimal; // DECIMAL

    @Basic
    @Column(name = "BIG_INTEGER", precision = 12)
    protected BigInteger bigInteger; // DECIMAL

    // mutable types
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "UTIL_DATE")
    protected Date utilDate; // DATE

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "UTIL_CALENDAR")
    protected Calendar utilCalendar; // TIMESTAMP

    @Basic
    @Column(name = "SQL_DATE")
    protected java.sql.Date sqlDate; // DATE

    @Basic
    @Column(name = "SQL_TIME")
    protected Time sqlTime; // TIME

    @Basic
    @Column(name = "SQL_TIMESTAMP")
    protected Timestamp sqlTimestamp; // TIMESTAMP

    // arrays
    @Basic
    @Column(name = "PBA_BINARY", length = 8, columnDefinition = "BINARY(8)")
    @Mutable
    protected byte[] primitiveByteArray2Binary; // BINARY

    @Basic
    @Column(name = "PBA_LONGVARBINARY", length = 1500)
    @Mutable
    protected byte[] primitiveByteArray2Longvarbinary; // LONGVARBINARY

    @Basic
    @Column(name = "PBA_BLOB")
    @Lob
    @Mutable
    protected byte[] primitiveByteArray2Blob; // BLOB

    @Basic
    @Column(name = "WBA_BINARY", length = 8, columnDefinition = "BINARY(8)")
    @Mutable
    protected Byte[] wrapperByteArray2Binary; // BINARY

    @Basic
    @Column(name = "WBA_LONGVARBINARY", length = 1500)
    @Mutable
    protected Byte[] wrapperByteArray2Longvarbinary; // LONGVARBINARY

    @Basic
    @Column(name = "WBA_BLOB")
    @Lob
    @Mutable
    protected Byte[] wrapperByteArray2Blob; // BLOB

    @Basic
    @Column(name = "PCA_VARCHAR", columnDefinition = "VARCHAR(255)")
    @Mutable
    protected char[] primitiveCharArray2Varchar; // VARCHAR

    @Basic
    @Column(name = "PCA_CLOB")
    @Lob
    @Mutable
    protected char[] primitiveCharArray2Clob; // CLOB

    @Basic
    @Column(name = "WCA_VARCHAR", columnDefinition = "VARCHAR(255)")
    @Mutable
    protected Character[] wrapperCharacterArray2Varchar; // VARCHAR

    @Basic
    @Column(name = "WCA_CLOB")
    @Lob
    @Mutable
    protected Character[] wrapperCharacterArray2Clob; // CLOB

    // user-defined serializable
    @Basic
    @Column(name = "SERIALIZABLE")
    @Lob
    protected Serializable serializable; // BLOB

    // enums
    protected @Enumerated(EnumType.STRING)
    @Column(name = "ENUM_STRING")
    UserDefinedEnum enumString;

    protected @Enumerated(EnumType.ORDINAL)
    @Column(name = "ENUM_ORDINAL")
    UserDefinedEnum enumOrdinal;

    protected transient String notPersistentByModifier;

    @Transient
    protected int notPersistentByAnnotation;

    public void fill() {
        primitiveBoolean = true;
        primititveByte = 1;
        primitiveChar = 'A';
        primitiveShort = 2;
        primitiveInt = 3;
        primitiveLong = 4;
        primitiveFloat = 1.5f;
        primitiveDouble = 2.5;
        wrapperBoolean = Boolean.TRUE;
        wrapperByte = (byte) 1;
        wrapperCharacter = 'A';
        wrapperShort = (short) 2;
        wrapperInteger = 3;
        wrapperLong = 4L;
        wrapperFloat = 1.5f;
        wrapperDouble = 2.5;
        string2Varchar = "VARCHAR";
        string2Clob = "CLOB";
        bigDecimal = new BigDecimal("42.42");
        bigInteger = new BigInteger("77");
        utilDate = new Date(17000);
        utilCalendar = new GregorianCalendar(2005, 9, 8, 10, 49);
        sqlDate = java.sql.Date.valueOf("2005-09-08");
        sqlTime = Time.valueOf("10:49:00");
        sqlTimestamp = new Timestamp(17000);
        primitiveByteArray2Binary = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 };

        primitiveByteArray2Longvarbinary = new byte[1111];
        for (int i = 0; i < primitiveByteArray2Longvarbinary.length; i++) {
            primitiveByteArray2Longvarbinary[i] = (byte) i;
        }
        primitiveByteArray2Blob = new byte[3333];
        for (int i = 0; i < primitiveByteArray2Blob.length; i++) {
            primitiveByteArray2Blob[i] = (byte) i;
        }

        wrapperByteArray2Binary = new Byte[] {(byte) 0, (byte) 1, (byte) 2, (byte) 3,
                (byte) 4, (byte) 5, (byte) 6, (byte) 7};

        wrapperByteArray2Longvarbinary = new Byte[1111];
        for (int i = 0; i < wrapperByteArray2Longvarbinary.length; i++) {
            wrapperByteArray2Longvarbinary[i] = (byte) i;
        }

        wrapperByteArray2Blob = new Byte[3333];
        for (int i = 0; i < wrapperByteArray2Blob.length; i++) {
            wrapperByteArray2Blob[i] = (byte) i;
        }

        primitiveCharArray2Varchar = new char[] { 'V', 'A', 'R', 'C', 'A', 'R' };
        primitiveCharArray2Clob = new char[] { 'C', 'L', 'O', 'B' };

        wrapperCharacterArray2Varchar = new Character[] {'V', 'A', 'R',
                'C', 'H', 'A', 'R'};
        wrapperCharacterArray2Clob = new Character[] {'C', 'L', 'O',
                'B'};
        serializable = new UserDefinedSerializable("REGEN"); // BLOB

        setEnumOrdinal(UserDefinedEnum.EMIL);
        setEnumString(UserDefinedEnum.HUGO);

    }

    /**
     * @return Returns the bigDecimal.
     */
    public BigDecimal getBigDecimal() {
        return bigDecimal;
    }

    /**
     * @param bigDecimal
     *            The bigDecimal to set.
     */
    public void setBigDecimal(BigDecimal bigDecimal) {
        this.bigDecimal = bigDecimal;
    }

    /**
     * @return Returns the bigInteger.
     */
    public BigInteger getBigInteger() {
        return bigInteger;
    }

    /**
     * @param bigInteger
     *            The bigInteger to set.
     */
    public void setBigInteger(BigInteger bigInteger) {
        this.bigInteger = bigInteger;
    }

    /**
     * @return Returns the id.
     */
    public int getId() {
        return id;
    }

    /**
     * @param id
     *            The id to set.
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * @return Returns the primititveByte.
     */
    public byte getPrimititveByte() {
        return primititveByte;
    }

    /**
     * @param primititveByte
     *            The primititveByte to set.
     */
    public void setPrimititveByte(byte primititveByte) {
        this.primititveByte = primititveByte;
    }

    /**
     * @return Returns the primitiveBoolean.
     */
    public boolean isPrimitiveBoolean() {
        return primitiveBoolean;
    }

    /**
     * @param primitiveBoolean
     *            The primitiveBoolean to set.
     */
    public void setPrimitiveBoolean(boolean primitiveBoolean) {
        this.primitiveBoolean = primitiveBoolean;
    }

    /**
     * @return Returns the primitiveByteArray2Binary.
     */
    public byte[] getPrimitiveByteArray2Binary() {
        return primitiveByteArray2Binary;
    }

    /**
     * @param primitiveByteArray2Binary
     *            The primitiveByteArray2Binary to set.
     */
    public void setPrimitiveByteArray2Binary(byte[] primitiveByteArray2Binary) {
        this.primitiveByteArray2Binary = primitiveByteArray2Binary;
    }

    /**
     * @return Returns the primitiveByteArray2Blob.
     */
    public byte[] getPrimitiveByteArray2Blob() {
        return primitiveByteArray2Blob;
    }

    /**
     * @param primitiveByteArray2Blob
     *            The primitiveByteArray2Blob to set.
     */
    public void setPrimitiveByteArray2Blob(byte[] primitiveByteArray2Blob) {
        this.primitiveByteArray2Blob = primitiveByteArray2Blob;
    }

    /**
     * @return Returns the primitiveByteArray2Longvarbinary.
     */
    public byte[] getPrimitiveByteArray2Longvarbinary() {
        return primitiveByteArray2Longvarbinary;
    }

    /**
     * @param primitiveByteArray2Longvarbinary
     *            The primitiveByteArray2Longvarbinary to set.
     */
    public void setPrimitiveByteArray2Longvarbinary(byte[] primitiveByteArray2Longvarbinary) {
        this.primitiveByteArray2Longvarbinary = primitiveByteArray2Longvarbinary;
    }

    /**
     * @return Returns the primitiveChar.
     */
    public char getPrimitiveChar() {
        return primitiveChar;
    }

    /**
     * @param primitiveChar
     *            The primitiveChar to set.
     */
    public void setPrimitiveChar(char primitiveChar) {
        this.primitiveChar = primitiveChar;
    }

    /**
     * @return Returns the primitiveCharArray2Clob.
     */
    public char[] getPrimitiveCharArray2Clob() {
        return primitiveCharArray2Clob;
    }

    /**
     * @param primitiveCharArray2Clob
     *            The primitiveCharArray2Clob to set.
     */
    public void setPrimitiveCharArray2Clob(char[] primitiveCharArray2Clob) {
        this.primitiveCharArray2Clob = primitiveCharArray2Clob;
    }

    /**
     * @return Returns the primitiveCharArray2Varchar.
     */
    public char[] getPrimitiveCharArray2Varchar() {
        return primitiveCharArray2Varchar;
    }

    /**
     * @param primitiveCharArray2Varchar
     *            The primitiveCharArray2Varchar to set.
     */
    public void setPrimitiveCharArray2Varchar(char[] primitiveCharArray2Varchar) {
        this.primitiveCharArray2Varchar = primitiveCharArray2Varchar;
    }

    /**
     * @return Returns the primitiveFloat.
     */
    public float getPrimitiveFloat() {
        return primitiveFloat;
    }

    /**
     * @param primitiveFloat
     *            The primitiveFloat to set.
     */
    public void setPrimitiveFloat(float primitiveFloat) {
        this.primitiveFloat = primitiveFloat;
    }

    /**
     * @return Returns the primitiveInt.
     */
    public int getPrimitiveInt() {
        return primitiveInt;
    }

    /**
     * @param primitiveInt
     *            The primitiveInt to set.
     */
    public void setPrimitiveInt(int primitiveInt) {
        this.primitiveInt = primitiveInt;
    }

    /**
     * @return Returns the primitiveLong.
     */
    public long getPrimitiveLong() {
        return primitiveLong;
    }

    /**
     * @param primitiveLong
     *            The primitiveLong to set.
     */
    public void setPrimitiveLong(long primitiveLong) {
        this.primitiveLong = primitiveLong;
    }

    /**
     * @return Returns the primitiveShort.
     */
    public short getPrimitiveShort() {
        return primitiveShort;
    }

    /**
     * @param primitiveShort
     *            The primitiveShort to set.
     */
    public void setPrimitiveShort(short primitiveShort) {
        this.primitiveShort = primitiveShort;
    }

    /**
     * @return Returns the prmitiveDouble.
     */
    public double getPrimitiveDouble() {
        return primitiveDouble;
    }

    /**
     * @param prmitiveDouble
     *            The prmitiveDouble to set.
     */
    public void setPrimitiveDouble(double prmitiveDouble) {
        this.primitiveDouble = prmitiveDouble;
    }

    /**
     * @return Returns the serializable.
     */
    public Serializable getSerializable() {
        return serializable;
    }

    /**
     * @param serializable
     *            The serializable to set.
     */
    public void setSerializable(Serializable serializable) {
        this.serializable = serializable;
    }

    /**
     * @return Returns the sqlDate.
     */
    public java.sql.Date getSqlDate() {
        return sqlDate;
    }

    /**
     * @param sqlDate
     *            The sqlDate to set.
     */
    public void setSqlDate(java.sql.Date sqlDate) {
        this.sqlDate = sqlDate;
    }

    /**
     * @return Returns the sqlTime.
     */
    public Time getSqlTime() {
        return sqlTime;
    }

    /**
     * @param sqlTime
     *            The sqlTime to set.
     */
    public void setSqlTime(Time sqlTime) {
        this.sqlTime = sqlTime;
    }

    /**
     * @return Returns the sqlTimestamp.
     */
    public Timestamp getSqlTimestamp() {
        return sqlTimestamp;
    }

    /**
     * @param sqlTimestamp
     *            The sqlTimestamp to set.
     */
    public void setSqlTimestamp(Timestamp sqlTimestamp) {
        this.sqlTimestamp = sqlTimestamp;
    }

    /**
     * @return Returns the string2Clob.
     */
    public String getString2Clob() {
        return string2Clob;
    }

    /**
     * @param string2Clob
     *            The string2Clob to set.
     */
    public void setString2Clob(String string2Clob) {
        this.string2Clob = string2Clob;
    }

    /**
     * @return Returns the string2Varchar.
     */
    public String getString2Varchar() {
        return string2Varchar;
    }

    /**
     * @param string2Varchar
     *            The string2Varchar to set.
     */
    public void setString2Varchar(String string2Varchar) {
        this.string2Varchar = string2Varchar;
    }

    /**
     * @return Returns the utilCalendar.
     */
    public Calendar getUtilCalendar() {
        return utilCalendar;
    }

    /**
     * @param utilCalendar
     *            The utilCalendar to set.
     */
    public void setUtilCalendar(Calendar utilCalendar) {
        this.utilCalendar = utilCalendar;
    }

    /**
     * @return Returns the utilDate.
     */
    public Date getUtilDate() {
        return utilDate;
    }

    /**
     * @param utilDate
     *            The utilDate to set.
     */
    public void setUtilDate(Date utilDate) {
        this.utilDate = utilDate;
    }

    /**
     * @return Returns the wrapperBoolean.
     */
    public Boolean getWrapperBoolean() {
        return wrapperBoolean;
    }

    /**
     * @param wrapperBoolean
     *            The wrapperBoolean to set.
     */
    public void setWrapperBoolean(Boolean wrapperBoolean) {
        this.wrapperBoolean = wrapperBoolean;
    }

    /**
     * @return Returns the wrapperByte.
     */
    public Byte getWrapperByte() {
        return wrapperByte;
    }

    /**
     * @param wrapperByte
     *            The wrapperByte to set.
     */
    public void setWrapperByte(Byte wrapperByte) {
        this.wrapperByte = wrapperByte;
    }

    /**
     * @return Returns the wrapperByteArray2Binary.
     */
    public Byte[] getWrapperByteArray2Binary() {
        return wrapperByteArray2Binary;
    }

    /**
     * @param wrapperByteArray2Binary
     *            The wrapperByteArray2Binary to set.
     */
    public void setWrapperByteArray2Binary(Byte[] wrapperByteArray2Binary) {
        this.wrapperByteArray2Binary = wrapperByteArray2Binary;
    }

    /**
     * @return Returns the wrapperByteArray2Blob.
     */
    public Byte[] getWrapperByteArray2Blob() {
        return wrapperByteArray2Blob;
    }

    /**
     * @param wrapperByteArray2Blob
     *            The wrapperByteArray2Blob to set.
     */
    public void setWrapperByteArray2Blob(Byte[] wrapperByteArray2Blob) {
        this.wrapperByteArray2Blob = wrapperByteArray2Blob;
    }

    /**
     * @return Returns the wrapperByteArray2Longvarbinary.
     */
    public Byte[] getWrapperByteArray2Longvarbinary() {
        return wrapperByteArray2Longvarbinary;
    }

    /**
     * @param wrapperByteArray2Longvarbinary
     *            The wrapperByteArray2Longvarbinary to set.
     */
    public void setWrapperByteArray2Longvarbinary(Byte[] wrapperByteArray2Longvarbinary) {
        this.wrapperByteArray2Longvarbinary = wrapperByteArray2Longvarbinary;
    }

    /**
     * @return Returns the wrapperCharacter.
     */
    public Character getWrapperCharacter() {
        return wrapperCharacter;
    }

    /**
     * @param wrapperCharacter
     *            The wrapperCharacter to set.
     */
    public void setWrapperCharacter(Character wrapperCharacter) {
        this.wrapperCharacter = wrapperCharacter;
    }

    /**
     * @return Returns the wrapperCharacterArray2Clob.
     */
    public Character[] getWrapperCharacterArray2Clob() {
        return wrapperCharacterArray2Clob;
    }

    /**
     * @param wrapperCharacterArray2Clob
     *            The wrapperCharacterArray2Clob to set.
     */
    public void setWrapperCharacterArray2Clob(Character[] wrapperCharacterArray2Clob) {
        this.wrapperCharacterArray2Clob = wrapperCharacterArray2Clob;
    }

    /**
     * @return Returns the wrapperCharacterArray2Varchar.
     */
    public Character[] getWrapperCharacterArray2Varchar() {
        return wrapperCharacterArray2Varchar;
    }

    /**
     * @param wrapperCharacterArray2Varchar
     *            The wrapperCharacterArray2Varchar to set.
     */
    public void setWrapperCharacterArray2Varchar(Character[] wrapperCharacterArray2Varchar) {
        this.wrapperCharacterArray2Varchar = wrapperCharacterArray2Varchar;
    }

    /**
     * @return Returns the wrapperDouble.
     */
    public Double getWrapperDouble() {
        return wrapperDouble;
    }

    /**
     * @param wrapperDouble
     *            The wrapperDouble to set.
     */
    public void setWrapperDouble(Double wrapperDouble) {
        this.wrapperDouble = wrapperDouble;
    }

    /**
     * @return Returns the wrapperFloat.
     */
    public Float getWrapperFloat() {
        return wrapperFloat;
    }

    /**
     * @param wrapperFloat
     *            The wrapperFloat to set.
     */
    public void setWrapperFloat(Float wrapperFloat) {
        this.wrapperFloat = wrapperFloat;
    }

    /**
     * @return Returns the wrapperInteger.
     */
    public Integer getWrapperInteger() {
        return wrapperInteger;
    }

    /**
     * @param wrapperInteger
     *            The wrapperInteger to set.
     */
    public void setWrapperInteger(Integer wrapperInteger) {
        this.wrapperInteger = wrapperInteger;
    }

    /**
     * @return Returns the wrapperLong.
     */
    public Long getWrapperLong() {
        return wrapperLong;
    }

    /**
     * @param wrapperLong
     *            The wrapperLong to set.
     */
    public void setWrapperLong(Long wrapperLong) {
        this.wrapperLong = wrapperLong;
    }

    /**
     * @return Returns the wrapperShort.
     */
    public Short getWrapperShort() {
        return wrapperShort;
    }

    /**
     * @param wrapperShort
     *            The wrapperShort to set.
     */
    public void setWrapperShort(Short wrapperShort) {
        this.wrapperShort = wrapperShort;
    }

    public void clearPostUpdate() {
        postUpdateCalled = false;
    }

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

    }

    public boolean postUpdateWasCalled() {
        return postUpdateCalled;
    }

    public void setEnumString(UserDefinedEnum enumString) {
        this.enumString = enumString;
    }

    public UserDefinedEnum getEnumString() {
        return enumString;
    }

    public void setEnumOrdinal(UserDefinedEnum enumOrdinal) {
        this.enumOrdinal = enumOrdinal;
    }

    public UserDefinedEnum getEnumOrdinal() {
        return enumOrdinal;
    }

    public synchronized long getVersion() {
        return version;
    }
}
