// Copyright 2017 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef CORE_FPDFDOC_CPDF_STRUCTTREE_H_
#define CORE_FPDFDOC_CPDF_STRUCTTREE_H_

#include <functional>
#include <map>
#include <memory>
#include <vector>

#include "core/fpdfapi/parser/cpdf_dictionary.h"
#include "core/fxcrt/bytestring.h"
#include "core/fxcrt/retain_ptr.h"

class CPDF_Document;
class CPDF_StructElement;

class CPDF_StructTree {
 public:
  static std::unique_ptr<CPDF_StructTree> LoadPage(
      const CPDF_Document* pDoc,
      const CPDF_Dictionary* pPageDict);

  explicit CPDF_StructTree(const CPDF_Document* pDoc);
  ~CPDF_StructTree();

  size_t CountTopElements() const { return m_Kids.size(); }
  CPDF_StructElement* GetTopElement(size_t i) const { return m_Kids[i].Get(); }
  uint32_t GetPageObjNum() const { return m_pPage->GetObjNum(); }
  ByteString GetRoleMapNameFor(const ByteString& type) const;

 private:
  using StructElementMap = std::map<RetainPtr<const CPDF_Dictionary>,
                                    RetainPtr<CPDF_StructElement>,
                                    std::less<>>;

  void LoadPageTree(const CPDF_Dictionary* pPageDict);
  RetainPtr<CPDF_StructElement> AddPageNode(
      RetainPtr<const CPDF_Dictionary> pDict,
      StructElementMap* map,
      int nLevel);
  bool AddTopLevelNode(const CPDF_Dictionary* pDict,
                       const RetainPtr<CPDF_StructElement>& pElement);

  RetainPtr<const CPDF_Dictionary> const m_pTreeRoot;
  RetainPtr<const CPDF_Dictionary> const m_pRoleMap;
  RetainPtr<const CPDF_Dictionary> m_pPage;
  std::vector<RetainPtr<CPDF_StructElement>> m_Kids;
};

#endif  // CORE_FPDFDOC_CPDF_STRUCTTREE_H_
