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

#include "diagnostics/diagnosticsd/fake_diagnostics_processor.h"

#include <utility>

#include <base/run_loop.h>
#include <base/threading/thread_task_runner_handle.h>

#include "diagnostics/diagnosticsd/bind_utils.h"

namespace diagnostics {

FakeDiagnosticsProcessor::FakeDiagnosticsProcessor(
    const std::string& grpc_server_uri,
    const std::string& diagnosticsd_grpc_uri)
    : grpc_server_(base::ThreadTaskRunnerHandle::Get(), grpc_server_uri),
      diagnosticsd_grpc_client_(base::ThreadTaskRunnerHandle::Get(),
                                diagnosticsd_grpc_uri) {
  grpc_server_.RegisterHandler(
      &grpc_api::DiagnosticsProcessor::AsyncService::RequestHandleMessageFromUi,
      base::Bind(&FakeDiagnosticsProcessor::HandleMessageFromUi,
                 base::Unretained(this)));
  grpc_server_.RegisterHandler(
      &grpc_api::DiagnosticsProcessor::AsyncService::
          RequestHandleEcNotification,
      base::Bind(&FakeDiagnosticsProcessor::HandleEcNotification,
                 base::Unretained(this)));
  grpc_server_.Start();
}

FakeDiagnosticsProcessor::~FakeDiagnosticsProcessor() {
  // Wait until both gRPC server and client get shut down.
  base::RunLoop run_loop;
  const base::Closure barrier_closure =
      BarrierClosure(2, run_loop.QuitClosure());
  grpc_server_.Shutdown(barrier_closure);
  diagnosticsd_grpc_client_.Shutdown(barrier_closure);
  run_loop.Run();
}

void FakeDiagnosticsProcessor::GetProcData(
    const grpc_api::GetProcDataRequest& request, GetProcDataCallback callback) {
  diagnosticsd_grpc_client_.CallRpc(
      &grpc_api::Diagnosticsd::Stub::AsyncGetProcData, request, callback);
}

void FakeDiagnosticsProcessor::RunEcCommand(
    const grpc_api::RunEcCommandRequest& request,
    RunEcCommandCallback callback) {
  diagnosticsd_grpc_client_.CallRpc(
      &grpc_api::Diagnosticsd::Stub::AsyncRunEcCommand, request, callback);
}

void FakeDiagnosticsProcessor::GetEcProperty(
    const grpc_api::GetEcPropertyRequest& request,
    GetEcPropertyCallback callback) {
  diagnosticsd_grpc_client_.CallRpc(
      &grpc_api::Diagnosticsd::Stub::AsyncGetEcProperty, request, callback);
}

void FakeDiagnosticsProcessor::PerformWebRequest(
    const grpc_api::PerformWebRequestParameter& parameter,
    const PerformWebRequestResponseCallback& callback) {
  diagnosticsd_grpc_client_.CallRpc(
      &grpc_api::Diagnosticsd::Stub::AsyncPerformWebRequest, parameter,
      callback);
}

void FakeDiagnosticsProcessor::set_handle_message_from_ui_callback(
    base::Closure handle_message_from_ui_callback) {
  handle_message_from_ui_callback_.emplace(
      std::move(handle_message_from_ui_callback));
}

void FakeDiagnosticsProcessor::set_handle_message_from_ui_json_message_response(
    const std::string& json_message_response) {
  handle_message_from_ui_json_message_response_.emplace(json_message_response);
}

const base::Optional<std::string>&
FakeDiagnosticsProcessor::handle_message_from_ui_actual_json_message() const {
  return handle_message_from_ui_actual_json_message_;
}

void FakeDiagnosticsProcessor::HandleMessageFromUi(
    std::unique_ptr<grpc_api::HandleMessageFromUiRequest> request,
    const HandleMessageFromUiCallback& callback) {
  DCHECK(handle_message_from_ui_callback_);
  DCHECK(handle_message_from_ui_json_message_response_.has_value());

  handle_message_from_ui_actual_json_message_.emplace(request->json_message());

  auto response = std::make_unique<grpc_api::HandleMessageFromUiResponse>();
  response->set_response_json_message(
      handle_message_from_ui_json_message_response_.value());
  callback.Run(std::move(response));

  handle_message_from_ui_callback_->Run();
}

void FakeDiagnosticsProcessor::HandleEcNotification(
    std::unique_ptr<grpc_api::HandleEcNotificationRequest> request,
    const HandleEcNotificationCallback& callback) {
  DCHECK(handle_ec_event_request_callback_);

  auto response = std::make_unique<grpc_api::HandleEcNotificationResponse>();
  callback.Run(std::move(response));

  handle_ec_event_request_callback_->Run(request->type(), request->payload());
  handle_ec_event_request_callback_.reset();
}

}  // namespace diagnostics
