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

#ifndef IOTDB_SESSION_C_H
#define IOTDB_SESSION_C_H

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

/* ============================================================
 *  Error Handling
 * ============================================================ */

typedef int64_t TsStatus;

#define TS_OK 0
#define TS_ERR_CONNECTION -1
#define TS_ERR_EXECUTION -2
#define TS_ERR_INVALID_PARAM -3
#define TS_ERR_NULL_PTR -4
#define TS_ERR_UNKNOWN -99

/**
 * Returns the error message from the last failed C API call on the current
 * thread. The returned pointer is valid until the next C API call on the same
 * thread.
 */
const char *ts_get_last_error(void);

/* ============================================================
 *  Opaque Handle Types
 * ============================================================ */

typedef struct CSession_ CSession;
typedef struct CTablet_ CTablet;
typedef struct CSessionDataSet_ CSessionDataSet;
typedef struct CRowRecord_ CRowRecord;

/* ============================================================
 *  Enums  (values match C++ TSDataType / TSEncoding / CompressionType)
 * ============================================================ */

typedef enum {
  TS_TYPE_BOOLEAN = 0,
  TS_TYPE_INT32 = 1,
  TS_TYPE_INT64 = 2,
  TS_TYPE_FLOAT = 3,
  TS_TYPE_DOUBLE = 4,
  TS_TYPE_TEXT = 5,
  TS_TYPE_TIMESTAMP = 8,
  TS_TYPE_DATE = 9,
  TS_TYPE_BLOB = 10,
  TS_TYPE_STRING = 11,
  /** Not a server type; used for invalid arguments / error paths in the C API.
   */
  TS_TYPE_INVALID = 255
} TSDataType_C;

typedef enum {
  TS_ENCODING_PLAIN = 0,
  TS_ENCODING_DICTIONARY = 1,
  TS_ENCODING_RLE = 2,
  TS_ENCODING_DIFF = 3,
  TS_ENCODING_TS_2DIFF = 4,
  TS_ENCODING_BITMAP = 5,
  TS_ENCODING_GORILLA_V1 = 6,
  TS_ENCODING_REGULAR = 7,
  TS_ENCODING_GORILLA = 8,
  TS_ENCODING_ZIGZAG = 9,
  TS_ENCODING_FREQ = 10
} TSEncoding_C;

typedef enum {
  TS_COMPRESSION_UNCOMPRESSED = 0,
  TS_COMPRESSION_SNAPPY = 1,
  TS_COMPRESSION_GZIP = 2,
  TS_COMPRESSION_LZO = 3,
  TS_COMPRESSION_SDT = 4,
  TS_COMPRESSION_PAA = 5,
  TS_COMPRESSION_PLA = 6,
  TS_COMPRESSION_LZ4 = 7,
  TS_COMPRESSION_ZSTD = 8,
  TS_COMPRESSION_LZMA2 = 9
} TSCompressionType_C;

/* ============================================================
 *  Session Lifecycle  —  Tree Model
 * ============================================================ */

CSession *ts_session_new(const char *host, int rpcPort, const char *username,
                         const char *password);

CSession *ts_session_new_with_zone(const char *host, int rpcPort,
                                   const char *username, const char *password,
                                   const char *zoneId, int fetchSize);

CSession *ts_session_new_multi_node(const char *const *nodeUrls, int urlCount,
                                    const char *username, const char *password);

void ts_session_destroy(CSession *session);

TsStatus ts_session_open(CSession *session);

TsStatus ts_session_open_with_compression(CSession *session,
                                          bool enableRPCCompression);

TsStatus ts_session_close(CSession *session);

/* ============================================================
 *  Timezone
 * ============================================================ */

TsStatus ts_session_set_timezone(CSession *session, const char *zoneId);

TsStatus ts_session_get_timezone(CSession *session, char *buf, int bufLen);

/* ============================================================
 *  Database Management  (Tree Model)
 * ============================================================ */

TsStatus ts_session_create_database(CSession *session, const char *database);

TsStatus ts_session_delete_database(CSession *session, const char *database);

TsStatus ts_session_delete_databases(CSession *session,
                                     const char *const *databases, int count);

/* ============================================================
 *  Timeseries Management  (Tree Model)
 * ============================================================ */

TsStatus ts_session_create_timeseries(CSession *session, const char *path,
                                      TSDataType_C dataType,
                                      TSEncoding_C encoding,
                                      TSCompressionType_C compressor);

TsStatus ts_session_create_timeseries_ex(
    CSession *session, const char *path, TSDataType_C dataType,
    TSEncoding_C encoding, TSCompressionType_C compressor, int propsCount,
    const char *const *propKeys, const char *const *propValues, int tagsCount,
    const char *const *tagKeys, const char *const *tagValues, int attrsCount,
    const char *const *attrKeys, const char *const *attrValues,
    const char *measurementAlias);

TsStatus ts_session_create_multi_timeseries(
    CSession *session, int count, const char *const *paths,
    const TSDataType_C *dataTypes, const TSEncoding_C *encodings,
    const TSCompressionType_C *compressors);

TsStatus ts_session_create_aligned_timeseries(
    CSession *session, const char *deviceId, int count,
    const char *const *measurements, const TSDataType_C *dataTypes,
    const TSEncoding_C *encodings, const TSCompressionType_C *compressors);

TsStatus ts_session_check_timeseries_exists(CSession *session, const char *path,
                                            bool *exists);

TsStatus ts_session_delete_timeseries(CSession *session, const char *path);

TsStatus ts_session_delete_timeseries_batch(CSession *session,
                                            const char *const *paths,
                                            int count);

/* ============================================================
 *  Tablet Operations
 * ============================================================ */

CTablet *ts_tablet_new(const char *deviceId, int columnCount,
                       const char *const *columnNames,
                       const TSDataType_C *dataTypes, int maxRowNumber);

void ts_tablet_destroy(CTablet *tablet);

void ts_tablet_reset(CTablet *tablet);

int ts_tablet_get_row_count(CTablet *tablet);

TsStatus ts_tablet_set_row_count(CTablet *tablet, int rowCount);

TsStatus ts_tablet_add_timestamp(CTablet *tablet, int rowIndex,
                                 int64_t timestamp);

TsStatus ts_tablet_add_value_bool(CTablet *tablet, int colIndex, int rowIndex,
                                  bool value);

TsStatus ts_tablet_add_value_int32(CTablet *tablet, int colIndex, int rowIndex,
                                   int32_t value);

TsStatus ts_tablet_add_value_int64(CTablet *tablet, int colIndex, int rowIndex,
                                   int64_t value);

TsStatus ts_tablet_add_value_float(CTablet *tablet, int colIndex, int rowIndex,
                                   float value);

TsStatus ts_tablet_add_value_double(CTablet *tablet, int colIndex, int rowIndex,
                                    double value);

TsStatus ts_tablet_add_value_string(CTablet *tablet, int colIndex, int rowIndex,
                                    const char *value);

/* ============================================================
 *  Data Insertion  —  Tree Model  (Record)
 * ============================================================ */

TsStatus ts_session_insert_record_str(CSession *session, const char *deviceId,
                                      int64_t time, int count,
                                      const char *const *measurements,
                                      const char *const *values);

TsStatus ts_session_insert_record(CSession *session, const char *deviceId,
                                  int64_t time, int count,
                                  const char *const *measurements,
                                  const TSDataType_C *types,
                                  const void *const *values);

TsStatus ts_session_insert_aligned_record_str(CSession *session,
                                              const char *deviceId,
                                              int64_t time, int count,
                                              const char *const *measurements,
                                              const char *const *values);

TsStatus ts_session_insert_aligned_record(CSession *session,
                                          const char *deviceId, int64_t time,
                                          int count,
                                          const char *const *measurements,
                                          const TSDataType_C *types,
                                          const void *const *values);

/* Batch insert — multiple devices (string values) */
TsStatus ts_session_insert_records_str(
    CSession *session, int deviceCount, const char *const *deviceIds,
    const int64_t *times, const int *measurementCounts,
    const char *const *const *measurementsList,
    const char *const *const *valuesList);

TsStatus ts_session_insert_aligned_records_str(
    CSession *session, int deviceCount, const char *const *deviceIds,
    const int64_t *times, const int *measurementCounts,
    const char *const *const *measurementsList,
    const char *const *const *valuesList);

/* Batch insert — multiple devices (typed values) */
TsStatus ts_session_insert_records(CSession *session, int deviceCount,
                                   const char *const *deviceIds,
                                   const int64_t *times,
                                   const int *measurementCounts,
                                   const char *const *const *measurementsList,
                                   const TSDataType_C *const *typesList,
                                   const void *const *const *valuesList);

TsStatus ts_session_insert_aligned_records(
    CSession *session, int deviceCount, const char *const *deviceIds,
    const int64_t *times, const int *measurementCounts,
    const char *const *const *measurementsList,
    const TSDataType_C *const *typesList, const void *const *const *valuesList);

/* Batch insert — single device (typed values) */
TsStatus ts_session_insert_records_of_one_device(
    CSession *session, const char *deviceId, int rowCount, const int64_t *times,
    const int *measurementCounts, const char *const *const *measurementsList,
    const TSDataType_C *const *typesList, const void *const *const *valuesList,
    bool sorted);

TsStatus ts_session_insert_aligned_records_of_one_device(
    CSession *session, const char *deviceId, int rowCount, const int64_t *times,
    const int *measurementCounts, const char *const *const *measurementsList,
    const TSDataType_C *const *typesList, const void *const *const *valuesList,
    bool sorted);

/* ============================================================
 *  Data Insertion  —  Tree Model  (Tablet)
 * ============================================================ */

TsStatus ts_session_insert_tablet(CSession *session, CTablet *tablet,
                                  bool sorted);

TsStatus ts_session_insert_aligned_tablet(CSession *session, CTablet *tablet,
                                          bool sorted);

TsStatus ts_session_insert_tablets(CSession *session, int tabletCount,
                                   const char *const *deviceIds,
                                   CTablet **tablets, bool sorted);

TsStatus ts_session_insert_aligned_tablets(CSession *session, int tabletCount,
                                           const char *const *deviceIds,
                                           CTablet **tablets, bool sorted);

/* ============================================================
 *  Query  —  Tree Model
 * ============================================================ */

TsStatus ts_session_execute_query(CSession *session, const char *sql,
                                  CSessionDataSet **dataSet);

TsStatus ts_session_execute_query_with_timeout(CSession *session,
                                               const char *sql,
                                               int64_t timeoutInMs,
                                               CSessionDataSet **dataSet);

TsStatus ts_session_execute_non_query(CSession *session, const char *sql);

TsStatus ts_session_execute_raw_data_query(CSession *session, int pathCount,
                                           const char *const *paths,
                                           int64_t startTime, int64_t endTime,
                                           CSessionDataSet **dataSet);

TsStatus ts_session_execute_last_data_query(CSession *session, int pathCount,
                                            const char *const *paths,
                                            CSessionDataSet **dataSet);

TsStatus ts_session_execute_last_data_query_with_time(
    CSession *session, int pathCount, const char *const *paths,
    int64_t lastTime, CSessionDataSet **dataSet);

/* ============================================================
 *  SessionDataSet & RowRecord  —  Result Iteration
 * ============================================================ */

void ts_dataset_destroy(CSessionDataSet *dataSet);

/** On failure (null handle, exception), see ts_get_last_error(). */
bool ts_dataset_has_next(CSessionDataSet *dataSet);

/** On failure (null handle, exception), see ts_get_last_error(); nullptr may
 * also mean end of rows. */
CRowRecord *ts_dataset_next(CSessionDataSet *dataSet);

int ts_dataset_get_column_count(CSessionDataSet *dataSet);

const char *ts_dataset_get_column_name(CSessionDataSet *dataSet, int index);

const char *ts_dataset_get_column_type(CSessionDataSet *dataSet, int index);

void ts_dataset_set_fetch_size(CSessionDataSet *dataSet, int fetchSize);

void ts_row_record_destroy(CRowRecord *record);

int64_t ts_row_record_get_timestamp(CRowRecord *record);

int ts_row_record_get_field_count(CRowRecord *record);

bool ts_row_record_is_null(CRowRecord *record, int index);

bool ts_row_record_get_bool(CRowRecord *record, int index);

int32_t ts_row_record_get_int32(CRowRecord *record, int index);

int64_t ts_row_record_get_int64(CRowRecord *record, int index);

float ts_row_record_get_float(CRowRecord *record, int index);

double ts_row_record_get_double(CRowRecord *record, int index);

const char *ts_row_record_get_string(CRowRecord *record, int index);

/** Returns TS_TYPE_INVALID if record is null or index is out of range. */
TSDataType_C ts_row_record_get_data_type(CRowRecord *record, int index);

/* ============================================================
 *  Data Deletion  (Tree Model)
 * ============================================================ */

TsStatus ts_session_delete_data(CSession *session, const char *path,
                                int64_t endTime);

TsStatus ts_session_delete_data_batch(CSession *session, int pathCount,
                                      const char *const *paths,
                                      int64_t endTime);

TsStatus ts_session_delete_data_range(CSession *session, int pathCount,
                                      const char *const *paths,
                                      int64_t startTime, int64_t endTime);

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* IOTDB_SESSION_C_H */
