// Copyright (c) 2012 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 "components/spellcheck/renderer/platform_spelling_engine.h"

#include "content/public/renderer/render_thread.h"
#include "services/service_manager/public/cpp/local_interface_provider.h"

using content::RenderThread;

SpellingEngine* CreateNativeSpellingEngine(
    service_manager::LocalInterfaceProvider* embedder_provider) {
  DCHECK(embedder_provider);
  return new PlatformSpellingEngine(embedder_provider);
}

PlatformSpellingEngine::PlatformSpellingEngine(
    service_manager::LocalInterfaceProvider* embedder_provider)
    : embedder_provider_(embedder_provider) {}

PlatformSpellingEngine::~PlatformSpellingEngine() = default;

spellcheck::mojom::SpellCheckHost&
PlatformSpellingEngine::GetOrBindSpellCheckHost() {
  if (spell_check_host_)
    return *spell_check_host_;

  embedder_provider_->GetInterface(&spell_check_host_);
  return *spell_check_host_;
}

void PlatformSpellingEngine::Init(base::File bdict_file) {
  DCHECK(!bdict_file.IsValid());
}

bool PlatformSpellingEngine::InitializeIfNeeded() {
  return false;
}

bool PlatformSpellingEngine::IsEnabled() {
  return true;
}

// Synchronously query against the platform's spellchecker.
// TODO(groby): We might want async support here, too. Ideally,
// all engines share a similar path for async requests.
bool PlatformSpellingEngine::CheckSpelling(const base::string16& word_to_check,
                                           int tag) {
  bool word_correct = false;
  GetOrBindSpellCheckHost().CheckSpelling(word_to_check, tag, &word_correct);
  return word_correct;
}

// Synchronously query against the platform's spellchecker.
// TODO(groby): We might want async support here, too. Ideally,
// all engines share a similar path for async requests.
void PlatformSpellingEngine::FillSuggestionList(
    const base::string16& wrong_word,
    std::vector<base::string16>* optional_suggestions) {
  GetOrBindSpellCheckHost().FillSuggestionList(wrong_word,
                                               optional_suggestions);
}
