/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.drill.exec.fn.impl;

import org.apache.drill.test.ClusterFixture;
import org.apache.drill.test.ClusterFixtureBuilder;
import org.apache.drill.test.ClusterTest;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TestTimestampAddDiffFunctions extends ClusterTest {

  private final List<String> QUALIFIERS = Arrays.asList(
      "MILLISECOND",
      "MICROSECOND",
      "NANOSECOND",
      "SECOND",
      "MINUTE",
      "HOUR",
      "DAY",
      "WEEK",
      "MONTH",
      "QUARTER",
      "YEAR");

  @BeforeClass
  public static void setup() throws Exception {
    ClusterFixtureBuilder builder = ClusterFixture.builder(dirTestWatcher);
    startCluster(builder);
  }

  @Ignore
  @Test // DRILL-3610
  public void testTimestampAddDiffLiteralTypeInference() throws Exception {
    Map<String, String> dateTypes = new HashMap<>();
    dateTypes.put("DATE", "2013-03-31");
    dateTypes.put("TIME", "00:02:03.123");
    dateTypes.put("TIMESTAMP", "2013-03-31 00:02:03");

    for (String qualifier : QUALIFIERS) {
      for (Map.Entry<String, String> typeResultPair : dateTypes.entrySet()) {
        String dateTimeLiteral = typeResultPair.getValue();
        String type = typeResultPair.getKey();

        run("SELECT TIMESTAMPADD(%s, 0, CAST('%s' AS %s)) col1", qualifier, dateTimeLiteral, type);

        // TIMESTAMPDIFF with args of different types
        for (Map.Entry<String, String> secondArg : dateTypes.entrySet()) {
          run("SELECT TIMESTAMPDIFF(%s, CAST('%s' AS %s), CAST('%s' AS %s)) col1",
              qualifier, dateTimeLiteral, type, secondArg.getValue(), secondArg.getKey());
        }
      }
    }
  }

  @Test // DRILL-3610
  public void testTimestampAddDiffTypeInference() throws Exception {
    for (String qualifier : QUALIFIERS) {
      run("SELECT TIMESTAMPADD(%1$s, 0, `date`) col1," +
                "TIMESTAMPADD(%1$s, 0, `time`) timeReq," +
                "TIMESTAMPADD(%1$s, 0, `timestamp`) timestampReq," +
                "TIMESTAMPADD(%1$s, 0, t.time_map.`date`) dateOpt," +
                "TIMESTAMPADD(%1$s, 0, t.time_map.`time`) timeOpt," +
                "TIMESTAMPADD(%1$s, 0, t.time_map.`timestamp`) timestampOpt\n" +
          "FROM cp.`datetime.parquet` t", qualifier);

      run("SELECT TIMESTAMPDIFF(%1$s, `date`, `date`) col1," +
                "TIMESTAMPDIFF(%1$s, `time`, `time`) timeReq," +
                "TIMESTAMPDIFF(%1$s, `timestamp`, `timestamp`) timestampReq," +
                "TIMESTAMPDIFF(%1$s, `timestamp`, t.time_map.`date`) timestampReqTimestampOpt," +
                "TIMESTAMPDIFF(%1$s, `timestamp`, t.time_map.`timestamp`) timestampReqTimestampOpt," +
                "TIMESTAMPDIFF(%1$s, `date`, `time`) timeDate," +
                "TIMESTAMPDIFF(%1$s, `time`, `date`) Datetime," +
                "TIMESTAMPDIFF(%1$s, t.time_map.`date`, t.time_map.`date`) dateOpt," +
                "TIMESTAMPDIFF(%1$s, t.time_map.`time`, t.time_map.`time`) timeOpt," +
                "TIMESTAMPDIFF(%1$s, t.time_map.`timestamp`, t.time_map.`timestamp`) timestampOpt\n" +
          "FROM cp.`datetime.parquet` t", qualifier);
    }
  }

  @Test // DRILL-3610
  public void testTimestampAddParquet() throws Exception {
    String query =
        "SELECT TIMESTAMPADD(SECOND, 1, `date`) dateReq," +
              "TIMESTAMPADD(QUARTER, 1, `time`) timeReq," +
              "TIMESTAMPADD(DAY, 1, `timestamp`) timestampReq," +
              "TIMESTAMPADD(MONTH, 1, t.time_map.`date`) dateOpt," +
              "TIMESTAMPADD(HOUR, 1, t.time_map.`time`) timeOpt," +
              "TIMESTAMPADD(YEAR, 1, t.time_map.`timestamp`) timestampOpt\n" +
        "FROM cp.`datetime.parquet` t";

    testBuilder()
        .sqlQuery(query)
        .unOrdered()
        .baselineColumns("dateReq", "timeReq", "timestampReq", "dateOpt", "timeOpt", "timestampOpt")
        .baselineValues(
            LocalDateTime.parse("1970-01-11T00:00:01"), LocalTime.parse("00:00:03.600"), LocalDateTime.parse("2018-03-24T17:40:52.123"),
            LocalDateTime.parse("1970-02-11T00:00"), LocalTime.parse("01:00:03.600"), LocalDateTime.parse("2019-03-23T17:40:52.123"))
        .go();
  }

  @Test // DRILL-3610
  public void testTimestampDiffParquet() throws Exception {
    String query =
        "SELECT TIMESTAMPDIFF(SECOND, DATE '1970-01-15', `date`) dateReq," +
            "TIMESTAMPDIFF(QUARTER, TIME '12:00:03.600', `time`) timeReq," +
            "TIMESTAMPDIFF(DAY, TIMESTAMP '2018-03-24 17:40:52.123', `timestamp`) timestampReq," +
            "TIMESTAMPDIFF(MONTH, DATE '1971-10-30', t.time_map.`date`) dateOpt," +
            "TIMESTAMPDIFF(HOUR, TIME '18:00:03.600', t.time_map.`time`) timeOpt," +
            "TIMESTAMPDIFF(YEAR, TIMESTAMP '2020-03-24 17:40:52.123', t.time_map.`timestamp`) timestampOpt\n" +
        "FROM cp.`datetime.parquet` t";

    testBuilder()
        .sqlQuery(query)
        .unOrdered()
        .baselineColumns("dateReq", "timeReq", "timestampReq", "dateOpt", "timeOpt", "timestampOpt")
        .baselineValues(-345600L, 0L, -1L, -21L, -18L, -2L)
        .go();
  }

  @Test // DRILL-3610
  public void testTimestampAddDiffNull() throws Exception {
    String query =
        "SELECT TIMESTAMPDIFF(SECOND, DATE '1970-01-15', a) col1," +
              "TIMESTAMPDIFF(QUARTER, a, DATE '1970-01-15') col2," +
              "TIMESTAMPDIFF(DAY, a, a) col3," +
              "TIMESTAMPADD(MONTH, 1, a) col4," +
              "TIMESTAMPADD(MONTH, b, DATE '1970-01-15') col5," +
              "TIMESTAMPADD(MONTH, b, a) col6\n" +
        "FROM" +
            "(SELECT CASE WHEN FALSE THEN TIME '12:00:03.600' ELSE null END AS a," +
            "CASE WHEN FALSE THEN 2 ELSE null END AS b)";

    testBuilder()
        .sqlQuery(query)
        .unOrdered()
        .baselineColumns("col1", "col2", "col3", "col4", "col5", "col6")
        .baselineValues(null, null, null, null, null, null)
        .go();
  }

  @Test // DRILL-3610
  public void testTimestampDiffTimeDateTransition() throws Exception {
    String query =
        "SELECT TIMESTAMPDIFF(SECOND, time '12:30:00.123', time '12:30:00') col1," +
              "TIMESTAMPDIFF(DAY, TIMESTAMP '1970-01-15 15:30:00', TIMESTAMP '1970-01-16 12:30:00') col2," +
              "TIMESTAMPDIFF(DAY, TIMESTAMP '1970-01-16 12:30:00', TIMESTAMP '1970-01-15 15:30:00') col3," +
              "TIMESTAMPDIFF(MONTH, TIMESTAMP '1970-01-16 12:30:00', TIMESTAMP '1970-03-15 15:30:00') col4," +
              "TIMESTAMPDIFF(MONTH, TIMESTAMP '1970-03-15 15:30:00', TIMESTAMP '1970-01-16 12:30:00') col5," +
              "TIMESTAMPDIFF(DAY, DATE '2012-01-01', DATE '2013-01-01') col6," +
              "TIMESTAMPDIFF(DAY, DATE '2013-01-01', DATE '2014-01-01') col7";

    testBuilder()
        .sqlQuery(query)
        .unOrdered()
        .baselineColumns("col1", "col2", "col3", "col4", "col5", "col6", "col7")
        .baselineValues(0L, 0L, 0L, 1L, -1L, 366L, 365L)
        .go();
  }

  @Test // DRILL-6967
  public void testTimestampDiffQuarter() throws Exception {
    String query =
        "SELECT TIMESTAMPDIFF(QUARTER, date '1996-03-09', date '1998-03-09') AS col1," +
                "TIMESTAMPDIFF(QUARTER, date '2019-01-01', date '2019-01-17') AS col2," +
                "TIMESTAMPDIFF(QUARTER, date '2019-01-01', date '2019-03-31') AS col3," +
                "TIMESTAMPDIFF(QUARTER, date '2019-01-01', date '2019-04-01') AS col4," +
                "TIMESTAMPDIFF(QUARTER, date '1970-01-01', date '2019-01-11') AS col5";

    testBuilder()
        .sqlQuery(query)
        .unOrdered()
        .baselineColumns("col1", "col2", "col3", "col4", "col5")
        .baselineValues(8L, 0L, 0L, 1L, 196L)
        .go();
  }
}
