// 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 <base/command_line.h>
#include <base/files/file_path.h>
#include <base/logging.h>
#include <brillo/syslog_logging.h>

#include "oobe_config/metrics.h"
#include "oobe_config/oobe_config.h"

namespace oobe_config {

namespace {

void InitLog() {
  brillo::InitLog(brillo::kLogToSyslog | brillo::kLogToStderrIfTty);
  logging::SetLogItems(true /* enable_process_id */,
                       true /* enable_thread_id */, true /* enable_timestamp */,
                       true /* enable_tickcount */);
}

}  // namespace

}  // namespace oobe_config

const char kTestUnencrypted[] = "test-unencrypted";

int main(int argc, char* argv[]) {
  oobe_config::InitLog();

  oobe_config::Metrics metrics;

  base::CommandLine::Init(argc, argv);
  LOG(INFO) << "Starting oobe_config_save";
  base::CommandLine* cl = base::CommandLine::ForCurrentProcess();
  bool save_result;
  if (cl->HasSwitch(kTestUnencrypted)) {
    save_result = oobe_config::OobeConfig().UnencryptedRollbackSave();
  } else {
    save_result = oobe_config::OobeConfig().EncryptedRollbackSave();
  }

  if (!save_result) {
    LOG(ERROR) << "Failed to save rollback data";
    metrics.RecordSaveResult(
        oobe_config::Metrics::RollbackSaveResult::kStage2Failure);
    return 0;
  }

  LOG(INFO) << "Exiting oobe_config_save";
  metrics.RecordSaveResult(oobe_config::Metrics::RollbackSaveResult::kSuccess);
  return 0;
}
