// Copyright 2019 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_DOM_ELEMENT_INTERSECTION_OBSERVER_MODULE_H_
#define COBALT_DOM_ELEMENT_INTERSECTION_OBSERVER_MODULE_H_

#include <vector>

#include "cobalt/dom/intersection_observer.h"
#include "cobalt/math/rect_f.h"
#include "cobalt/script/tracer.h"

namespace cobalt {
namespace dom {

class Element;

// This helper class groups the methods and  data related to the root and target
// elements outlined in the intersection observer spec.
// https://www.w3.org/TR/intersection-observer
class ElementIntersectionObserverModule : public script::Traceable {
 public:
  typedef std::vector<scoped_refptr<IntersectionObserver>>
      IntersectionObserverVector;
  typedef std::vector<scoped_refptr<layout::IntersectionObserverRoot>>
      LayoutIntersectionObserverRootVector;
  typedef std::vector<scoped_refptr<layout::IntersectionObserverTarget>>
      LayoutIntersectionObserverTargetVector;

  explicit ElementIntersectionObserverModule(Element* element);
  ~ElementIntersectionObserverModule() {}

  void RegisterIntersectionObserverForRoot(IntersectionObserver* observer);
  void UnregisterIntersectionObserverForRoot(IntersectionObserver* observer);
  void RegisterIntersectionObserverForTarget(IntersectionObserver* observer);
  void UnregisterIntersectionObserverForTarget(IntersectionObserver* observer);

  LayoutIntersectionObserverRootVector
  GetLayoutIntersectionObserverRootsForElement();
  LayoutIntersectionObserverTargetVector
  GetLayoutIntersectionObserverTargetsForElement();

  void CreateIntersectionObserverEntryForObserver(
      const base::WeakPtr<IntersectionObserver>& observer,
      math::RectF root_bounds, math::RectF target_rect,
      math::RectF intersection_rect, bool is_intersecting,
      float intersection_ratio);

  void TraceMembers(script::Tracer* tracer) override;

 private:
  void InvalidateLayoutBoxesForElement();
  void AddLayoutTargetForObserver(IntersectionObserver* observer);
  void RemoveLayoutTargetForObserver(IntersectionObserver* observer);

  Element* element_;
  IntersectionObserverVector root_registered_intersection_observers_;
  IntersectionObserverVector target_registered_intersection_observers_;
  LayoutIntersectionObserverTargetVector layout_targets_;
};

}  // namespace dom
}  // namespace cobalt

#endif  // COBALT_DOM_ELEMENT_INTERSECTION_OBSERVER_MODULE_H_
