/*
 * 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:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.oxm.mappings.typeddirect;

import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import java.util.Vector;
import java.io.StringReader;
import java.text.SimpleDateFormat;

import org.eclipse.persistence.internal.helper.Helper;
import org.eclipse.persistence.testing.oxm.mappings.XMLMappingTestCases;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;

public class TypedDirectMappingTestCases extends XMLMappingTestCases {

    private static final String DATE_FORMAT = "yyyy-MM-dd";
    private static final String TIME_FORMAT = "HH:mm:ss";
    private static final String DATE_TIME_FORMAT = DATE_FORMAT + "'T'" + TIME_FORMAT;

    private static final String CONTROL_XML_DOCUMENT;

    static {
        CONTROL_XML_DOCUMENT = "<?xml version = '1.0' encoding = 'UTF-8'?>" +
                "<test-object>" +
                "<binary>MTIzNDU2Nzg5</binary>" +
                "<binary>313233343536373839</binary>" +
                "<date>2013-02-17</date>" +
                "<time>23:21:00</time>" +
                "<date-time>2013-02-17T23:21:00</date-time>" +
                "<date-vector>" +
                "<date-element>2013-02-17</date-element>" +
                "<date-element>2013-04-09</date-element>" +
                "<date-element>2013-04-18</date-element>" +
                "</date-vector>" +
                "<time-vector>" +
                "<time-element>23:21:00</time-element>" +
                "<time-element>23:58:00</time-element>" +
                "<time-element>06:00:00</time-element>" +
                "</time-vector>" +
                "<date-time-vector>" +
                "<date-time-element>2013-02-17T23:21:00</date-time-element>" +
                "<date-time-element>2013-04-09T23:58:00</date-time-element>" +
                "<date-time-element>2013-04-18T06:00:00</date-time-element>" +
                "</date-time-vector>" +
                "<base-64-vector>" +
                "<base-64-element>MTEx</base-64-element>" +
                "<base-64-element>MjIy</base-64-element>" +
                "<base-64-element>MzMz</base-64-element>" +
                "</base-64-vector>" +
                "<hex-vector>" +
                "<hex-element>313131</hex-element>" +
                "<hex-element>323232</hex-element>" +
                "<hex-element>333333</hex-element>" +
                "</hex-vector>" +
                "<untyped-date>2013-02-20T01:00:00"+TIMEZONE_OFFSET+"</untyped-date>" +
                "<typed-date>2013-02-20</typed-date>" +
                "<untyped-sql-date>2013-02-20</untyped-sql-date>" +
                "<typed-sql-date>2013-02-20</typed-sql-date>" +
                "<untyped-timestamp>2013-02-20T01:00:00"+TIMEZONE_OFFSET+"</untyped-timestamp>" +
                "<typed-timestamp>01:00:00"+(TIMEZONE_OFFSET.equals("Z") ? "+01:00" : TIMEZONE_OFFSET)
                +"</typed-timestamp>" +
                "</test-object>";
    }

    public TypedDirectMappingTestCases(String name) throws Exception {
        super(name);
        // Bug #454154 - TypedDirectMappingTestCases were failing on test farm which run oxms tests in order strange
        // to default eclipselink oxm tests repo order. -> The following line ensures the same time zone is always
        // used for these test cases and that these test cases will pass on farm when they pass on eclipselink repo.
        TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));

        setProject(new TypedDirectMappingTestProject());
    }

    @Override
    public Object getControlObject() {
        try {
            String base64 = "123456789";
            String hex = "123456789";
            Calendar time, time2, time3, date, date2, date3, dateTime, dateTime2, dateTime3;
            Vector hexAndBase64Vector, timeVector, dateVector, dateTimeVector;
            Date typedDate, untypedDate;
            java.sql.Date typedSqlDate, untypedSqlDate;
            java.sql.Timestamp typedTimestamp, untypedTimestamp;

            hexAndBase64Vector = new Vector();
            hexAndBase64Vector.addElement(new String("111").getBytes());
            hexAndBase64Vector.addElement(new String("222").getBytes());
            hexAndBase64Vector.addElement(new String("333").getBytes());

            Date parsedDate = new SimpleDateFormat(TIME_FORMAT).parse("23:21:00");
            time = Calendar.getInstance();
            time.setTime(parsedDate); time.clear(Calendar.YEAR); time.clear(Calendar.MONTH); time.clear(Calendar.DATE); time.clear(Calendar.ZONE_OFFSET);
            parsedDate = new SimpleDateFormat(TIME_FORMAT).parse("23:58:00");
            time2 = Calendar.getInstance();
            time2.setTime(parsedDate); time2.clear(Calendar.YEAR); time2.clear(Calendar.MONTH); time2.clear(Calendar.DATE); time2.clear(Calendar.ZONE_OFFSET);
            parsedDate = new SimpleDateFormat(TIME_FORMAT).parse("06:00:00");
            time3 = Calendar.getInstance();
            time3.setTime(parsedDate); time3.clear(Calendar.YEAR); time3.clear(Calendar.MONTH); time3.clear(Calendar.DATE); time3.clear(Calendar.ZONE_OFFSET);

            parsedDate = new SimpleDateFormat(DATE_FORMAT).parse("2013-02-17");
            date = Calendar.getInstance();
            date.setTime(parsedDate); date.clear(Calendar.HOUR); date.clear(Calendar.MINUTE); date.clear(Calendar.SECOND); date.clear(Calendar.MILLISECOND); date.clear(Calendar.ZONE_OFFSET);
            parsedDate = new SimpleDateFormat(DATE_FORMAT).parse("2013-04-09");
            date2 = Calendar.getInstance();
            date2.setTime(parsedDate); date2.clear(Calendar.HOUR); date2.clear(Calendar.MINUTE); date2.clear(Calendar.SECOND); date2.clear(Calendar.MILLISECOND); date2.clear(Calendar.ZONE_OFFSET);
            parsedDate = new SimpleDateFormat(DATE_FORMAT).parse("2013-04-18");
            date3 = Calendar.getInstance();
            date3.setTime(parsedDate); date3.clear(Calendar.HOUR); date3.clear(Calendar.MINUTE); date3.clear(Calendar.SECOND); date3.clear(Calendar.MILLISECOND); date3.clear(Calendar.ZONE_OFFSET);

            parsedDate = new SimpleDateFormat(DATE_TIME_FORMAT).parse("2013-02-17T23:21:00");
            dateTime = Calendar.getInstance(); dateTime.clear();
            dateTime.setTime(parsedDate);
            dateTime.clear(Calendar.ZONE_OFFSET);
            parsedDate = new SimpleDateFormat(DATE_TIME_FORMAT).parse("2013-04-09T23:58:00");
            dateTime2 = Calendar.getInstance(); dateTime2.clear();
            dateTime2.setTime(parsedDate);
            dateTime2.clear(Calendar.ZONE_OFFSET);
            parsedDate = new SimpleDateFormat(DATE_TIME_FORMAT).parse("2013-04-18T06:00:00");
            dateTime3 = Calendar.getInstance(); dateTime3.clear();
            dateTime3.setTime(parsedDate);
            dateTime3.clear(Calendar.ZONE_OFFSET);

            typedDate = new SimpleDateFormat(DATE_FORMAT).parse("2013-02-20");
            untypedDate = new SimpleDateFormat(DATE_TIME_FORMAT).parse("2013-02-20T01:00:00");
            typedSqlDate = Helper.sqlDateFromUtilDate(typedDate);
            untypedSqlDate = Helper.sqlDateFromUtilDate(untypedDate);


            untypedTimestamp = Helper.timestampFromDate(untypedDate);
            // use DATE_TIME_FORMAT to account for daylight savings
            typedTimestamp = Helper.timestampFromDate(new SimpleDateFormat(DATE_TIME_FORMAT).parse("2013-02-20T01:00:00"));

            dateVector = new Vector();
            dateVector.addElement(date);
            dateVector.addElement(date2);
            dateVector.addElement(date3);

            timeVector = new Vector();
            timeVector.addElement(time);
            timeVector.addElement(time2);
            timeVector.addElement(time3);

            dateTimeVector = new Vector();
            dateTimeVector.addElement(dateTime);
            dateTimeVector.addElement(dateTime2);
            dateTimeVector.addElement(dateTime3);

            TestObject testObject = new TestObject();
            testObject.setBase64(base64.getBytes());
            testObject.setHex(hex.getBytes());
            testObject.setDate(date);
            testObject.setTime(time);
            testObject.setDateTime(dateTime);
            testObject.setBase64Vector(hexAndBase64Vector);
            testObject.setHexVector(hexAndBase64Vector);
            testObject.setDateVector(dateVector);
            testObject.setTimeVector(timeVector);
            testObject.setDateTimeVector(dateTimeVector);
            testObject.setUntypedDate(untypedDate);
            testObject.setTypedDate(typedDate);
            testObject.setUntypedSqlDate(untypedSqlDate);
            testObject.setTypedSqlDate(typedSqlDate);
            testObject.setUntypedTimestamp(untypedTimestamp);
            testObject.setTypedTimestamp(typedTimestamp);

            return testObject;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    protected Document getControlDocument() {
        StringReader reader = new StringReader(CONTROL_XML_DOCUMENT);
        InputSource is = new InputSource(reader);
        Document doc = null;
        try {
            doc = parser.parse(is);
        } catch (Exception e) {
            fail("An error occurred setting up the control document");
        }
        return doc;
    }

    @Override
    public boolean isUnmarshalTest() {
        return false;
    }

}
