// Copyright 2020 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 "init/periodic_scheduler.h"

#include <base/logging.h>
#include <base/strings/string_number_conversions.h>
#include <brillo/flag_helper.h>
#include <brillo/syslog_logging.h>

int main(int argc, char** argv) {
  DEFINE_uint64(period, 3600,
                "Time period (in seconds) between successive tasks.");
  DEFINE_uint64(timeout, 600, "Timeout (in seconds) before killing the task.");
  DEFINE_uint64(check_frequency, 0,
                "(For testing) Frequency to check task readiness.");
  DEFINE_string(spool_dir, "",
                "(For testing) Spool directory to store task state.");
  DEFINE_string(task_name, "", "Task name");
  DEFINE_bool(start_immediately, false,
              "Skip waiting before launching the first task instance.");

  brillo::FlagHelper::Init(argc, argv, "Periodic Task Scheduler");

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

  std::vector<std::string> args =
      base::CommandLine::ForCurrentProcess()->GetArgs();

  if (FLAGS_task_name.empty()) {
    FLAGS_task_name = base::FilePath(args[0]).BaseName().value();
  }

  PeriodicScheduler p(base::TimeDelta::FromSeconds(FLAGS_period),
                      base::TimeDelta::FromSeconds(FLAGS_timeout),
                      FLAGS_task_name, args);

  if (!FLAGS_spool_dir.empty())
    p.set_spool_dir_for_test(base::FilePath(FLAGS_spool_dir));

  if (FLAGS_check_frequency != 0) {
    p.set_check_freq_for_test(
        base::TimeDelta::FromSeconds(FLAGS_check_frequency));
  }

  return p.Run(FLAGS_start_immediately) == true ? 0 : 1;
}
