// Copyright (c) 2020 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.

#include "libcef/browser/media_router/media_route_impl.h"

#include "libcef/browser/media_router/media_router_manager.h"
#include "libcef/browser/media_router/media_sink_impl.h"
#include "libcef/browser/media_router/media_source_impl.h"
#include "libcef/browser/thread_util.h"

namespace {

// Do not keep a reference to the object returned by this method.
CefBrowserContext* GetBrowserContext(const CefBrowserContext::Getter& getter) {
  CEF_REQUIRE_UIT();
  DCHECK(!getter.is_null());

  // Will return nullptr if the BrowserContext has been destroyed.
  return getter.Run();
}

}  // namespace

CefMediaRouteImpl::CefMediaRouteImpl(
    const media_router::MediaRoute& route,
    const CefBrowserContext::Getter& browser_context_getter)
    : route_(route), browser_context_getter_(browser_context_getter) {
  CEF_REQUIRE_UIT();
}

CefString CefMediaRouteImpl::GetId() {
  return route_.media_route_id();
}

CefRefPtr<CefMediaSource> CefMediaRouteImpl::GetSource() {
  return new CefMediaSourceImpl(route_.media_source().id());
}

CefRefPtr<CefMediaSink> CefMediaRouteImpl::GetSink() {
  return new CefMediaSinkImpl(route_.media_sink_id(), route_.media_sink_name());
}

void CefMediaRouteImpl::SendRouteMessage(const void* message,
                                         size_t message_size) {
  std::string message_str(reinterpret_cast<const char*>(message), message_size);

  if (!CEF_CURRENTLY_ON_UIT()) {
    CEF_POST_TASK(
        CEF_UIT,
        base::BindOnce(
            [](CefRefPtr<CefMediaRouteImpl> self, std::string message_str) {
              self->SendRouteMessageInternal(std::move(message_str));
            },
            CefRefPtr<CefMediaRouteImpl>(this), std::move(message_str)));
    return;
  }

  SendRouteMessageInternal(std::move(message_str));
}

void CefMediaRouteImpl::Terminate() {
  if (!CEF_CURRENTLY_ON_UIT()) {
    CEF_POST_TASK(CEF_UIT, base::BindOnce(&CefMediaRouteImpl::Terminate, this));
    return;
  }

  auto browser_context = GetBrowserContext(browser_context_getter_);
  if (!browser_context)
    return;

  browser_context->GetMediaRouterManager()->TerminateRoute(
      route_.media_route_id());
}

void CefMediaRouteImpl::SendRouteMessageInternal(std::string message) {
  auto browser_context = GetBrowserContext(browser_context_getter_);
  if (!browser_context)
    return;

  browser_context->GetMediaRouterManager()->SendRouteMessage(
      route_.media_route_id(), message);
}
