#ifndef FS_OFD_TEXTSEARCH_H_
#define FS_OFD_TEXTSEARCH_H_

#include "common/fs_common.h"

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

/** 此类表示OFD文本搜索结果信息。*/
class TextSearchResultInfo FS_FINAL : public Object {
 public:
  /**
   * @brief 带参数的构造函数。
   *
   * @param[in] doc_index       文档索引。
   * @param[in] page_id         页面ID。
   * @param[in] page_index      页面索引。
   * @param[in] rect_size       矩形数量。
   * @param[in] char_info_pos   字符信息起始位置。
   * @param[in] char_info_size  字符信息数量。
   */
  explicit TextSearchResultInfo(int doc_index, foxit::uint32 page_id, int page_index, int rect_size, int char_info_pos, int char_info_size) :
    doc_index(doc_index),
    page_id(page_id),
    page_index(page_index),
    rect_size(rect_size),
    char_info_pos(char_info_pos),
    char_info_size(char_info_size) {}

  /**
   * @brief 构造函数，通过另一个文本搜索结果信息对象。
   *
   * @param[in] other  另一个文本搜索结果信息对象。
   */
  TextSearchResultInfo(const TextSearchResultInfo& other) {
    this->doc_index = other.doc_index;
    this->page_id = other.page_id;
    this->page_index = other.page_index;
    this->rect_size = other.rect_size;
    this->char_info_pos = other.char_info_pos;
    this->char_info_size = other.char_info_size;
  }

  /**
   * @brief 赋值操作符。
   *
   * @param[in] other  另一个文本搜索结果信息对象，其值将被赋给当前对象。
   *
   * @return 当前对象自身的引用。
   */
  TextSearchResultInfo& operator = (const TextSearchResultInfo& other) {
    this->doc_index = other.doc_index;
    this->page_id = other.page_id;
    this->page_index = other.page_index;
    this->rect_size = other.rect_size;
    this->char_info_pos = other.char_info_pos;
    this->char_info_size = other.char_info_size;
    return *this;
  }

  /**
   * @brief 设置值。
   *
   * @param[in] doc_index       文档索引。
   * @param[in] page_id         页面ID。
   * @param[in] page_index      页面索引。
   * @param[in] rect_size       矩形数量。
   * @param[in] char_info_pos   字符信息起始位置。
   * @param[in] char_info_size  字符信息数量。
   *
   * @return 无。
   */
  void Set(int doc_index, foxit::uint32 page_id, int page_index, int rect_size, int char_info_pos, int char_info_size) {
    this->doc_index = doc_index;
    this->page_id = page_id;
    this->page_index = page_index;
    this->rect_size = rect_size;
    this->char_info_pos = char_info_pos;
    this->char_info_size = char_info_size;
  }

  /**
   * @brief 文档索引。
   */
  int doc_index;

  /**
   * @brief 页面ID。
   */
  foxit::uint32 page_id;

  /**
   * @brief 页面索引。
   */
  int page_index;

  /**
   * @brief 矩形数量。
   */
  int rect_size;

  /**
   * @brief 字符信息起始位置。
   */
  int char_info_pos;

  /**
   * @brief 字符信息数量。
   */
  int char_info_size;
};

/** 此类表示OFD文本搜索字符信息。*/
class TextSearchCharInfo FS_FINAL : public Base {
 public:
  /** 析构函数。 */
  ~TextSearchCharInfo();

  /**
   * @brief 构造函数，通过另一个文本搜索字符信息对象。
   *
   * @param[in] other  另一个文本搜索字符信息对象。
   */
  TextSearchCharInfo(const TextSearchCharInfo& other);

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

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

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

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

  explicit TextSearchCharInfo(FS_HANDLE handle);
};

/** 此类表示OFD文本搜索相关的方法。*/
class TextSearch FS_FINAL : public Base {
 public:
  /**
   * @brief 带参数的构造函数。
   *
   * @param[in] package  OFD包对象。
   * @param[in] keyword  搜索关键字。
   */
  explicit TextSearch(OFDPackage package, const String& keyword);

  /**
   * @brief 带参数的构造函数。
   *
   * @param[in] page     OFD页面对象。
   * @param[in] keyword  搜索关键字。
   */
  explicit TextSearch(OFDPage page, const String& keyword);

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

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

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

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

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

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

  /**
   * @brief 获取搜索结果数量。
   *
   * @return 搜索结果数量。
   */
  int GetResultCount();

  /**
   * @brief 获取指定索引的搜索结果信息。
   *
   * @param[in] index   搜索结果索引号。有效范围：从0到(<i>count</i>-1)。
   *                    <i>count</i> 由函数 @link foxit::ofd::TextSearch::GetResultCount @endlink 返回。
   *
   * @return 指定索引的搜索结果信息。
   */
  TextSearchResultInfo GetResult(int index);

  /**
   * @brief 获取指定索引的搜索结果矩形框。
   *
   * @param[in] index        搜索结果索引号。有效范围：从0到(<i>count</i>-1)。
   *                         <i>count</i> 由函数 @link foxit::ofd::TextSearch::GetResultCount @endlink 返回。
   * @param[in] rect_index   矩形框索引号。有效范围：从0到(<i>rect_size</i>-1)。
   *                         <i>rect_size</i> 由函数 @link foxit::ofd::TextSearchResultInfo::rect_size @endlink 返回。
   *
   * @return 指定索引的搜索结果矩形框。
   */
  FX_RECT GetResultRect(int index, int rect_index);

  /**
   * @brief 获取指定索引的搜索结果字符信息。
   *
   * @param[in] index             搜索结果索引号。有效范围：从0到(<i>count</i>-1)。
   *                              <i>count</i> 由函数 @link foxit::ofd::TextSearch::GetResultCount @endlink 返回。
   * @param[in] char_info_index   字符信息索引号。有效范围：从0到(<i>char_info_size</i>-1)。
   *                              <i>char_info_size</i> 由函数 @link foxit::ofd::TextSearchResultInfo::char_info_size @endlink 返回。
   *
   * @return 指定索引的搜索结果字符信息。
   */
  TextSearchCharInfo GetResultCharInfo(int index, int char_info_index);

  /**
   * @brief 获取指定索引的搜索结果中心点。
   *
   * @param[in] index   搜索结果索引号。有效范围：从0到(<i>count</i>-1)。
   *                    <i>count</i> 由函数 @link foxit::ofd::TextSearch::GetResultCount @endlink 返回。
   *
   * @return 指定索引的搜索结果中心点。
   */
  foxit::PointF GetResultCenter(int index);

  /**
   * @brief 获取指定页面索引的搜索结果数量。
   *
   * @param[in] page_index   页面索引号。
   *
   * @return 指定页面索引的搜索结果数量。
   */
  int GetResultCountInPage(int page_index);

  /**
   * @brief 获取指定页面索引的搜索结果中心点。
   *
   * @param[in] page_index   页面索引号。
   * @param[in] index        搜索结果索引号。有效范围：从0到(<i>count</i>-1)。
   *                         <i>count</i> 由函数 @link foxit::ofd::TextSearch::GetResultCountInPage @endlink 返回。
   *
   * @return 指定页面索引的搜索结果中心点。
   */
  foxit::PointF GetResultCenterInPage(int page_index, int index);

  explicit TextSearch(FS_HANDLE handle);
};

}  // namespace ofd
}  // namespace foxit

#endif  // FS_OFD_TEXTSEARCH_H_
