// Copyright 2016 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_SPEECH_SPEECH_RECOGNITION_MANAGER_H_
#define COBALT_SPEECH_SPEECH_RECOGNITION_MANAGER_H_

#include <memory>
#include <string>

#include "cobalt/network/network_module.h"
#include "cobalt/script/exception_state.h"
#include "cobalt/speech/microphone.h"
#include "cobalt/speech/speech_recognition_config.h"
#include "cobalt/speech/speech_recognizer.h"

namespace cobalt {
namespace speech {

// Owned by SpeechRecognition to manage major speech recognition logic.
// This class interacts with microphone, speech recognition service and audio
// encoder. It provides the interface to start/stop microphone and
// recognition service. After receiving the audio data from microphone, this
// class would encode the audio data, then send it to recognition service.
class SpeechRecognitionManager {
 public:
  typedef base::Callback<bool(const scoped_refptr<web::Event>&)> EventCallback;

  SpeechRecognitionManager(network::NetworkModule* network_module,
                           const EventCallback& event_callback,
                           const Microphone::Options& microphone_options);
  ~SpeechRecognitionManager();

  // Start/Stop speech recognizer.
  void Start(const SpeechRecognitionConfig& config,
             script::ExceptionState* exception_state);
  void Stop();
  void Abort();

 private:
  enum State {
    kStarted,
    kStopped,
    kAborted,
  };

  void OnEventAvailable(const scoped_refptr<web::Event>& event);

  base::WeakPtrFactory<SpeechRecognitionManager> weak_ptr_factory_;
  // We construct a WeakPtr upon SpeechRecognitionManager's construction in
  // order to associate the WeakPtr with the constructing thread.
  base::WeakPtr<SpeechRecognitionManager> weak_this_;
  scoped_refptr<base::SingleThreadTaskRunner> const
      main_message_loop_task_runner_;

  // Callback for sending dom events if available.
  EventCallback event_callback_;
  std::unique_ptr<SpeechRecognizer> recognizer_;

  State state_;
};

}  // namespace speech
}  // namespace cobalt

#endif  // COBALT_SPEECH_SPEECH_RECOGNITION_MANAGER_H_
