/*
 * 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_ABSTRACTSESSIONBUILDER_H
#define IOTDB_ABSTRACTSESSIONBUILDER_H

#include <string>

class AbstractSessionBuilder {
public:
  static constexpr const char* DEFAULT_HOST = "localhost";
  static constexpr int DEFAULT_RPC_PORT = 6667;
  static constexpr const char* DEFAULT_USERNAME = "root";
  static constexpr const char* DEFAULT_PASSWORD = "root";
  static constexpr int DEFAULT_FETCH_SIZE = 10000;
  static constexpr int DEFAULT_CONNECT_TIMEOUT_MS = 3 * 1000;
  static constexpr int DEFAULT_MAX_RETRIES = 3;
  static constexpr int DEFAULT_RETRY_DELAY_MS = 500;
  static constexpr const char* DEFAULT_SQL_DIALECT = "tree";
  static constexpr bool DEFAULT_ENABLE_AUTO_FETCH = true;
  static constexpr bool DEFAULT_ENABLE_REDIRECTIONS = true;
  static constexpr bool DEFAULT_ENABLE_RPC_COMPRESSION = false;

  std::string host = DEFAULT_HOST;
  int rpcPort = DEFAULT_RPC_PORT;
  std::string username = DEFAULT_USERNAME;
  std::string password = DEFAULT_PASSWORD;
  std::string zoneId = "";
  int fetchSize = DEFAULT_FETCH_SIZE;
  int connectTimeoutMs = DEFAULT_CONNECT_TIMEOUT_MS;
  int maxRetries = DEFAULT_MAX_RETRIES;
  int retryDelayMs = DEFAULT_RETRY_DELAY_MS;
  std::string sqlDialect = DEFAULT_SQL_DIALECT;
  std::string database = "";
  bool enableAutoFetch = DEFAULT_ENABLE_AUTO_FETCH;
  bool enableRedirections = DEFAULT_ENABLE_REDIRECTIONS;
  bool enableRPCCompression = DEFAULT_ENABLE_RPC_COMPRESSION;
  std::vector<std::string> nodeUrls;
  bool useSSL = false;
  std::string trustCertFilePath;
};

#endif // IOTDB_ABSTRACTSESSIONBUILDER_H