// 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.

#include "components/browser_apis/tab_strip/event_broadcaster.h"

#include "components/browser_apis/tab_strip/observation/tab_strip_api_batched_observer.h"

namespace tabs_api {

// A decoder which takes the incoming event type and directs them to the proper
// callback.
class EventVisitor {
 public:
  EventVisitor() = default;

  mojom::TabsEventPtr operator()(const mojom::OnTabsCreatedEventPtr& event) {
    return mojom::TabsEvent::NewTabsCreatedEvent(event.Clone());
  }

  mojom::TabsEventPtr operator()(const mojom::OnNodesClosedEventPtr& event) {
    return mojom::TabsEvent::NewNodesClosedEvent(event.Clone());
  }

  mojom::TabsEventPtr operator()(const mojom::OnNodeMovedEventPtr& event) {
    return mojom::TabsEvent::NewNodeMovedEvent(event.Clone());
  }

  mojom::TabsEventPtr operator()(const mojom::OnDataChangedEventPtr& event) {
    return mojom::TabsEvent::NewDataChangedEvent(event.Clone());
  }

  mojom::TabsEventPtr operator()(
      const mojom::OnCollectionCreatedEventPtr& event) {
    return mojom::TabsEvent::NewCollectionCreatedEvent(event.Clone());
  }
};

std::vector<mojom::TabsEventPtr> Transform(
    const std::vector<events::Event>& events) {
  std::vector<mojom::TabsEventPtr> transformed;
  EventVisitor transformer;
  for (auto& event : events) {
    transformed.push_back(std::visit(transformer, event));
  }
  return transformed;
}

void EventBroadcaster::Broadcast(
    const base::ObserverList<observation::TabStripApiBatchedObserver>&
        observers,
    const std::vector<events::Event>& events) {
  for (auto& observer : observers) {
    observer.OnTabEvents(Transform(events));
  }
}

}  // namespace tabs_api
