#ifndef COS_SYS_CONF_H
#define COS_SYS_CONF_H
#include <stdint.h>

#include "cos_defines.h"
#include "util/log_util.h"

namespace qcloud_cos {

class CosSysConfig {
 public:
  /// \brief 设置签名超时时间,单位:秒
  static void SetAuthExpiredTime(uint64_t time);

  /// \brief 设置本地时间与网络时间差值
  static void SetTimeStampDelta(int64_t dela);

  /// \brief 设置连接超时时间,单位:毫秒
  static void SetConnTimeoutInms(uint64_t time);

  /// \brief 设置接收超时时间,单位:毫秒
  static void SetRecvTimeoutInms(uint64_t time);

  /// \brief 设置上传分片大小,单位:字节,默认:10M
  static void SetUploadPartSize(uint64_t part_size);

  /// \brief 获取上传复制分片大小,单位:字节,默认: 20M
  static void SetUploadCopyPartSize(uint64_t part_size);

  /// \brief 设置文件分片并发上传线程池大小,默认: 5
  static void SetUploadThreadPoolSize(unsigned size);

  /// \brief 设置异步上传下载线程池大小,默认: 2
  static void SetAsynThreadPoolSize(unsigned size);

  /// \brief 设置log输出,1:屏幕,2:syslog,3:不输出,默认:1
  static void SetLogOutType(LOG_OUT_TYPE log);

  /// \brief 设置log输出等级,COS_LOG_ERR/WRAN/INFO/DBG
  static void SetLogLevel(LOG_LEVEL level);

  /// \brief 设置下载线程池的大小
  static void SetDownThreadPoolSize(unsigned size);

  /// \brief 设置下载分片的大小
  static void SetDownSliceSize(unsigned slice_size);

  /// \brief 设置长连接的参数
  static void SetKeepAlive(bool keepalive);

  /// \brief 设置长连接的参数
  static void SetKeepIdle(int64_t keepidle);

  /// \brief 设置长连接的参数
  static void SetKeepIntvl(int64_t keepintvl);

  static void SetDestDomain(const std::string& dest_domain);

  /// \brief 获取签名超时时间,单位秒
  static uint64_t GetAuthExpiredTime();

  /// \brief 获取本地时间与网络时间差值
  static int64_t GetTimeStampDelta();

  /// \brief 获取连接超时时间,单位:毫秒
  static uint64_t GetConnTimeoutInms();

  /// \brief 获取接收超时时间,单位:毫秒
  static uint64_t GetRecvTimeoutInms();

  /// \brief 获取上传分片大小,单位:字节
  static uint64_t GetUploadPartSize();

  /// \brief 获取上传复制分片大小,单位:字节
  static uint64_t GetUploadCopyPartSize();

  /// \brief 获取上传线程池大小
  static unsigned GetUploadThreadPoolSize();

  /// \brief 获取异步线程池大小
  static unsigned GetAsynThreadPoolSize();

  /// \brief 获取日志输出类型,默认输出到屏幕
  static int GetLogOutType();

  /// \brief 获取日志输出等级
  static int GetLogLevel();

  /// \brief 打印CosSysConfig的配置详情
  static void PrintValue();

  /// \brief 获取下载分片大小
  static unsigned GetDownSliceSize();

  /// \brief 获取下载线程池大小
  static unsigned GetDownThreadPoolSize();

  /// \brief 获取keepalive参数
  static bool GetKeepAlive();
  static int64_t GetKeepIdle();
  static int64_t GetKeepIntvl();

  /// \brief 下载过程中是否检查MD5
  static bool IsCheckMd5();

  /// \brief 设置下载过程中检查MD5
  static void SetCheckMd5(bool is_check_md5);

  static bool IsDomainSameToHost();

  static void SetDomainSameToHost(bool is_domain_same_to_host);

  /// \brief 根据传入appid、region、bucket_name返回对应的hostname
  static std::string GetHost(uint64_t app_id, const std::string& region,
                             const std::string& bucket_name);

  /// \brief 获取CI域名
  static std::string GetCIHost(const std::string& bucket_name,
                               const std::string& region);

  /// \brief 获取PIC域名                            
  static std::string GetPICHost(uint64_t app_id, const std::string& region,
                                  const std::string& bucket_name);

  static std::string GetDestDomain();

  /// \brief 获取是否使用特定ip和端口号
  static bool IsUseIntranet();

  static void SetIsUseIntranet(bool is_use_interanet);

  static void SetIntranetAddr(const std::string& intranet_addr);

  /// \brief 获取特定ip和端口号
  static std::string GetIntranetAddr();

  /// \brief 获取日志回调函数
  static LogCallback GetLogCallback();

  /// \brief 设置日志回调
  static void SetLogCallback(const LogCallback log_callback);

  /// \brief 设置是否使用dns cache
  static void SetUseDnsCache(bool is_use_dns_cache);

  /// \brief 获取是否使用dns cache
  static bool GetUseDnsCache();

  /// \brief 设置dns cache过期时间
  static void SetDnsCacheExpireSeconds(unsigned expire_secondes);

  /// \brief 获取dns cache过期时间
  static unsigned GetDnsCacheExpireSeconds();

  /// \breif 设置dns cache大小
  static void SetDnsCacheSize(unsigned cache_size);

  /// \brief 获取dns cache大小
  static unsigned GetDnsCacheSize();

 private:
  // 打印日志:0,不打印,1:打印到屏幕,2:打印到syslog
  static LOG_OUT_TYPE m_log_outtype;
  // 日志级别:1: ERR, 2: WARN, 3:INFO, 4:DBG
  static LOG_LEVEL m_log_level;
  // 上传分片大小
  static uint64_t m_upload_part_size;
  // 上传分片大小
  static uint64_t m_upload_copy_part_size;
  // 本地时间戳与网络时间服务器时间戳的差值，计算方法：
  // delta = network_ts - local_ts
  static int64_t m_timestamp_delta;
  // 签名超时时间(秒)
  static uint64_t m_sign_expire_in_s;
  // Http连接超时时间(毫秒)
  static uint64_t m_conn_timeout_in_ms;
  // Http接收超时时间(毫秒)
  static uint64_t m_recv_timeout_in_ms;
  // 单文件分片并发上传线程池大小(每个文件一个)
  static unsigned m_threadpool_size;
  // 异步上传下载线程池大小(全局就一个)
  static unsigned m_asyn_threadpool_size;
  // 下载文件到本地线程池大小
  static unsigned m_down_thread_pool_size;
  // 下载文件到本地,每次下载字节数
  static unsigned m_down_slice_size;
  // 是否开启长连接
  static bool m_keep_alive;
  // 空闲多久后，发送keepalive探针，单位s
  static int64_t m_keep_idle;
  // 每个keepalive探针时间间隔，单位s
  static int64_t m_keep_intvl;
  // 下载时是否检查md5
  static bool m_is_check_md5;

  static std::string m_dest_domain;

  static bool m_is_domain_same_to_host;

  static bool m_is_use_intranet;

  static std::string m_intranet_addr;
  // 日志回调
  static LogCallback m_log_callback;
  // 是否使用dns cache
  static bool m_use_dns_cache;
  // dns cache过期时间
  static unsigned m_dns_cache_expire_seconds;
  // dns cache大小
  static unsigned m_dns_cache_size;
};

}  // namespace qcloud_cos
#endif
