// Copyright 2014 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 "buffet/commands/dbus_command_proxy.h"

#include <chromeos/dbus/async_event_sequencer.h>
#include <chromeos/dbus/exported_object_manager.h>

#include "buffet/commands/command_instance.h"
#include "buffet/commands/prop_constraints.h"
#include "buffet/commands/prop_types.h"
#include "buffet/dbus_constants.h"

using chromeos::dbus_utils::AsyncEventSequencer;
using chromeos::dbus_utils::ExportedObjectManager;

namespace buffet {

DBusCommandProxy::DBusCommandProxy(ExportedObjectManager* object_manager,
                                   const scoped_refptr<dbus::Bus>& bus,
                                   CommandInstance* command_instance)
    : object_path_(dbus_constants::kCommandServicePathPrefix +
                   command_instance->GetID()),
      command_instance_(command_instance),
      dbus_object_(object_manager, bus, object_path_) {
}

void DBusCommandProxy::RegisterAsync(
      const AsyncEventSequencer::CompletionAction& completion_callback) {
  chromeos::dbus_utils::DBusInterface* itf =
    dbus_object_.AddOrGetInterface(dbus_constants::kCommandInterface);

  // DBus methods.
  itf->AddMethodHandler(dbus_constants::kCommandSetProgress,
                        base::Unretained(this),
                        &DBusCommandProxy::HandleSetProgress);
  itf->AddMethodHandler(dbus_constants::kCommandAbort,
                        base::Unretained(this),
                        &DBusCommandProxy::HandleAbort);
  itf->AddMethodHandler(dbus_constants::kCommandCancel,
                        base::Unretained(this),
                        &DBusCommandProxy::HandleCancel);
  itf->AddMethodHandler(dbus_constants::kCommandDone,
                        base::Unretained(this),
                        &DBusCommandProxy::HandleDone);

  // DBus properties.
  itf->AddProperty(dbus_constants::kCommandName, &name_);
  itf->AddProperty(dbus_constants::kCommandCategory, &category_);
  itf->AddProperty(dbus_constants::kCommandId, &id_);
  itf->AddProperty(dbus_constants::kCommandStatus, &status_);
  itf->AddProperty(dbus_constants::kCommandProgress, &progress_);
  itf->AddProperty(dbus_constants::kCommandParameters, &parameters_);

  // Set the initial property values before registering the DBus object.
  name_.SetValue(command_instance_->GetName());
  category_.SetValue(command_instance_->GetCategory());
  id_.SetValue(command_instance_->GetID());
  status_.SetValue(command_instance_->GetStatus());
  progress_.SetValue(command_instance_->GetProgress());
  // Convert a string-to-PropValue map into a string-to-Any map which can be
  // sent over D-Bus.
  chromeos::dbus_utils::Dictionary params;
  for (const auto& param_pair : command_instance_->GetParameters()) {
    params.insert(std::make_pair(param_pair.first,
                                 param_pair.second->GetValueAsAny()));
  }
  parameters_.SetValue(params);

  // Register the command DBus object and expose its methods and properties.
  dbus_object_.RegisterAsync(completion_callback);
}

void DBusCommandProxy::OnStatusChanged(const std::string& status) {
  status_.SetValue(status);
}

void DBusCommandProxy::OnProgressChanged(int progress) {
  progress_.SetValue(progress);
}

void DBusCommandProxy::HandleSetProgress(chromeos::ErrorPtr* error,
                                         int32_t progress) {
  LOG(INFO) << "Received call to Command<"
            << command_instance_->GetName() << ">::SetProgress("
            << progress << ")";

  // Validate |progress| parameter. Its value must be between 0 and 100.
  IntPropType progress_type;
  progress_type.AddMinMaxConstraint(0, 100);
  if (progress_type.ValidateValue(progress, error)) {
    command_instance_->SetProgress(progress);
  }
}

void DBusCommandProxy::HandleAbort(chromeos::ErrorPtr* error) {
  LOG(INFO) << "Received call to Command<"
            << command_instance_->GetName() << ">::Abort()";
  command_instance_->Abort();
}

void DBusCommandProxy::HandleCancel(chromeos::ErrorPtr* error) {
  LOG(INFO) << "Received call to Command<"
            << command_instance_->GetName() << ">::Cancel()";
  command_instance_->Cancel();
}

void DBusCommandProxy::HandleDone(chromeos::ErrorPtr* error) {
  LOG(INFO) << "Received call to Command<"
            << command_instance_->GetName() << ">::Done()";
  command_instance_->Done();
}


}  // namespace buffet
