#ifndef FS_OFD_ATTACHMENTDIRECTORY_H_
#define FS_OFD_ATTACHMENTDIRECTORY_H_

#include "common/fs_common.h"

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

/** 此类表示和OFD附件目录相关的操作。*/
class AttachmentDirectory FS_FINAL : public Base {
 public:
  /** @brief 析构函数。 */
  ~AttachmentDirectory();

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

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

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

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

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

  /**
   * @brief 获取父目录对象。
   *
   * @return 父目录对象。
   */
  AttachmentDirectory GetParentDirectory();

  /**
   * @brief 获取子目录的数量。
   *
   * @return 子目录的数量。
   */
  int GetSubDirectoryCount();

  /**
   * @brief 获取指定索引的子目录对象。
   *
   * @param[in] index  指定的索引。有效范围：从0到(<i>count - 1</i>)。
   *                   <i>count</i>由函数 @link foxit::ofd::AttachmentDirectory::GetSubDirectoryCount @endlink 返回。
   *
   * @return 指定索引的子目录对象。
   */
  AttachmentDirectory GetSubDirectory(int index);

  /**
   * @brief 获取附件的数量。
   *
   * @return 附件的数量。
   */
  int GetAttachmentCount();

  /**
   * @brief 获取指定索引的附件对象。
   *
   * @param[in] index  指定的索引。有效范围：从0到(<i>count - 1</i>)。
   *                   <i>count</i>由函数 @link foxit::ofd::AttachmentDirectory::GetAttachmentCount @endlink 返回。
   *
   * @return 指定索引的附件对象。
   */
  Attachment GetAttachment(int index);

  /**
   * @brief 获取指定ID的附件对象。
   *
   * @param[in] attach_id  指定的附件ID。
   *
   * @return 指定ID的附件对象。
   */
  Attachment GetAttachmentByID(foxit::uint32 attach_id);

  /**
   * @brief 获取目录名称。
   *
   * @return 目录名称。
   */
  String GetName();

  /**
   * @brief 创建子目录。
   *
   * @param[in] dir_name  指定的子目录名称。
   * @param[in] index     指定插入子目录的索引位置。默认值为 -1，表示将子目录添加到末尾。
   *
   * @return 新创建的子目录对象。
   */
  AttachmentDirectory CreateSubDirectory(const String& dir_name, int index = -1);

  /**
   * @brief 删除指定索引的子目录。
   *
   * @param[in] index              指定的索引。有效范围：从0到(<i>count - 1</i>)。
   *                               <i>count</i>由函数 @link foxit::ofd::AttachmentDirectory::GetSubDirectoryCount @endlink 返回。
   * @param[in] delete_attachment  指定是否删除子目录中的附件对象。默认值为 <b>false</b>，表示不删除附件对象。
   *
   * @return <b>true</b> 表示成功，<b>false</b> 表示失败。
   */
  bool RemoveSubDirectory(int index, bool delete_attachment = false);

  /**
   * @brief 删除所有子目录。
   *
   * @param[in] delete_attachment  指定是否删除子目录中的附件对象。默认值为 <b>false</b>，表示不删除附件对象。
   *
   * @return <b>true</b> 表示成功，<b>false</b> 表示失败。
   */
  bool RemoveAllDirectories(bool delete_attachment = false);

  /**
   * @brief 添加附件到当前目录。
   *
   * @param[in] attach_id  指定的附件ID。
   * @param[in] index      指定插入附件的索引位置。默认值为 -1，表示将附件添加到末尾。
   *
   * @return <b>true</b> 表示成功，<b>false</b> 表示失败。
   */
  bool AddAttachment(foxit::uint32 attach_id, int index = -1);

  /**
   * @brief 删除指定索引的附件。
   *
   * @param[in] index  指定的索引。有效范围：从0到(<i>count - 1</i>)。
   *                   <i>count</i>由函数 @link AttachmentDirectory::GetAttachmentCount @endlink 返回。
   *
   * @return <b>true</b> 表示成功，<b>false</b> 表示失败。
   */
  bool RemoveAttachment(int index);

  /**
   * @brief 删除指定ID的附件。
   *
   * @param[in] attach_id  指定的附件ID。
   *
   * @return <b>true</b> 表示成功，<b>false</b> 表示失败。
   */
  bool RemoveAttachmentByID(foxit::uint32 attach_id);

  /**
   * @brief 设置目录名称。
   *
   * @param[in] name  指定的目录名称。
   *
   * @return 无。
   */
  void SetName(const String& name);

  explicit AttachmentDirectory(FS_HANDLE handle);
};

}  // namespace ofd
}  // namespace foxit

#endif  // FS_OFD_ATTACHMENTDIRECTORY_H_
