// Copyright 2016 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 "third_party/blink/renderer/modules/indexeddb/idb_observer_changes.h"

#include "third_party/blink/renderer/bindings/core/v8/to_v8_for_core.h"
#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
#include "third_party/blink/renderer/bindings/modules/v8/to_v8_for_modules.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_binding_for_modules.h"
#include "third_party/blink/renderer/modules/indexeddb/idb_any.h"
#include "third_party/blink/renderer/modules/indexeddb/idb_observation.h"
#include "third_party/blink/renderer/platform/bindings/exception_state.h"
#include "third_party/blink/renderer/platform/bindings/script_state.h"

namespace blink {

ScriptValue IDBObserverChanges::records(ScriptState* script_state) {
  v8::Local<v8::Context> context(script_state->GetContext());
  v8::Isolate* isolate(script_state->GetIsolate());
  v8::Local<v8::Map> map = v8::Map::New(isolate);
  for (const auto& it : records_) {
    v8::Local<v8::String> key =
        V8String(isolate, database_->GetObjectStoreName(it.key));
    v8::Local<v8::Value> value = ToV8(it.value, context->Global(), isolate);
    map->Set(context, key, value).ToLocalChecked();
  }
  return ScriptValue::From(script_state, map);
}

IDBObserverChanges* IDBObserverChanges::Create(
    IDBDatabase* database,
    IDBTransaction* transaction,
    const HeapVector<Member<IDBObservation>>& observations,
    const Vector<int32_t>& observation_indices) {
  return MakeGarbageCollected<IDBObserverChanges>(
      database, transaction, observations, observation_indices);
}

IDBObserverChanges::IDBObserverChanges(
    IDBDatabase* database,
    IDBTransaction* transaction,
    const HeapVector<Member<IDBObservation>>& observations,
    const Vector<int32_t>& observation_indices)
    : database_(database), transaction_(transaction) {
  ExtractChanges(observations, observation_indices);
}

void IDBObserverChanges::ExtractChanges(
    const HeapVector<Member<IDBObservation>>& observations,
    const Vector<int32_t>& observation_indices) {
  // TODO(dmurph): Avoid getting and setting repeated times.
  for (const auto& idx : observation_indices) {
    records_
        .insert(observations[idx]->object_store_id(),
                HeapVector<Member<IDBObservation>>())
        .stored_value->value.emplace_back(observations[idx]);
  }
}

void IDBObserverChanges::Trace(blink::Visitor* visitor) {
  visitor->Trace(database_);
  visitor->Trace(transaction_);
  visitor->Trace(records_);
  ScriptWrappable::Trace(visitor);
}

}  // namespace blink
