// 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.

#ifndef ML_SODA_RECOGNIZER_IMPL_H_
#define ML_SODA_RECOGNIZER_IMPL_H_

#include <string>
#include <vector>

#include <base/callback_forward.h>
#include <base/macros.h>
#include <mojo/public/cpp/bindings/pending_receiver.h>
#include <mojo/public/cpp/bindings/pending_remote.h>
#include <mojo/public/cpp/bindings/receiver.h>
#include <mojo/public/cpp/bindings/shared_remote.h>

#include "ml/mojom/soda.mojom.h"

namespace ml {
// Defined in ml/soda.h . Can't include in header due to fake implementation not
// being able to include that file.
class SodaLibrary;

// The implementation of SodaSpeechRecognizer.
class SodaRecognizerImpl
    : public chromeos::machine_learning::mojom::SodaRecognizer {
 public:
  // Constructs a SodaRecognizerImpl; and set disconnect handler so
  // that the SodaRecognizerImpl will be deleted when the mojom
  // connection is destroyed.
  // Returns whether the object is create successfully.
  static bool Create(
      chromeos::machine_learning::mojom::SodaConfigPtr spec,
      mojo::PendingRemote<chromeos::machine_learning::mojom::SodaClient>
          soda_client,
      mojo::PendingReceiver<chromeos::machine_learning::mojom::SodaRecognizer>
          soda_recognizer);

  // Called when mojom connection is destroyed.
  ~SodaRecognizerImpl();

  // mojom::SodaRecognizer::AddAudio:
  void AddAudio(const std::vector<uint8_t>& audio) override;

  // mojom::SodaRecognizer::Stop:
  void Stop() override;

  // mojom::SodaRecognizer::Start:
  void Start() override;

  // mojom::SodaRecognizer::MarkDone:
  void MarkDone() override;

  // Used to send the event to the client. For the initial version, only accepts
  // a string, which is in an unspecified format.
  void OnSodaEvent(const std::string& soda_response);

 private:
  // Creates a SodaRecognizer and Binds to `receiver` inside so that
  // Recognize can be called on the other side for a particular soda
  // reconition query.
  SodaRecognizerImpl(
      chromeos::machine_learning::mojom::SodaConfigPtr spec,
      mojo::PendingRemote<chromeos::machine_learning::mojom::SodaClient>
          soda_client,
      mojo::PendingReceiver<chromeos::machine_learning::mojom::SodaRecognizer>
          receiver);
  SodaRecognizerImpl(const SodaRecognizerImpl&) = delete;
  SodaRecognizerImpl& operator=(const SodaRecognizerImpl&) = delete;

  bool successfully_loaded_;

  // Pointer handle to the internal implementation of SodaRecognizer inside
  // the SodaLibrary.
  void* recognizer_;
  // Not owned: owned by a std::map in soda.h::GetInstanceAt.
  SodaLibrary* soda_library_;

  mojo::Receiver<chromeos::machine_learning::mojom::SodaRecognizer> receiver_;

  mojo::SharedRemote<chromeos::machine_learning::mojom::SodaClient>
      client_remote_;
};

}  // namespace ml

#endif  // ML_SODA_RECOGNIZER_IMPL_H_
