// Copyright 2018 The Fuchsia 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 "peridot/bin/suggestion_engine/media_player.h"

#include <string>

#include <fuchsia/modular/cpp/fidl.h>
#include <lib/fidl/cpp/optional.h>
#include <lib/media/timeline/timeline.h>
#include <lib/media/timeline/timeline_rate.h>

namespace modular {

MediaPlayer::MediaPlayer(fuchsia::media::AudioPtr audio,
                         std::shared_ptr<SuggestionDebugImpl> debug)
    : audio_(std::move(audio)), debug_(debug) {
  audio_.set_error_handler([this](zx_status_t status) {
    // TODO(miguelfrde): better error handling. If we observe this message it
    // means that the underlying channel was closed.
    FXL_LOG(WARNING) << "Audio connection error";
    audio_ = nullptr;
  });
}

MediaPlayer::~MediaPlayer() = default;

void MediaPlayer::SetSpeechStatusCallback(SpeechStatusCallback callback) {
  speech_status_callback_ = std::move(callback);
}

void MediaPlayer::PlayAudioResponse(
    fidl::InterfaceRequest<fuchsia::media::AudioRenderer> audio_response) {
  if (!audio_) {
    FXL_LOG(ERROR) << "Not playing query audio response because our audio "
                      "service connection died earlier.";
    return;
  }

  audio_->CreateAudioRenderer(audio_renderer_.NewRequest());
  audio_renderer_binding_ =
      std::make_unique<fidl::Binding<fuchsia::media::AudioRenderer>>(
          audio_renderer_.get());
  audio_renderer_binding_->set_error_handler([this](zx_status_t status) {
    speech_status_callback_(fuchsia::modular::SpeechStatus::IDLE);
  });
  audio_renderer_binding_->Bind(std::move(audio_response));

  speech_status_callback_(fuchsia::modular::SpeechStatus::RESPONDING);
}

}  // namespace modular
