#ifndef FS_OFD_OESSEAL_H_
#define FS_OFD_OESSEAL_H_

#include "common/fs_common.h"
#include "common/fs_image.h"

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

  /**
   * @brief 构造函数，通过另一个电子印章对象。
   *
   * @param[in] other 另一个电子印章对象。
   */
  Seal(const Seal& other);

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

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

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

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

  /**
   * @brief 获取电子印章的ID。
   *
   * @return 电子印章的ID。
   */
  String GetID() const;

  /**
   * @brief 获取电子印章的名称。
   *
   * @return 电子印章的名称。
   */
  String GetName() const;

  /**
   * @brief 获取电子印章的版本。
   *
   * @return 电子印章的版本。
   */
  String GetVersion() const;

  /**
   * @brief 获取电子印章的公司名称。
   *
   * @return 电子印章的公司名称。
   */
  String GetCompany() const;

  /**
   * @brief 获取电子印章的扩展信息。
   *
   * @return 电子印章的扩展信息。
   */
  String GetExtend() const;

  /**
   * @brief 获取电子印章的签名方法。
   *
   * @return 电子印章的签名方法。
   */
  String GetSignMethod() const;

  /**
   * @brief 获取电子印章的摘要方法。
   *
   * @return 电子印章的摘要方法。
   */
  String GetDigestMethod() const;

  /**
   * @brief 获取电子印章的图片。
   *
   * @return 电子印章的图片。
   */
  foxit::common::Bitmap GetImage() const;

  /**
   * @brief 获取电子印章图片的宽度。
   *
   * @return 电子印章图片的宽度。
   */
  int GetImageWidth() const;

  /**
   * @brief 获取电子印章图片的高度。
   *
   * @return 电子印章图片的高度。
   */
  int GetImageHeight() const;

  explicit Seal(FS_HANDLE handle);
 };

/** 此类表示和OFD电子印章库相关的操作。 */
class Oes FS_FINAL : public Base {
 public:
  /**
   * @brief 构造函数，通过电子印章库文件路径。
   *
   * @param[in] oes_lib_path  电子印章库文件的完整路径。它不应该是空字符串。
   */
  explicit Oes(const char* oes_lib_path);

  /**
   * @brief 构造函数，通过电子印章库文件路径。
   *
   * @param[in] oes_lib_path  电子印章库文件的完整路径。它不应该是空字符串。
   */
  explicit Oes(const String& oes_lib_path);

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

  /**
   * @brief 构造函数，通过另一个电子印章库对象。
   *
   * @param[in] other 另一个电子印章库对象。
   */
  Oes(const Oes& other);

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

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

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

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

  /**
   * @brief 电子印章库登录。
   *
   * @param[in] passowrd  电子印章库的登录密码。
   *
   * @return <b>true</b> 表示登录成功，<b>false</b> 表示登录失败。
   */
  bool Login(const String& passowrd);

  /**
   * @brief 设置电子印章库的扩展参数。
   *
   * @param[in] param_name   扩展参数名称。
   * @param[in] param_value  扩展参数值。
   *
   * @return <b>true</b>表示设置成功，<b>false</b>表示设置失败。
   */
  bool SetExtendParam(const String& param_name, const String& param_value);

  /**
   * @brief 获取电子印章库的电子印章数量。
   *
   * @return 电子印章数量。
   */
  int GetSealCount() const;

  /**
   * @brief 获取指定索引的电子印章对象。
   *
   * @param[in] index   电子印章的索引。有效范围：从0到(<i>count</i>-1)。
   *                    <i>count</i> 由函数 @link Oes::GetSealCount @endlink 返回。
   *
   * @return 电子印章对象。
   */
  Seal GetSeal(int index) const;

  /**
   * @brief 清空已经加载电子印章列表。
   *
   * @return <b>true</b>表示清除成功，<b>false</b>表示清除失败。
   */
  bool Clear() const;

  /**
   * @brief 获取最后一次错误的错误信息。
   *
   * @return 最后一次错误的错误信息。
   */
  String GetLastErrorMessage() const;

  explicit Oes(FS_HANDLE handle);
};

}  // namespace ofdseal
}  // namespace ofd
}  // namespace foxit

#endif  // _BUILD_OFDSDK_
