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

// This file contains the implementation of `SodaRecognizerImpl` when SODA is
// not intended to be supported.

// Suppress unused-private-field since this dummy class impl is deliberately
// non-functional and needn't reference all variables.
#pragma GCC diagnostic ignored "-Wunused-private-field"

#include "ml/soda_recognizer_impl.h"

namespace ml {
namespace {

using ::chromeos::machine_learning::mojom::EndpointReason;
using ::chromeos::machine_learning::mojom::FinalResult;
using ::chromeos::machine_learning::mojom::FinalResultPtr;
using ::chromeos::machine_learning::mojom::SodaClient;
using ::chromeos::machine_learning::mojom::SodaConfigPtr;
using ::chromeos::machine_learning::mojom::SodaRecognizer;
using ::chromeos::machine_learning::mojom::SpeechRecognizerEvent;
using ::chromeos::machine_learning::mojom::SpeechRecognizerEventPtr;

constexpr char kOnDeviceSpeechNotSupportedMessage[] =
    "On-device speech is not supported.";

void SodaCallback(const char* soda_response_str,
                  int size,
                  void* soda_recognizer_impl) {
  reinterpret_cast<SodaRecognizerImpl*>(soda_recognizer_impl)
      ->OnSodaEvent(kOnDeviceSpeechNotSupportedMessage);
}

}  // namespace

bool SodaRecognizerImpl::Create(
    SodaConfigPtr spec,
    mojo::PendingRemote<SodaClient> soda_client,
    mojo::PendingReceiver<SodaRecognizer> soda_recognizer) {
  auto recognizer_impl = new SodaRecognizerImpl(
      std::move(spec), std::move(soda_client), std::move(soda_recognizer));
  // Set the disconnection handler to strongly bind `recognizer_impl` to delete
  // `recognizer_impl` when the connection is gone.
  recognizer_impl->receiver_.set_disconnect_handler(base::Bind(
      [](const SodaRecognizerImpl* const recognizer_impl) {
        delete recognizer_impl;
      },
      base::Unretained(recognizer_impl)));

  return recognizer_impl->successfully_loaded_;
}

void SodaRecognizerImpl::AddAudio(const std::string& audio) {
  // Immediately sends the error message to client.
  SodaCallback(nullptr, 0, this);
}

void SodaRecognizerImpl::Stop() {
  // Immediately sends the error message to client.
  SodaCallback(nullptr, 0, this);
}

void SodaRecognizerImpl::Start() {
  // Immediately sends the error message to client.
  SodaCallback(nullptr, 0, this);
}

void SodaRecognizerImpl::MarkDone() {
  // Immediately sends the error message to client.
  SodaCallback(nullptr, 0, this);
}

void SodaRecognizerImpl::OnSodaEvent(const std::string& event_string) {
  SpeechRecognizerEventPtr event = SpeechRecognizerEvent::New();
  FinalResultPtr final_result = FinalResult::New();
  final_result->final_hypotheses.push_back(event_string);
  final_result->endpoint_reason = EndpointReason::ENDPOINT_UNKNOWN;
  event->set_final_result(std::move(final_result));
  client_remote_->OnSpeechRecognizerEvent(std::move(event));
}

SodaRecognizerImpl::SodaRecognizerImpl(
    SodaConfigPtr spec,
    mojo::PendingRemote<SodaClient> soda_client,
    mojo::PendingReceiver<SodaRecognizer> soda_recognizer)
    : successfully_loaded_(true),
      recognizer_(nullptr),
      receiver_(this, std::move(soda_recognizer)),
      client_remote_(std::move(soda_client)) {}

SodaRecognizerImpl::~SodaRecognizerImpl() = default;

}  // namespace ml
