// 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 "vm_tools/notificationd/dbus_service.h"

#include <map>
#include <string>
#include <utility>
#include <vector>

#include <base/bind.h>
#include <base/memory/ptr_util.h>

namespace {

const char kNotificationsServiceName[] = "org.freedesktop.Notifications";
const char kNotificationsServicePath[] = "/org/freedesktop/Notifications";

void HandleSynchronousDBusMethodCall(
    base::Callback<std::unique_ptr<dbus::Response>(dbus::MethodCall*)> handler,
    dbus::MethodCall* method_call,
    dbus::ExportedObject::ResponseSender response_sender) {
  auto response = handler.Run(method_call);
  if (!response)
    response = dbus::Response::FromMethodCall(method_call);

  std::move(response_sender).Run(std::move(response));
}

std::unique_ptr<dbus::ErrorResponse> GetErrorResponseWithLog(
    dbus::MethodCall* method_call,
    const std::string& type,
    const std::string& message) {
  LOG(ERROR) << message;
  return dbus::ErrorResponse::FromMethodCall(method_call, type, message);
}

bool PopStringArray(dbus::MessageReader* reader,
                    std::vector<std::string>* value) {
  dbus::MessageReader array_reader(nullptr);
  if (!reader->PopArray(&array_reader))
    return false;

  while (array_reader.HasMoreData()) {
    std::string data;
    if (!array_reader.PopString(&data))
      return false;
    value->push_back(std::move(data));
  }
  return true;
}

bool PopStringVariantDict(dbus::MessageReader* reader,
                          std::map<std::string, std::string>* value) {
  dbus::MessageReader array_reader(nullptr);
  if (!reader->PopArray(&array_reader))
    return false;

  while (array_reader.HasMoreData()) {
    dbus::MessageReader dict_entry_reader(nullptr);
    if (!array_reader.PopDictEntry(&dict_entry_reader))
      return false;
    // We just skip to parse entries because thier values (not key) may contain
    // complex variant parameters.
    // TODO(toshikikikuchi): Add reader for variant parameters.
  }
  return true;
}

}  // namespace

namespace vm_tools {
namespace notificationd {

DBusService::DBusService(DBusInterface* interface) : interface_(interface) {}

// static
std::unique_ptr<DBusService> DBusService::Create(DBusInterface* interface) {
  auto service = base::WrapUnique(new DBusService(interface));

  if (!service->Init())
    return nullptr;

  return service;
}

void DBusService::SendNotificationClosedSignal(uint32_t id,
                                               ClosedReason reason) {
  dbus::Signal signal(kNotificationsServiceName, "NotificationClosed");
  dbus::MessageWriter writer(&signal);
  writer.AppendUint32(id);
  writer.AppendUint32(static_cast<uint32_t>(reason));
  exported_object_->SendSignal(&signal);
}

void DBusService::SendActionInvokedSignal(uint32_t id,
                                          const std::string& action_key) {
  dbus::Signal signal(kNotificationsServiceName, "ActionInvoked");
  dbus::MessageWriter writer(&signal);
  writer.AppendUint32(id);
  writer.AppendString(action_key);
  exported_object_->SendSignal(&signal);
}

bool DBusService::RegisterMethods() {
  using ServiceMethod =
      std::unique_ptr<dbus::Response> (DBusService::*)(dbus::MethodCall*);
  const std::map<const char*, ServiceMethod> kServiceMethods = {
      {"GetCapabilities", &DBusService::CallGetCapabilities},
      {"Notify", &DBusService::CallNotify},
      {"GetServerInformation", &DBusService::CallGetServerInformation},
      {"CloseNotification", &DBusService::CallCloseNotification},
  };

  for (const auto& iter : kServiceMethods) {
    const bool ret = exported_object_->ExportMethodAndBlock(
        kNotificationsServiceName, iter.first,
        base::Bind(&HandleSynchronousDBusMethodCall,
                   base::Bind(iter.second, base::Unretained(this))));
    if (!ret) {
      LOG(ERROR) << "Failed to export method " << iter.first;
      return false;
    }
  }

  return true;
}

std::unique_ptr<dbus::Response> DBusService::CallGetCapabilities(
    dbus::MethodCall* method_call) {
  std::unique_ptr<dbus::Response> dbus_response(
      dbus::Response::FromMethodCall(method_call));

  std::vector<std::string> out_capabilities;
  if (!interface_->GetCapabilities(&out_capabilities)) {
    return GetErrorResponseWithLog(method_call, DBUS_ERROR_FAILED,
                                   "Failed to call GetCapabilities");
  }

  dbus::MessageWriter writer(dbus_response.get());
  dbus::MessageWriter array_writer(nullptr);
  writer.OpenArray(DBUS_TYPE_STRING_AS_STRING, &array_writer);
  for (const auto& cap : out_capabilities) {
    array_writer.AppendString(cap);
  }
  writer.CloseContainer(&array_writer);

  return dbus_response;
}

std::unique_ptr<dbus::Response> DBusService::CallNotify(
    dbus::MethodCall* method_call) {
  std::unique_ptr<dbus::Response> dbus_response(
      dbus::Response::FromMethodCall(method_call));

  dbus::MessageReader reader(method_call);
  DBusInterface::NotifyArgument input;

  const auto valid_args = reader.PopString(&input.app_name) &&
                          reader.PopUint32(&input.replaces_id) &&
                          reader.PopString(&input.app_icon) &&
                          reader.PopString(&input.summary) &&
                          reader.PopString(&input.body) &&
                          PopStringArray(&reader, &input.actions) &&
                          PopStringVariantDict(&reader, &input.hints) &&
                          reader.PopInt32(&input.expire_timeout);

  if (!valid_args) {
    return GetErrorResponseWithLog(method_call, DBUS_ERROR_INVALID_ARGS,
                                   "Invalid args for Notify");
  }

  uint32_t out_id;
  if (!interface_->Notify(input, &out_id)) {
    return GetErrorResponseWithLog(method_call, DBUS_ERROR_FAILED,
                                   "Failed to call Notify");
  }

  dbus::MessageWriter writer(dbus_response.get());
  writer.AppendUint32(out_id);

  return dbus_response;
}

std::unique_ptr<dbus::Response> DBusService::CallGetServerInformation(
    dbus::MethodCall* method_call) {
  std::unique_ptr<dbus::Response> dbus_response(
      dbus::Response::FromMethodCall(method_call));

  DBusInterface::ServerInformation output;

  if (!interface_->GetServerInformation(&output)) {
    return GetErrorResponseWithLog(method_call, DBUS_ERROR_FAILED,
                                   "Failed to call GetServerInformation");
  }

  dbus::MessageWriter writer(dbus_response.get());
  writer.AppendString(std::move(output.name));
  writer.AppendString(std::move(output.vendor));
  writer.AppendString(std::move(output.version));
  writer.AppendString(std::move(output.spec_version));

  return dbus_response;
}

std::unique_ptr<dbus::Response> DBusService::CallCloseNotification(
    dbus::MethodCall* method_call) {
  std::unique_ptr<dbus::Response> dbus_response(
      dbus::Response::FromMethodCall(method_call));

  dbus::MessageReader reader(method_call);

  uint32_t id = 0;
  if (!reader.PopUint32(&id)) {
    return GetErrorResponseWithLog(method_call, DBUS_ERROR_INVALID_ARGS,
                                   "Invalid args for CloseNotification");
  }

  if (!interface_->CloseNotification(id)) {
    return GetErrorResponseWithLog(method_call, DBUS_ERROR_FAILED,
                                   "Failed to call CloseNotification");
  }

  return dbus_response;
}

bool DBusService::Init() {
  bus_ = new dbus::Bus(dbus::Bus::Options());
  if (!bus_->Connect()) {
    LOG(ERROR) << "Failed to connect to session bus";
    return false;
  }

  exported_object_ =
      bus_->GetExportedObject(dbus::ObjectPath(kNotificationsServicePath));
  if (!exported_object_) {
    LOG(ERROR) << "Failed to export " << kNotificationsServicePath << " object";
    return false;
  }

  if (!RegisterMethods()) {
    LOG(ERROR) << "Failed to export methods";
    return false;
  }

  if (!bus_->RequestOwnershipAndBlock(kNotificationsServiceName,
                                      dbus::Bus::REQUIRE_PRIMARY)) {
    LOG(ERROR) << "Unable to take ownership of " << kNotificationsServiceName;
    return false;
  }

  return true;
}

}  // namespace notificationd
}  // namespace vm_tools
