/**
 * 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.
 */

#include "TableSession.h"
#include "TableSessionBuilder.h"
#include "catch.hpp"
#include <math.h>

using namespace std;

extern std::shared_ptr<TableSession> session;

static int global_test_tag = 0;

class CaseReporter {
public:
  CaseReporter(const char* caseNameArg) : caseName(caseNameArg) {
    test_tag = global_test_tag++;
    std::cout << "Test " << test_tag << ": " << caseName << std::endl;
  }

  ~CaseReporter() {
    std::cout << "Test " << test_tag << ": " << caseName << " Done" << std::endl << std::endl;
  }

private:
  const char* caseName;
  int test_tag;
};

TEST_CASE("Create table success", "[createTable]") {
  // REQUIRE(true);
  CaseReporter cr("createTable");
  session->executeNonQueryStatement("DROP DATABASE IF EXISTS db1");
  session->executeNonQueryStatement("CREATE DATABASE db1");
  session->executeNonQueryStatement("DROP DATABASE IF EXISTS db2");
  session->executeNonQueryStatement("CREATE DATABASE db2");
  session->executeNonQueryStatement("USE \"db1\"");
  session->executeNonQueryStatement("CREATE TABLE table0 ("
                                    "tag1 string tag,"
                                    "attr1 string attribute,"
                                    "m1 double field)");
  unique_ptr<SessionDataSet> sessionDataSet = session->executeQueryStatement("SHOW TABLES");
  sessionDataSet->setFetchSize(1024);
  bool tableExist = false;
  while (sessionDataSet->hasNext()) {
    if (sessionDataSet->next()->fields[0].stringV.value() == "table0") {
      tableExist = true;
      break;
    }
  }
  REQUIRE(tableExist == true);
}

TEST_CASE("Test TableSession builder with nodeUrls", "[SessionBuilderInit]") {
  CaseReporter cr("TableSessionInitWithNodeUrls");

  std::vector<std::string> nodeUrls = {"127.0.0.1:6667"};
  auto builder = std::unique_ptr<TableSessionBuilder>(new TableSessionBuilder());
  std::shared_ptr<TableSession> session = std::shared_ptr<TableSession>(
      builder->username("root")->password("root")->nodeUrls(nodeUrls)->build());
  session->open();

  session->executeNonQueryStatement("DROP DATABASE IF EXISTS db1");
  session->executeNonQueryStatement("CREATE DATABASE db1");
  session->executeNonQueryStatement("DROP DATABASE IF EXISTS db2");
  session->executeNonQueryStatement("CREATE DATABASE db2");

  session->close();
}

TEST_CASE("Test insertRelationalTablet", "[testInsertRelationalTablet]") {
  CaseReporter cr("testInsertRelationalTablet");
  session->executeNonQueryStatement("CREATE DATABASE IF NOT EXISTS db1");
  session->executeNonQueryStatement("USE db1");
  session->executeNonQueryStatement("DROP TABLE IF EXISTS table1");
  session->executeNonQueryStatement("CREATE TABLE table1 ("
                                    "tag1 string tag,"
                                    "attr1 string attribute,"
                                    "m1 double field)");
  vector<pair<string, TSDataType::TSDataType>> schemaList;
  schemaList.push_back(make_pair("tag1", TSDataType::TEXT));
  schemaList.push_back(make_pair("attr1", TSDataType::TEXT));
  schemaList.push_back(make_pair("m1", TSDataType::DOUBLE));
  vector<ColumnCategory> columnTypes = {ColumnCategory::TAG, ColumnCategory::ATTRIBUTE,
                                        ColumnCategory::FIELD};

  int64_t timestamp = 0;
  Tablet tablet("table1", schemaList, columnTypes, 15);

  for (int row = 0; row < 15; row++) {
    int rowIndex = tablet.rowSize++;
    tablet.timestamps[rowIndex] = timestamp + row;
    string data = "tag:";
    data += to_string(row);
    tablet.addValue(0, rowIndex, data);
    data = "attr:";
    data += to_string(row);
    tablet.addValue(1, rowIndex, data);
    double value = row * 1.1;
    tablet.addValue(2, rowIndex, value);
    if (tablet.rowSize == tablet.maxRowNumber) {
      session->insert(tablet, true);
      tablet.reset();
    }
  }

  if (tablet.rowSize != 0) {
    session->insert(tablet, true);
    tablet.reset();
  }
  session->executeNonQueryStatement("FLUSH");

  int cnt = 0;
  unique_ptr<SessionDataSet> sessionDataSet =
      session->executeQueryStatement("SELECT * FROM table1 order by time");
  while (sessionDataSet->hasNext()) {
    auto rowRecord = sessionDataSet->next();
    REQUIRE(rowRecord->fields[1].stringV.value() == string("tag:") + to_string(cnt));
    REQUIRE(rowRecord->fields[2].stringV.value() == string("attr:") + to_string(cnt));
    REQUIRE(fabs(rowRecord->fields[3].doubleV.value() - cnt * 1.1) < 0.0001);
    cnt++;
  }
  REQUIRE(cnt == 15);
}

TEST_CASE("Query non-existent table returns detailed error", "[queryMissingTableError]") {
  CaseReporter cr("queryMissingTableError");
  session->executeNonQueryStatement("CREATE DATABASE IF NOT EXISTS db1");
  session->executeNonQueryStatement("USE db1");
  session->executeNonQueryStatement("DROP TABLE IF EXISTS table_not_exists_for_query");

  bool caught = false;
  try {
    session->executeQueryStatement("SELECT * FROM table_not_exists_for_query");
  } catch (const std::exception& e) {
    caught = true;
    const std::string errorMessage = e.what();
    INFO("caught error message: " << errorMessage);
    const bool hasDetailedErrorMessage =
        errorMessage.size() > 20 && errorMessage.find("std::exception") == std::string::npos;
    REQUIRE(errorMessage != "std::exception");
    REQUIRE(hasDetailedErrorMessage);
  }
  REQUIRE(caught);
}

TEST_CASE("Test RelationalTabletTsblockRead", "[testRelationalTabletTsblockRead]") {
  CaseReporter cr("testRelationalTabletTsblockRead");
  session->executeNonQueryStatement("CREATE DATABASE IF NOT EXISTS db1");
  session->executeNonQueryStatement("USE db1");
  session->executeNonQueryStatement("DROP TABLE IF EXISTS table1");
  session->executeNonQueryStatement("CREATE TABLE table1 ("
                                    "field1 BOOLEAN field,"
                                    "field2 INT32 field,"
                                    "field3 INT64 field,"
                                    "field4 FLOAT field,"
                                    "field5 DOUBLE field,"
                                    "field6 TEXT field,"
                                    "field7 TIMESTAMP field,"
                                    "field8 DATE field,"
                                    "field9 BLOB field,"
                                    "field10 STRING field)");

  vector<pair<string, TSDataType::TSDataType>> schemaList;
  schemaList.push_back(make_pair("field1", TSDataType::BOOLEAN));
  schemaList.push_back(make_pair("field2", TSDataType::INT32));
  schemaList.push_back(make_pair("field3", TSDataType::INT64));
  schemaList.push_back(make_pair("field4", TSDataType::FLOAT));
  schemaList.push_back(make_pair("field5", TSDataType::DOUBLE));
  schemaList.push_back(make_pair("field6", TSDataType::TEXT));
  schemaList.push_back(make_pair("field7", TSDataType::TIMESTAMP));
  schemaList.push_back(make_pair("field8", TSDataType::DATE));
  schemaList.push_back(make_pair("field9", TSDataType::BLOB));
  schemaList.push_back(make_pair("field10", TSDataType::STRING));

  vector<ColumnCategory> columnTypes(10, ColumnCategory::FIELD);

  int64_t timestamp = 0;
  int maxRowNumber = 50000;
  Tablet tablet("table1", schemaList, columnTypes, maxRowNumber);

  for (int row = 0; row < maxRowNumber; row++) {
    int rowIndex = tablet.rowSize++;
    tablet.timestamps[rowIndex] = timestamp + row;
    tablet.addValue(0, rowIndex, row % 2 == 0);
    tablet.addValue(1, rowIndex, static_cast<int32_t>(row));
    tablet.addValue(2, rowIndex, static_cast<int64_t>(timestamp));
    tablet.addValue(3, rowIndex, static_cast<float>(row * 1.1f));
    tablet.addValue(4, rowIndex, static_cast<double>(row * 1.1f));
    tablet.addValue(5, rowIndex, "text_" + to_string(row));
    tablet.addValue(6, rowIndex, static_cast<int64_t>(timestamp));
    tablet.addValue(7, rowIndex, boost::gregorian::date(2025, 5, 15));
    tablet.addValue(8, rowIndex, "blob_" + to_string(row));
    tablet.addValue(9, rowIndex, "string_" + to_string(row));

    if (row % 2 == 0) {
      for (int col = 0; col <= 9; col++) {
        tablet.bitMaps[col].mark(row);
      }
    }

    if (tablet.rowSize == tablet.maxRowNumber) {
      session->insert(tablet, true);
      tablet.reset();
    }
  }

  if (tablet.rowSize != 0) {
    session->insert(tablet, true);
    tablet.reset();
  }
  session->executeNonQueryStatement("FLUSH");

  unique_ptr<SessionDataSet> sessionDataSet =
      session->executeQueryStatement("SELECT * FROM table1 order by time");
  auto dataIter = sessionDataSet->getIterator();
  int rowNum = 0;
  timestamp = 0;
  while (dataIter.next()) {
    if (rowNum % 2 == 0) {
      REQUIRE_FALSE(dataIter.getBooleanByIndex(2).is_initialized());
      REQUIRE_FALSE(dataIter.getIntByIndex(3).is_initialized());
      REQUIRE_FALSE(dataIter.getLongByIndex(4).is_initialized());
      REQUIRE_FALSE(dataIter.getFloatByIndex(5).is_initialized());
      REQUIRE_FALSE(dataIter.getDoubleByIndex(6).is_initialized());
      REQUIRE_FALSE(dataIter.getStringByIndex(7).is_initialized());
      REQUIRE_FALSE(dataIter.getTimestampByIndex(8).is_initialized());
      REQUIRE_FALSE(dataIter.getDateByIndex(9).is_initialized());
      REQUIRE_FALSE(dataIter.getStringByIndex(10).is_initialized());
      REQUIRE_FALSE(dataIter.getStringByIndex(11).is_initialized());
    } else {
      REQUIRE(dataIter.getLongByIndex(1).value() == timestamp + rowNum);
      REQUIRE(dataIter.getBooleanByIndex(2).value() == (rowNum % 2 == 0));
      REQUIRE(dataIter.getIntByIndex(3).value() == static_cast<int32_t>(rowNum));
      REQUIRE(dataIter.getLongByIndex(4).value() == static_cast<int64_t>(timestamp));
      REQUIRE(fabs(dataIter.getFloatByIndex(5).value() - rowNum * 1.1f) < 0.1f);
      REQUIRE(fabs(dataIter.getDoubleByIndex(6).value() - rowNum * 1.1f) < 0.1);
      REQUIRE(dataIter.getStringByIndex(7).value() == "text_" + to_string(rowNum));
      REQUIRE(dataIter.getTimestampByIndex(8).value() == static_cast<int64_t>(timestamp));
      REQUIRE(dataIter.getDateByIndex(9).value() == boost::gregorian::date(2025, 5, 15));
      REQUIRE(dataIter.getStringByIndex(10).value() == "blob_" + to_string(rowNum));
      REQUIRE(dataIter.getStringByIndex(11).value() == "string_" + to_string(rowNum));
    }
    rowNum++;
  }
  REQUIRE(rowNum == maxRowNumber);

  sessionDataSet = session->executeQueryStatement("SELECT * FROM table1 order by time");
  rowNum = 0;
  timestamp = 0;
  while (sessionDataSet->hasNext()) {
    auto record = sessionDataSet->next();
    if (rowNum % 2 == 0) {
      REQUIRE_FALSE(record->fields[1].boolV.is_initialized());
      REQUIRE_FALSE(record->fields[2].intV.is_initialized());
      REQUIRE_FALSE(record->fields[3].longV.is_initialized());
      REQUIRE_FALSE(record->fields[4].floatV.is_initialized());
      REQUIRE_FALSE(record->fields[5].doubleV.is_initialized());
      REQUIRE_FALSE(record->fields[6].stringV.is_initialized());
      REQUIRE_FALSE(record->fields[7].longV.is_initialized());
      REQUIRE_FALSE(record->fields[8].dateV.is_initialized());
      REQUIRE_FALSE(record->fields[9].stringV.is_initialized());
      REQUIRE_FALSE(record->fields[10].stringV.is_initialized());
    } else {
      REQUIRE(record->fields[1].boolV.value() == (rowNum % 2 == 0));
      REQUIRE(record->fields[2].intV.value() == static_cast<int32_t>(rowNum));
      REQUIRE(record->fields[3].longV.value() == static_cast<int64_t>(timestamp));
      REQUIRE(fabs(record->fields[4].floatV.value() - rowNum * 1.1f) < 0.1f);
      REQUIRE(fabs(record->fields[5].doubleV.value() - rowNum * 1.1f) < 0.1);
      REQUIRE(record->fields[6].stringV.value() == "text_" + to_string(rowNum));
      REQUIRE(record->fields[7].longV.value() == static_cast<int64_t>(timestamp));
      REQUIRE(record->fields[8].dateV.value() == boost::gregorian::date(2025, 5, 15));
      REQUIRE(record->fields[9].stringV.value() == "blob_" + to_string(rowNum));
      REQUIRE(record->fields[10].stringV.value() == "string_" + to_string(rowNum));
    }
    rowNum++;
  }
  REQUIRE(rowNum == maxRowNumber);
}
