// Copyright (c) 2012 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.

// This file is meant for debugging use to manually trigger a proper
// suspend, excercising the full path through the power manager.
// The actual work to suspend the system is done by powerd_suspend.
// This tool will block and only exit after it has received a D-Bus
// resume signal from powerd.

#include <unistd.h>

#include <memory>

#include <base/at_exit.h>
#include <base/bind.h>
#include <base/command_line.h>
#include <base/files/file_descriptor_watcher_posix.h>
#include <base/files/file_util.h>
#include <base/logging.h>
#include <base/message_loop/message_pump_type.h>
#include <base/run_loop.h>
#include <base/strings/string_number_conversions.h>
#include <base/threading/thread_task_runner_handle.h>
#include <base/task/single_thread_task_executor.h>
#include <base/time/time.h>
#include <brillo/flag_helper.h>
#include <brillo/file_utils.h>
#include <chromeos/dbus/service_constants.h>
#include <dbus/bus.h>
#include <dbus/message.h>
#include <dbus/object_proxy.h>

#include "power_manager/common/util.h"
#include "power_manager/proto_bindings/suspend.pb.h"

namespace {

// The sysfs entry that controls RTC wake alarms.  To set an alarm, write
// into this file the time of the alarm in seconds since the epoch.
const char kRtcWakeAlarmPath[] = "/sys/class/rtc/rtc0/wakealarm";

// Location of disable_dark_resume preference file. Writing 1 to this file
// disables dark resume.
const char kDisableDarkResumePath[] =
    "/var/lib/power_manager/disable_dark_resume";

std::string WakeupTypeToString(power_manager::SuspendDone::WakeupType type) {
  switch (type) {
    case power_manager::SuspendDone_WakeupType_INPUT:
      return "input";
    case power_manager::SuspendDone_WakeupType_OTHER:
      return "other";
    case power_manager::SuspendDone_WakeupType_NOT_APPLICABLE:
      return "not applicable";
    case power_manager::SuspendDone_WakeupType_UNKNOWN:
      return "not applicable";
  }
}

// Exits when powerd announces that the suspend attempt has completed.
void OnSuspendDone(base::RunLoop* run_loop,
                   bool print_wakeup_type,
                   dbus::Signal* signal) {
  if (print_wakeup_type) {
    power_manager::SuspendDone info;
    dbus::MessageReader reader(signal);
    CHECK(reader.PopArrayOfBytesAsProto(&info));
    LOG(INFO) << "Wakeup type: " << WakeupTypeToString(info.wakeup_type());
  }

  run_loop->Quit();
}

// Handles the result of an attempt to connect to a D-Bus signal.
void OnDBusSignalConnected(const std::string& interface,
                           const std::string& signal,
                           bool success) {
  CHECK(success) << "Unable to connect to " << interface << "." << signal;
}

// Invoked if a SuspendDone signal announcing resume isn't received before
// FLAGS_timeout.
void OnTimeout() {
  LOG(FATAL) << "Did not receive a " << power_manager::kSuspendDoneSignal
             << " signal within the timeout.";
}

class DarkResumeConfigurator {
 public:
  explicit DarkResumeConfigurator(bool disable) {
    // Store previous setting of dark resume.
    dark_resume_pref_exist_before_ =
        base::PathExists(base::FilePath(kDisableDarkResumePath));
    if (dark_resume_pref_exist_before_) {
      if (!base::ReadFileToString(base::FilePath(kDisableDarkResumePath),
                                  &prev_dark_resume_pref_state_)) {
        PLOG(ERROR) << "Failed to read previous dark resume state from "
                    << kDisableDarkResumePath;
        exit(1);
      }
    }

    if (!SetDarkResumeState(disable ? "1" : "0"))
      exit(1);
  }
  ~DarkResumeConfigurator() {
    // Restore dark resume state.
    if (!dark_resume_pref_exist_before_) {
      if (!base::DeleteFile(base::FilePath(kDisableDarkResumePath)))
        PLOG(ERROR) << "Failed to restore dark resume state.";
    } else if (!SetDarkResumeState(prev_dark_resume_pref_state_)) {
      PLOG(ERROR) << "Failed to restore dark resume state.";
    }
  }

 private:
  bool SetDarkResumeState(std::string state) {
    auto dark_resume_pref_path = base::FilePath(kDisableDarkResumePath);

    if (!base::CreateDirectory(dark_resume_pref_path.DirName())) {
      PLOG(ERROR) << "Failed to create parent directories for "
                  << kDisableDarkResumePath;
      return false;
    }

    if (!brillo::WriteStringToFile(dark_resume_pref_path, state)) {
      PLOG(ERROR) << "Failed to write " << state << " to "
                  << kDisableDarkResumePath;
      return false;
    }
    return true;
  }

  // Whether |kDisableDarkResumePath| exist before the script start.
  bool dark_resume_pref_exist_before_ = false;
  // Used to Store the original preference in |kDisableDarkResumePath| if the
  // file exist(dark_resume_pref_exist_before_) before the start of the script.
  std::string prev_dark_resume_pref_state_;
};

}  // namespace

int main(int argc, char* argv[]) {
  DEFINE_int32(delay, 1,
               "Delay before suspending in seconds. Useful if "
               "running interactively to ensure that typing this command "
               "isn't recognized as user activity that cancels the suspend "
               "request.");
  DEFINE_int32(timeout, 0, "How long to wait for a resume signal in seconds.");
  DEFINE_uint64(wakeup_count, 0,
                "Wakeup count to pass to powerd or 0 if "
                "unset.");
  DEFINE_int32(wakeup_timeout, 0,
               "Sets an RTC alarm immediately that fires after the given "
               "interval. This ensures that device resumes while testing "
               "remotely.");
  DEFINE_int32(suspend_for_sec, 0,
               "Ask powerd to suspend the device for this many seconds. powerd "
               "then sets an alarm just before going to suspend.");
  DEFINE_bool(print_wakeup_type, false, "Print wakeup type of last resume.");
  DEFINE_bool(disable_dark_resume, true,
              "whether or not to disable dark resume before suspend. Resets to "
              "previous preference on resume. Defaults to True.");

  brillo::FlagHelper::Init(argc, argv,
                           "Instruct powerd to suspend the system.");
  base::AtExitManager at_exit_manager;
  base::SingleThreadTaskExecutor task_executor(base::MessagePumpType::IO);
  base::FileDescriptorWatcher watcher(task_executor.task_runner());

  dbus::Bus::Options options;
  options.bus_type = dbus::Bus::SYSTEM;
  scoped_refptr<dbus::Bus> bus(new dbus::Bus(options));
  CHECK(bus->Connect());
  dbus::ObjectProxy* powerd_proxy = bus->GetObjectProxy(
      power_manager::kPowerManagerServiceName,
      dbus::ObjectPath(power_manager::kPowerManagerServicePath));

  if (FLAGS_delay)
    sleep(FLAGS_delay);

  // Set an RTC alarm to wake up the system.
  if (FLAGS_wakeup_timeout > 0) {
    std::string alarm_string = "+" + base::NumberToString(FLAGS_wakeup_timeout);
    // Write 0 first to clear any existing RTC alarm.
    CHECK(power_manager::util::WriteFileFully(base::FilePath(kRtcWakeAlarmPath),
                                              "0", 1));
    CHECK(power_manager::util::WriteFileFully(base::FilePath(kRtcWakeAlarmPath),
                                              alarm_string.c_str(),
                                              alarm_string.length()));
  }

  // Enables/Disables dark resume for this script run based on
  // |FLAGS_disable_dark_resume|. Restores the original preference on exit.
  DarkResumeConfigurator dark_resume_configurator(FLAGS_disable_dark_resume);
  base::RunLoop run_loop;
  powerd_proxy->ConnectToSignal(
      power_manager::kPowerManagerInterface, power_manager::kSuspendDoneSignal,
      base::Bind(&OnSuspendDone, &run_loop, FLAGS_print_wakeup_type),
      base::Bind(&OnDBusSignalConnected));

  // Send a suspend request.
  dbus::MethodCall method_call(power_manager::kPowerManagerInterface,
                               power_manager::kRequestSuspendMethod);
  if (FLAGS_wakeup_count) {
    dbus::MessageWriter writer(&method_call);
    writer.AppendUint64(FLAGS_wakeup_count);
  }
  // Pass suspend_for_sec to the daemon.
  if (FLAGS_suspend_for_sec) {
    dbus::MessageWriter writer(&method_call);
    writer.AppendInt32(FLAGS_suspend_for_sec);
  }
  std::unique_ptr<dbus::Response> response(powerd_proxy->CallMethodAndBlock(
      &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT));
  CHECK(response) << power_manager::kRequestSuspendMethod << " failed";

  // Schedule a task to fire after the timeout.
  if (FLAGS_timeout) {
    base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
        FROM_HERE, base::Bind(&OnTimeout),
        base::TimeDelta::FromSeconds(FLAGS_timeout));
  }

  run_loop.Run();

  return 0;
}
