/*
 * 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.tests.types;

import java.io.Serializable;
import java.util.*;
import oracle.sql.*;
import org.eclipse.persistence.indirection.*;
import org.eclipse.persistence.mappings.OneToOneMapping;
import org.eclipse.persistence.descriptors.RelationalDescriptor;
import org.eclipse.persistence.tools.schemaframework.TableDefinition;

// Bug#4364359  This object is added to test the fix to overcome TIMESTAMPTZ not serializable
// as of jdbc 9.2.0.5 and 10.1.0.2.  It has been fixed in the next version for both streams

public class TIMESTAMPTZOwner implements Serializable {

    public int id;
    public Calendar tstzCal;
    public Calendar tsltzCal;
    public ValueHolderInterface tstz;

    public TIMESTAMPTZOwner() {
        this.tstz = new ValueHolder();
    }

    public int getId() {
        return id;
    }

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

    public TIMESTAMPTZOwner getTstz() {
        return (TIMESTAMPTZOwner)tstz.getValue();
    }

    public void setTstz(TIMESTAMPTZOwner aTstz) {
        tstz.setValue(aTstz);
    }

    public Calendar getTstzCal() {
        return tstzCal;
    }

    public void setTstzCal(Calendar tstzCal) {
        this.tstzCal = tstzCal;
    }

    public Calendar getTsltzCal() {
        return tsltzCal;
    }

    public void setTsltzCal(Calendar tsltzCal) {
        this.tsltzCal = tsltzCal;
    }

    public static TableDefinition tableDefinition()
    {
        TableDefinition definition = new TableDefinition();

        definition.setName("TSTZ_OWNER");

        definition.addField("ID", Integer.class);
        definition.addField("TSTZ", TIMESTAMPTZ.class);
        definition.addField("TSLTZ", TIMESTAMPLTZ.class);

        org.eclipse.persistence.tools.schemaframework.FieldDefinition field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
        field.setName("TSTZ_ID");
        field.setTypeName("NUMERIC");
        field.setSize(15);
        field.setShouldAllowNull(true );
        field.setIsPrimaryKey(false );
        field.setUnique(false );
        field.setIsIdentity(false );
        field.setForeignKeyFieldName("TSTZ_OBJ.ID");
        definition.addField(field);

        return definition;
    }

    public static RelationalDescriptor descriptor()
    {
        RelationalDescriptor descriptor = new RelationalDescriptor();

        /* First define the class, table and descriptor properties. */
        descriptor.setJavaClass(TIMESTAMPTZOwner.class);
        descriptor.setTableName("TSTZ_OWNER");
        descriptor.setPrimaryKeyFieldName("ID");

        /* Next define the attribute mappings. */
        descriptor.addDirectMapping("id", "ID");
        descriptor.addDirectMapping("tstzCal", "TSTZ");
        descriptor.addDirectMapping("tsltzCal", "TSLTZ");

        OneToOneMapping addressMapping = new OneToOneMapping();
        addressMapping.setAttributeName("tstz");
        addressMapping.setReferenceClass(TIMESTAMPTZOwner.class);
        addressMapping.useBasicIndirection();
        addressMapping.addForeignKeyFieldName("TSTZ_OWNER.TSTZ_ID", "TSTZ_OWNER.ID");
        descriptor.addMapping(addressMapping);

        return descriptor;
    }

    public static TIMESTAMPTZOwner example1() {
        TIMESTAMPTZOwner tstz = new TIMESTAMPTZOwner();
        tstz.setId(1);
        tstz.setTstzCal(Calendar.getInstance());
        tstz.setTsltzCal(Calendar.getInstance());
        return tstz;
    }

    public static TIMESTAMPTZOwner example2() {
        TIMESTAMPTZOwner tstz = new TIMESTAMPTZOwner();
        tstz.setId(2);
        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("America/Los_Angeles"));
        cal.set(1997, 11, 31, 23, 59, 59);
        tstz.setTstzCal(cal);
        tstz.setTsltzCal(cal);
        tstz.setTstz(example1());
        return tstz;
    }
}
