#ifndef FS_OFD_PERMISSION_H_
#define FS_OFD_PERMISSION_H_

#include "common/fs_common.h"

/**
 * @brief Foxit 命名空间。
 *
 * @details Foxit PDF SDK 的所有定义和类都在此命名空间内定义。
 */
namespace foxit {
/**
* @brief ofd 命名空间。
*/
namespace ofd {
/** 此类表示和OFD权限相关的操作。*/
class OFDPermission : public Base {
 public:
  /** @brief 析构函数。 */
  ~OFDPermission();

  /**
   * @brief 构造函数，通过另一个OFD权限对象。
   *
   * @param[in] other 另一个OFD权限对象。
   */
  OFDPermission(const OFDPermission& other);

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

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

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

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

  /**
   * @brief 设置是否允许编辑。
   *
   * @param[in]	editable 是否允许编辑。
   *
   * @return 无。
   */
  void EnableEditable(bool editable);

  /**
   * @brief 设置是否允许使用注释。
   *
   * @param[in]	allow_annot 是否允许使用注释。
   *
   * @return 无。
   */
  void EnableAllowAnnot(bool allow_annot);

  /**
   * @brief 设置是否允许导出。
   *
   * @param[in]	exportable 是否允许导出。
   *
   * @return 无。
   */
  void EnableExportable(bool exportable);

  /**
   * @brief 设置是否允许签名或签章。
   *
   * @param[in]	allow_signature 是否允许签名或签章。
   *
   * @return 无。
   */
  void EnableAllowSignature(bool allow_signature);

  /**
   * @brief 设置是否允许使用水印。
   *
   * @param[in]	allow_watermark 是否允许使用水印。
   *
   * @return 无。
   */
  void EnableAllowWatermark(bool allow_watermark);

  /**
   * @brief 设置是否允许打印到屏幕。
   *
   * @param[in]	allow_print_screen 是否允许打印到屏幕。
   *
   * @return 无。
   */
  void EnableAllowPrintScreen(bool allow_print_screen);

  /**
   * @brief 设置是否允许打印。
   *
   * @param[in]	printable 是否允许打印。
   *
   * @return 无。
   */
  void EnablePrintable(bool printable);

  /**
   * @brief 设置允许打印份数。
   *
   * @param[in]	print_copies 打印份数。
   *
   * @return 无。
   */
  void SetPrintCopies(int print_copies);

  /**
   * @brief 设置有效期开始时间。
   *
   * @param[in]	start_date 开始日期。
   *
   * @return 无。
   */
  void SetStartDate(const foxit::DateTime& start_date);

  /**
   * @brief 设置有效期结束日期。
   *
   * @param[in]	expiration_date 结束日期。
   *
   * @return 无。
   */
  void SetExpirationDate(const foxit::DateTime& expiration_date);

  /**
   * @brief 是否允许编辑。
   *
   * @return <true> 表示允许编辑，<b>false</b> 表示不允许编辑。
   */
  bool IsEditable() const;

  /**
   * @brief 是否允许使用注释。
   *
   * @return <true> 表示允许使用注释，<b>false</b> 表示不允许使用注释。
   */
  bool IsAllowAnnot() const;

  /**
   * @brief 是否允许导出。
   *
   * @return <true> 表示允许导出，<b>false</b> 表示不允许导出。
   */
  bool IsExportable() const;

  /**
   * @brief 是否允许使用签名或签章。
   *
   * @return <true> 表示允许使用签名或签章，<b>false</b> 表示不允许使用签名或签章。
   */
  bool IsAllowSignature() const;

  /**
   * @brief 是否允许使用水印。
   *
   * @return <true> 表示允许使用水印，<b>false</b> 表示不允许使用水印。
   */
  bool IsAllowWatermark() const;

  /**
   * @brief 是否允许打印到屏幕。
   *
   * @return <true> 表示允许打印到屏幕，<b>false</b> 表示不允许打印到屏幕。
   */
  bool IsAllowPrintScreen() const;

  /**
   * @brief 是否允许打印。
   *
   * @return <true> 表示允许打印，<b>false</b> 表示不允许打印。
   */
  bool IsPrintable() const;

  /**
   * @brief 获取允许打印的份数。
   *
   * @return 打印份数。
   */
  int GetPrintCopies() const;

  /**
   * @brief 获取有效期开始时间。
   *
   * @return 起始时间。
   */
  foxit::DateTime GetStartDate() const;

  /**
   * @brief 获取有效期截止时间。
   *
   * @return 截止时间。
   */
  foxit::DateTime GetExpirationDate() const;

  explicit OFDPermission(FS_HANDLE handle);
};

}  // namespace ofd
}  // namespace foxit

#endif  // FS_OFD_PERMISSION_H_
