/*
 * Copyright (c) 1998, 2021 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:
//      ailitchev ported the original test written by dminsky
package org.eclipse.persistence.testing.tests.types;

import java.text.*;
import java.util.*;

import oracle.sql.*;

import org.eclipse.persistence.descriptors.*;
import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.tools.schemaframework.*;
import org.eclipse.persistence.platform.database.oracle.*;

import org.eclipse.persistence.testing.framework.*;

/**
 * Testcase for resolution of issues with TIMESTAMPTZ compatibility and correctness.
 * @author dminsky
 */
public class CalendarToTSTZWithBindingTest extends TestCase {

    // persistent fields
    private Calendar calendar;
    private int testId;

    // transient fields
    private boolean oldBindingValue;
    private boolean printCalendarIntoTimestampTZ;
    private DatabaseRecord result;

    // test data
    private String originalCalendarString;
    private static final String[] calendarStrings = new String[] {
        "01/01/2006 00:00:00 US/Eastern",
        "01/01/2006 00:00:00 US/Pacific",

        "04/01/2006 19:00:00 US/Eastern",
        "04/01/2006 19:00:00 US/Pacific",

        "04/01/2006 20:59:00 US/Eastern",
        "04/01/2006 20:59:00 US/Pacific",

        "04/01/2006 21:00:00 US/Eastern",
        "04/01/2006 21:00:00 US/Pacific",

        "04/01/2006 21:01:00 US/Eastern",
        "04/01/2006 21:01:00 US/Pacific",

        "04/01/2006 22:00:00 US/Eastern",
        "04/01/2006 22:00:00 US/Pacific",

        "10/29/2006 01:00:00 US/Eastern",
        "10/29/2006 01:00:00 PST",

        "10/29/2006 01:00:00 EST",
        "10/29/2006 01:00:00 PST",

        "03/10/2007 21:00:00 EST",
        "03/10/2007 21:00:00 PST",

        "03/10/2007 22:00:00 EST",
        "03/10/2007 22:00:00 PST",

        "10/28/2007 01:00:00 US/Eastern",
        "10/28/2007 01:00:00 PST",

        "11/04/2007 01:00:00 EST",
        "11/04/2007 01:00:00 PST",

        "12/31/2007 23:00:00 US/Eastern",
        "12/31/2007 23:00:00 US/Pacific"
    };

    public CalendarToTSTZWithBindingTest() {
        super();
    }

    public CalendarToTSTZWithBindingTest(int testId, String calendarString, boolean printCalendarIntoTimestampTZ) {
        super();
        this.printCalendarIntoTimestampTZ = printCalendarIntoTimestampTZ;
        setTestId(testId);
        setOriginalCalendarString(calendarString);
        setCalendar(formatStringAsCalendar(calendarString));
    }

    public Calendar getCalendar() {
        return calendar;
    }

    public void setCalendar(Calendar calendar) {
        this.calendar = calendar;
    }

    public int getTestId() {
        return testId;
    }

    public void setTestId(int testId) {
        this.testId = testId;
    }

    public void setOriginalCalendarString(String originalCalendarString) {
        this.originalCalendarString = originalCalendarString;
    }

    public String getOriginalCalendarString() {
        return this.originalCalendarString;
    }

    public String toString() {
        return "Test #: " + getTestId() + " -> " + getOriginalCalendarString();
    }

/*    public static Vector testInstancesWithBindingAndCalendarPrinting() {
        Vector tests = new Vector(calendarStrings.length);
        for (int i = 0; i < calendarStrings.length; i++) {
            tests.add(new CalendarToTSTZWithBindingTest(i + 1, calendarStrings[i], true));
        }
        return tests;
    }*/

    public static Vector testInstancesWithBindingAndNoCalendarPrinting() {
        Vector tests = new Vector(calendarStrings.length);
        for (int i = 0; i < calendarStrings.length; i++) {
            tests.add(new CalendarToTSTZWithBindingTest(i + (calendarStrings.length + 1), calendarStrings[i], false));
        }
        return tests;
    }

    @Override
    public void setup() {
        if (!(getSession().getPlatform() instanceof Oracle9Platform)) {
            throw new TestWarningException("Test is only supported on Oracle9 platform and above, as TIMESTAMPTZ is used");
        }
        Oracle9Platform platform = (Oracle9Platform) getSession().getPlatform();

//        this.oldPrintingValue = platform.getPrintCalendarIntoTimestampTZ();
        this.oldBindingValue = platform.shouldBindAllParameters();

//        platform.setPrintCalendarIntoTimestampTZ(Boolean.TRUE);
        platform.setShouldBindAllParameters(true);

        // write myself out
        UnitOfWork uow = getSession().acquireUnitOfWork();
        uow.registerObject(this);
        uow.commit();
    }

    @Override
    public void test() {
        // read data back from database literally in order to check contents of database rather than the driver's TIMESTAMPTZ
        String sql = "select TEST_ID, to_char(TSTZ_DATA,'MM/DD/YYYY hh24:mi:ss TZR') as TSTZ_DATA FROM " +  commonDescriptor().getTableName() +  " where TEST_ID = " + getTestId();
        Vector result = getSession().executeSQL(sql);
        if (result != null & !result.isEmpty()) {
            this.result = (DatabaseRecord) result.firstElement();
        }
    }

    @Override
    public void verify() throws Exception {
        String expectedResult = getOriginalCalendarString();
        if (this.result == null) {
            throw new TestErrorException("Unexpected exception - database returned no data for test id: " + getTestId() + " expected: " + expectedResult);
        }
        String actualResult = (String) result.get("TSTZ_DATA");

        if (!expectedResult.equalsIgnoreCase(actualResult)) {
            throw new TestErrorException("Data from database is not equal for test id: "  + getTestId() + " - got: " + actualResult + " expected: " + expectedResult);
        }
    }

    @Override
    public void reset() {
        // Compatibility for Oracle 9 and above is checked in the setup() method
        Oracle9Platform platform = (Oracle9Platform) getSession().getPlatform();
//        platform.setPrintCalendarIntoTimestampTZ(this.oldPrintingValue);
        platform.setShouldBindAllParameters(this.oldBindingValue);

        // delete myself
        UnitOfWork uow = getSession().acquireUnitOfWork();
        uow.deleteObject(this);
        uow.commit();
    }

    // Calendar formatting behaviour

    protected Calendar formatStringAsCalendar(String calendarString) {
        try {
            String dateOnly = calendarString.substring(0,19);
            String timeZoneStr = calendarString.substring(20,calendarString.length());
            TimeZone timeZone = TimeZone.getTimeZone(timeZoneStr);
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
            simpleDateFormat.setTimeZone(timeZone);
            Date referenceDate = simpleDateFormat.parse(dateOnly.toUpperCase());
            Calendar referenceCalendar = new GregorianCalendar(timeZone);
            referenceCalendar.setTime(referenceDate);
            simpleDateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss z");
            simpleDateFormat.setTimeZone(timeZone);
            return referenceCalendar;
        } catch (ParseException p) {
            throw new TestErrorException("Could not parse Calendar String: " + calendarString);
        }
    }

    // Descriptor and Table information

    private static RelationalDescriptor commonDescriptor() {
        RelationalDescriptor descriptor = new RelationalDescriptor();
    descriptor.setJavaClass(CalendarToTSTZWithBindingTest.class);
    descriptor.setTableName("CALENDARTOTSTZ_BINDING");
    descriptor.setPrimaryKeyFieldName("TEST_ID");
    descriptor.addDirectMapping("testId", "getTestId", "setTestId", "TEST_ID");
        return descriptor;
    }

    public static RelationalDescriptor descriptorWithAccessors() {
        RelationalDescriptor descriptor = commonDescriptor();
    descriptor.addDirectMapping("calendar", "getCalendar", "setCalendar", "TSTZ_DATA");
        return descriptor;
    }

    public static RelationalDescriptor descriptor() {
        RelationalDescriptor descriptor = commonDescriptor();
    descriptor.addDirectMapping("calendar", "TSTZ_DATA");
        return descriptor;
    }

    public static TableDefinition tableDefinition() {
        TableDefinition definition = new TableDefinition();
        definition.setName("CALENDARTOTSTZ_BINDING");
        definition.addField("TEST_ID", Integer.class);
        definition.addField("TSTZ_DATA", TIMESTAMPTZ.class);
        return definition;
    }
}
