#ifndef FS_OFD_CATALOG_H_
#define FS_OFD_CATALOG_H_

#include "common/fs_common.h"

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

/** 此类表示和OFD目录相关的操作。*/
class Catalog FS_FINAL : public Base {
 public:
  /**
    * @brief OFD目录位置类型定义枚举类型。
    *
    * @details 该枚举值应单独使用。
    */
  typedef enum _CatalogPositionType {
    /** @brief 目录位置：在第一页前新增一页作为目录页。 */
    e_CatalogPositionTypeFirstPage   =  0,
    /** @brief 目录位置：在第二页前新增一页作为目录页。 */
    e_CatalogPositionTypeSecondPage  =  1
  } CatalogPositionType;
  

  /**
   * @brief 构造函数。
   */
  Catalog();

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

  /**
   * @brief 构造函数，通过另一个目录对象。
   *
   * @param[in] other 另一个目录对象。
   */
  Catalog(const Catalog& other);

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

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

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

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

  /**
   * @brief 设置目录边距。
   *
   * @param[in] x_margin  横向边距，单位为毫米。
   * @param[in] y_margin  纵向边距，单位为毫米。
   *
   * @return 无。
   */
  void SetMargin(float x_margin, float y_margin);

  /**
   * @brief 设置目录格式。
   *
   * @param[in] section       章节号，从0开始。
   * @param[in] font_name     字体名称。
   * @param[in] font_size     字体大小，单位为毫米。
   * @param[in] lower_space   行间距，单位为毫米。
   *
   * @return 无。
   */
  void SetFormat(int section, const String& font_name, float font_size, float lower_space);

  /**
   * @brief 设置目录位置。
   *
   * @param[in] type  目录位置类型。请参考从 @link foxit::ofd::Catalog::e_CatalogPositionTypeFirstPage @endlink 开始的值，
   *                  这应该是这些值中的一个。
   *
   * @return 无。
   */
  void SetPosition(CatalogPositionType type);

  /**
   * @brief 添加目录项信息。
   *
   * @param[in] title       目录项标题。
   * @param[in] page_count  目录项对应的页码。
   *
   * @return <b>true</b> 表示成功，<b>false</b> 表示失败。
   */
  bool AddItemInfo(const String& title, int page_count);

  /**
   * @brief 添加目录项信息。
   *
   * @param[in] title       目录项标题。
   * @param[in] page_count  目录项对应的页码。
   * @param[in] x           目录项对应页码的X坐标，单位为毫米。
   * @param[in] y           目录项对应页码的Y坐标，单位为毫米。
   *
   * @return <b>true</b> 表示成功，<b>false</b> 表示失败。
   */
  bool AddItemInfo(const String& title, int page_count, float x, float y);

  /**
   * @brief 添加附件对象目录。
   *
   * @param[in] attachments  附件对象。
   *
   * @return <b>true</b> 表示成功，<b>false</b> 表示失败。
   */
  bool AddAttachment(const Attachments& attachments);

  explicit Catalog(FS_HANDLE handle);
};

}  // namespace ofd
}  // namespace foxit

#endif  // FS_OFD_CATALOG_H_
