#ifndef FS_OFD_LAYER_H_
#define FS_OFD_LAYER_H_

#include "common/fs_common.h"
#include "graphics/fs_ofdgraphicsobject.h"
#include "graphics/fs_ofdtextobject.h"
#include "graphics/fs_ofdpathobject.h"
#include "graphics/fs_ofdimageobject.h"
#include "graphics/fs_ofdcompositeobject.h"

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

/** 此类表示和OFD层相关的操作。*/
class OFDLayer : public foxit::ofd::graphics::OFDGraphicsObject {
 public:
  /**
   * @brief OFD页面层类型枚举。
   *
   * @details 该枚举值应单独使用。
   */
  typedef enum _LayerType {
    /** @brief 背景层。 */
    e_LayerTypeBackground = 0,
    /** @brief 正文层。 */
    e_LayerTypeBody = 1,
    /** @brief 前景层。 */
    e_LayerTypeForeground = 2
  } LayerType;
  
  /**
   * @brief OFD页面对象类型类型枚举。
   *
   * @details 该枚举值应单独使用。
   */
  typedef enum _GraphicsObjectType {
    /** @brief 未知类型。 */
    e_GraphicsObjectTypeUnknown = 0,
    /** @brief 层类型。 */
    e_GraphicsObjectTypeLayer = 1,
    /** @brief 页面块对象。 */
    e_GraphicsObjectTypePageBlock = 2,
    /** @brief 复合对象。 */
    e_GraphicsObjectTypeComposite = 3,
    /** @brief 矢量对象。 */
    e_GraphicsObjectTypeSvg = 4,
    /** @brief 文本对象。 */
    e_GraphicsObjectTypeText = 5,
    /** @brief 路径对象。 */
    e_GraphicsObjectTypePath = 6,
    /** @brief 图像类型。 */
    e_GraphicsObjectTypeImage = 7,
    /** @brief 视频对象。 */
    e_GraphicsObjectTypeVideo = 8
  } GraphicsObjectType;
  

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

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

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

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

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

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

  /**
   * @brief 设置类型
   *
   * @param[in] type 类型。请参考从 @link foxit::ofd::OFDLayer::e_LayerTypeBackground @endlink 开始的值，
   *                 这应该是这些值中的一个。默认值为 @link foxit::ofd::OFDLayer::e_LayerTypeBody @endlink 。
   *
   * @return 无。
   */
  void SetType(LayerType type = e_LayerTypeBody);

  /**
   * @brief 通过名称获取图元对象索引。
   *
   * @param[in] name 图元对象名称。
   *
   * @return 图元对象索引。若未找到则返回-1。
   */
  int GetGraphicsObjectIndexByName(const String& name) const;

  /**
   * @brief 添加图元对象-路径对象。
   *
   * @return 新添加的路径对象。
   */
  graphics::OFDPathObject AddPathObject();

  /**
   * @brief 添加图元对象-图像对象。
   *
   * @return 新添加的图像对象。
   */
  graphics::OFDImageObject AddImageObject();

  /**
   * @brief 添加图元对象-文本对象。
   *
   * @return 新添加的文本对象。
   */
  graphics::OFDTextObject AddTextObject();

  /**
   * @brief 添加图元对象-复合对象。
   *
   * @return 新添加的复合对象。
   */
  graphics::OFDCompositeObject AddCompositeObject();

  /**
   * @brief 添加图元对象-块对象。
   *
   * @return 新添加的块对象。
   */
  graphics::OFDBlockObject AddBlockObject();

  /**
   * @brief 添加图元对象-视频对象。
   *
   * @return 新添加的视频对象。
   */
  graphics::OFDVideoObject AddVideoObject();

  /**
   * @brief 添加图元对象。
   *
   * @param[in] type 图元对象类型。请参考从 @link foxit::ofd::OFDLayer::e_GraphicsObjectTypeLayer @endlink 开始的值，
   *                 这应该是这些值中的一个。
   *
   * @return 新添加的图元对象。
   */
  graphics::OFDGraphicsObject AddGraphicsObject(GraphicsObjectType type);

  /**
   * @brief 获取图元对象数量。
   *
   * @return 图元对象数量。
   */
  int GetGraphicsObjectCount() const;

  /**
   * @brief 获取指定索引的图元对象。
   *
   * @param[in] index 指定图元对象的索引。有效范围：从0到(<i>count</i>-1)。
   *                  <i>count</i> 由函数 @link foxit::ofd::OFDLayer::GetGraphicsObjectCount @endlink 返回。
   *
   * @return 图元对象。
   */
  graphics::OFDGraphicsObject GetGraphicsObject(int index) const;

  /**
   * @brief 获取指定索引的页面块对象。
   *
   * @param[in] index 指定页面块对象的索引。有效范围：从0到(<i>count</i>-1)。
   *                  <i>count</i> 由函数 @link foxit::ofd::OFDLayer::GetGraphicsObjectCount @endlink 返回。
   *
   * @return 页面块对象。
   */
  graphics::OFDBlockObject GetPageBlock(int index) const;

  /**
   * @brief 获取指定索引的图元对象类型。
   *
   * @param[in] index 指定图元对象的索引。有效范围：从0到(<i>count</i>-1)。
   *                  <i>count</i> 由函数 @link foxit::ofd::OFDLayer::GetGraphicsObjectCount @endlink 返回。
   *
   * @return 图元对象类型。请参考从 @link foxit::ofd::OFDLayer::e_GraphicsObjectTypeUnknown @endlink 开始的值，
   *         应该是这些值中的一个。
   */
  GraphicsObjectType GetGraphicsObjectType(int index) const;

  /**
   * @brief 删除指定索引的图元对象。
   *
   * @param[in] index 指定图元对象的索引。有效范围：从0到(<i>count</i>-1)。
   *                  <i>count</i> 由函数 @link foxit::ofd::OFDLayer::GetGraphicsObjectCount @endlink 返回。
   *
   * @return 无。
   */
  void RemoveGraphicsObject(int index);

  /**
   * @brief 删除所有图元对象。
   *
   * @return 无。
   */
  void RemoveAllGraphicsObjects();

  /**
   * @brief 通过ID获取图元对象。
   *
   * @param[in] id 图元对象ID。
   *
   * @return 图元对象。
   */
  graphics::OFDGraphicsObject GetGraphicsObjectByID(int id);

  explicit OFDLayer(FS_HANDLE handle);
};
}  // namespace ofd
}  // namespace foxit

#endif  // FS_OFD_LAYER_H_
