// Copyright 2019 The Chromium 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 "chromecast/renderer/queryable_data_bindings.h"

#include "base/bind_helpers.h"
#include "base/logging.h"
#include "chromecast/common/queryable_data.h"
#include "content/public/renderer/render_frame.h"
#include "content/public/renderer/v8_value_converter.h"
#include "services/service_manager/public/cpp/interface_provider.h"
#include "third_party/blink/public/web/blink.h"
#include "third_party/blink/public/web/web_local_frame.h"
#include "v8/include/v8.h"

namespace chromecast {

namespace {

const char kQueryPlatformValueMethodName[] = "queryPlatformValue";

}  // namespace

QueryableDataBindings::QueryableDataBindings(content::RenderFrame* frame)
    : CastBinding(frame),
      queryable_data_store_(std::make_unique<QueryableDataStore>(
          base::ThreadTaskRunnerHandle::Get())) {
  registry_.AddInterface<shell::mojom::QueryableDataStore>(
      base::BindRepeating(&QueryableDataStore::BindQueryableDataStoreRequest,
                          base::Unretained(queryable_data_store_.get())));
}

QueryableDataBindings::~QueryableDataBindings() {}

void QueryableDataBindings::Install(v8::Local<v8::Object> cast_platform,
                                    v8::Isolate* isolate) {
  VLOG(1) << "Installing QueryableDataBindings";

  InstallBinding(isolate, cast_platform, kQueryPlatformValueMethodName,
                 &QueryableDataBindings::QueryPlatformValue,
                 base::Unretained(this));
}

void QueryableDataBindings::OnInterfaceRequestForFrame(
    const std::string& interface_name,
    mojo::ScopedMessagePipeHandle* interface_pipe) {
  registry_.TryBindInterface(interface_name, interface_pipe);
}

v8::Local<v8::Value> QueryableDataBindings::QueryPlatformValue(
    const std::string& query_key) {
  VLOG(1) << __FUNCTION__ << ": " << query_key;

  v8::Isolate* isolate = blink::MainThreadIsolate();

  const base::Value* query_value = QueryableData::Query(query_key);
  if (!query_value)
    return v8::Local<v8::Value>(v8::Undefined(isolate));

  return content::V8ValueConverter::Create()->ToV8Value(
      query_value, render_frame()->GetWebFrame()->MainWorldScriptContext());
}

}  // namespace chromecast
