// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_ACTOR_UI_DOM_NODE_GEOMETRY_H_
#define CHROME_BROWSER_ACTOR_UI_DOM_NODE_GEOMETRY_H_

#include "base/types/expected.h"
#include "base/types/pass_key.h"
#include "chrome/browser/actor/ui/dom_node_geometry_types.h"
#include "components/actor/core/shared_types.h"
#include "components/optimization_guide/proto/features/common_quality_data.pb.h"
#include "third_party/abseil-cpp/absl/container/flat_hash_map.h"
#include "ui/gfx/geometry/point.h"

namespace actor::ui {

class DomNodeGeometry {
 public:
  using NodeGeomMap =
      absl::flat_hash_map<DomNode,
                          optimization_guide::proto::ContentAttributes>;

  DomNodeGeometry(base::PassKey<DomNodeGeometry>, NodeGeomMap map);
  DomNodeGeometry(base::PassKey<DomNodeGeometry>,
                  GetDomNodeResult construction_error);
  ~DomNodeGeometry();

  static std::unique_ptr<DomNodeGeometry> InitFromApc(
      const optimization_guide::proto::AnnotatedPageContent& apc);

  // Resolves a DomNode to its center point coordinates.  GetDomNodeResult will
  // indicate an error.  Errors during construction are returned persistently
  // from GetDomNode().
  base::expected<gfx::Point, GetDomNodeResult> GetDomNode(
      const DomNode& node) const;

 private:
  base::expected<gfx::Point, GetDomNodeResult> InternalGetDomNode(
      const DomNode& node) const;

  std::optional<GetDomNodeResult> init_error_;  // Errors during initialization
  const NodeGeomMap node_map_;
};

}  // namespace actor::ui

#endif  // CHROME_BROWSER_ACTOR_UI_DOM_NODE_GEOMETRY_H_
