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

// Make sure to pass (at least) cheets_SELinuxTest, cheets_ContainerMount,
// cheets_DownloadsFilesystem, cheets_FileSystemPermissions, and
// cheets_PerfBoot auto tests.
//
// For unit testing, see arc_setup_util_unittest.cc.

#include <string>

#include <base/at_exit.h>
#include <base/command_line.h>
#include <base/files/file_path.h>
#include <base/timer/elapsed_timer.h>
#include <base/logging.h>
#include <brillo/flag_helper.h>
#include <brillo/syslog_logging.h>

#include "arc/setup/arc_setup.h"

namespace {

constexpr char kConfigJson[] = "/usr/share/arc-setup/config.json";

arc::Mode GetMode(const std::string& mode) {
  static constexpr std::pair<const char*, arc::Mode> kModeNameMapping[] = {
      {"setup", arc::Mode::SETUP},
      {"boot-continue", arc::Mode::BOOT_CONTINUE},
      {"stop", arc::Mode::STOP},
      {"onetime-setup", arc::Mode::ONETIME_SETUP},
      {"onetime-stop", arc::Mode::ONETIME_STOP},
      {"pre-chroot", arc::Mode::PRE_CHROOT},
      {"read-ahead", arc::Mode::READ_AHEAD},
      {"remove-data", arc::Mode::REMOVE_DATA},
      {"mount-sdcard", arc::Mode::MOUNT_SDCARD},
      {"unmount-sdcard", arc::Mode::UNMOUNT_SDCARD},
      {"update-restorecon-last", arc::Mode::UPDATE_RESTORECON_LAST},
  };
  for (const auto& mode_name : kModeNameMapping) {
    if (mode == mode_name.first)
      return mode_name.second;
  }

  CHECK(false) << "Invalid mode '" << mode << "'";
  return arc::Mode::UNKNOWN;
}

}  // namespace

int main(int argc, char** argv) {
  DEFINE_string(log_tag, "", "Tag to be used in syslog");
  DEFINE_string(mode, "", "arc-setup mode of operation");

  base::ElapsedTimer timer;
  base::AtExitManager at_exit;

  brillo::FlagHelper::Init(argc, argv, "ARC setup");

  CHECK(!FLAGS_log_tag.empty()) << "Must specify --log_tag";
  brillo::OpenLog(FLAGS_log_tag.c_str(), true /*log_pid*/);

  brillo::InitLog(brillo::kLogToSyslog | brillo::kLogHeader |
                  brillo::kLogToStderrIfTty);

  const std::string command_line =
      base::CommandLine::ForCurrentProcess()->GetCommandLineString();
  LOG(INFO) << "Starting " << command_line;
  {
    arc::ArcSetup setup(GetMode(FLAGS_mode), base::FilePath(kConfigJson));
    setup.Run();
  }
  LOG(INFO) << command_line << " took "
            << timer.Elapsed().InMillisecondsRoundedUp() << "ms";
  return 0;
}
