#ifndef FS_FLD_DOC_H_
#define FS_FLD_DOC_H_

#include "common/fs_common.h"

/**
 * @brief Foxit 命名空间。
 *
 * @details Foxit PDF SDK 的所有定义和类都在此命名空间内定义。
 */
namespace foxit {
/**
 * @brief fld命名空间。
 */
namespace fld {
class FLDPage;

/**
* 此类表示和FLD文档相关的方法。
* 在使用“FLD”模块之前，请确保已通过 @link common::Library::Initialize @endlink 函数成功初始化 Foxit PDF SDK。
* 如果使用FLD打开OFD文档，请确保初始化时使用的密钥包含“OFD”模块。
*
* @详见 @link common::Library @endlink
*/
class FLDDoc FS_FINAL : public Base {
 public:
  /**
   * @brief FLD文档类型枚举类型.
   *
   * @details 该枚举值应单独使用。
   */
  typedef enum _FLDType {
    /** @brief 未知的FLD类型。 */
    e_FLDTypeUnknown  = 0,
    /** @brief PDF类型的FLD文档。 */
    e_FLDTypePDF      = 1,
    /** @brief OFD类型的FLD文档。 */
    e_FLDTypeOFD      = 2
  } FLDType;
  

  /**
   * @brief 构造函数。
   *
   * @param[in] path  FLD文档路径。此路径不应该是空字符串。
   */
  explicit FLDDoc(const char* path);

  /**
   * @brief 构造函数。
   *
   * @param[in] path  FLD文档路径。此路径不应该是空字符串。
   */
  explicit FLDDoc(const wchar_t* path);

  /**
   * @brief 构造函数。
   *
   * @param[in] buffer  FLD文档内存缓冲区。此缓冲区不应该是空指针。
   * @param[in] size    内存缓冲区大小。
   */
  explicit FLDDoc(const void* buffer, size_t size);

  /** @brief 析构函数。 */
  ~FLDDoc();

  /**
   * @brief 构造函数，通过另一个FLD文档对象。
   *
   * @param[in] other  另一个FLD文档对象。
   */
  FLDDoc(const FLDDoc& other);

  /**
   * @brief 赋值操作符。
   *
   * @param[in] other  另一个FLD文档对象，其值将被赋给当前对象。
   *
   * @return 当前对象自身的引用。
   */
  FLDDoc& operator = (const FLDDoc& other);

  /**
   * @brief 相等操作符。
   *
   * @param[in] other  另一个FLD文档对象。此函数将检查当前对象是否等于这个对象。
   *
   * @return <b>true</b> 表示相等，<b>false</b> 表示不相等。
   */
  bool operator == (const FLDDoc& other) const;

  /**
   * @brief 不相等操作符。
   *
   * @param[in] other  另一个FLD文档对象。此函数将检查当前对象是否不等于这个对象。
   *
   * @return <b>true</b> 表示不相等，<b>false</b> 表示相等。
   */
  bool operator != (const FLDDoc& other) const;

  /**
   * @brief 检查当前对象是否为空。
   *
   * @details 当前对象为空时，表示当前对象是无用的。
   *
   * @return <b>true</b> 表示当前对象为空，<b>false</b> 表示不为空。
   */
  bool IsEmpty() const;

  /**
   * @brief 加载FLD文档。
   *
   * @return 错误码，表示加载结果。
   */
  ErrorCode Load(const String& password = "") const;

  /**
   * @brief 获取FLD文档FLD类型。
   *
   * @return FLD文档FLD类型。
   */
  FLDType GetFLDType() const;

  /**
   * @brief 获取FLD文档版本。
   *
   * @return FLD文档版本。
   */
  String GetVersion() const;

  /**
   * @brief 获取FLD文档类型。
   *
   * @return FLD文档类型。
   */
  String GetDocType() const;

  /**
   * @brief 获取FLD文档页面数量。
   *
   * @return FLD文档页面数量。
   */
  int GetPageCount() const;

  /**
   * @brief 获取FLD文档页面。
   *
   * @param[in] page_index 页面索引。有效范围：从0到(<i>count</i>-1)。
   *                       <i>count</i> 由函数 @link FLDDoc::GetPageCount @endlink 返回。
   *
   * @return FLD文档页面对象。
   */
  FLDPage GetPage(int page_index) const;

  /**
   * @brief 保存FLD文档到指定路径。
   *
   * @param[in] path  FLD文档保存路径。此路径不应该是空字符串。
   *
   * @return <b>true</b>表示保存成功，<b>false</b>表示保存失败。
   */
  bool SaveAs(const char* path) const;

  /**
   * @brief 保存FLD文档到指定路径。
   *
   * @param[in] path  FLD文档保存路径。此路径不应该是空字符串。
   *
   * @return <b>true</b>表示保存成功，<b>false</b>表示保存失败。
   */
  bool SaveAs(const wchar_t* path) const;

  // User is strongly recommended NOT to use this method; otherwise unknown situation may occur.
  explicit FLDDoc(FS_HANDLE handle = NULL);
};

}  // namespace fld
}  // namespace foxit

#endif  // FS_FLD_DOC_H_
