// Copyright 2020 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 "cast/standalone_receiver/mirroring_application.h"

#include "cast/common/public/message_port.h"
#include "cast/streaming/environment.h"
#include "cast/streaming/message_fields.h"
#include "cast/streaming/receiver_session.h"
#include "platform/api/task_runner.h"
#include "util/osp_logging.h"

namespace openscreen {
namespace cast {

const char kMirroringAppId[] = "0F5096E8";
const char kMirroringAudioOnlyAppId[] = "85CDB22F";

const char kMirroringDisplayName[] = "Chrome Mirroring";
const char kRemotingRpcNamespace[] = "urn:x-cast:com.google.cast.remoting";

MirroringApplication::MirroringApplication(TaskRunner* task_runner,
                                           const IPAddress& interface_address,
                                           ApplicationAgent* agent)
    : task_runner_(task_runner),
      interface_address_(interface_address),
      app_ids_({kMirroringAppId, kMirroringAudioOnlyAppId}),
      agent_(agent) {
  OSP_DCHECK(task_runner_);
  OSP_DCHECK(agent_);
  agent_->RegisterApplication(this);
}

MirroringApplication::~MirroringApplication() {
  agent_->UnregisterApplication(this);  // ApplicationAgent may call Stop().
  OSP_DCHECK(!current_session_);
}

const std::vector<std::string>& MirroringApplication::GetAppIds() const {
  return app_ids_;
}

bool MirroringApplication::Launch(const std::string& app_id,
                                  const Json::Value& app_params,
                                  MessagePort* message_port) {
  if ((app_id != kMirroringAppId && app_id != kMirroringAudioOnlyAppId) ||
      !message_port || current_session_) {
    return false;
  }

  wake_lock_ = ScopedWakeLock::Create(task_runner_);
  environment_ = std::make_unique<Environment>(
      &Clock::now, task_runner_,
      IPEndpoint{interface_address_, kDefaultCastStreamingPort});
  controller_ =
      std::make_unique<StreamingPlaybackController>(task_runner_, this);
  current_session_ = std::make_unique<ReceiverSession>(
      controller_.get(), environment_.get(), message_port,
      ReceiverSession::Preferences{});
  return true;
}

std::string MirroringApplication::GetSessionId() {
  return current_session_ ? current_session_->session_id() : std::string();
}

std::string MirroringApplication::GetDisplayName() {
  return current_session_ ? kMirroringDisplayName : std::string();
}

std::vector<std::string> MirroringApplication::GetSupportedNamespaces() {
  return {kCastWebrtcNamespace, kRemotingRpcNamespace};
}

void MirroringApplication::Stop() {
  current_session_.reset();
  controller_.reset();
  environment_.reset();
  wake_lock_.reset();
}

void MirroringApplication::OnPlaybackError(StreamingPlaybackController*,
                                           Error error) {
  OSP_LOG_ERROR << "[MirroringApplication] " << error;
  agent_->StopApplicationIfRunning(this);  // ApplicationAgent calls Stop().
}

}  // namespace cast
}  // namespace openscreen
