// 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 "croslog/config.h"

#include <memory>

#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"

#include <brillo/flag_helper.h>

namespace croslog {

bool Config::ParseCommandLineArgs(int argc, const char* const argv[]) {
  DEFINE_string(source, "plaintext", "Source of logs to read.");
  DEFINE_string(output, "short", "Controls type of format to show logs.");
  DEFINE_string(lines, "all", "Limit the maximum number of lines to show.");
  DEFINE_string(boot, "", "Show logs only from specified boot.");
  DEFINE_string(identifier, "", "Show logs only for the specified identifier.");
  DEFINE_string(priority, "all",
                "Show logs only for the specified priority or more important.");
  DEFINE_string(grep, "", "Show logs only matched with the specified regexp.");
  DEFINE_string(cursor, "", "Show logs starting from the specified cursor.");
  DEFINE_bool(quiet, false,
              "Suppress informational messages (not implemented yet).");
  DEFINE_bool(follow, false, "Show continiously new logs as they are written.");

  // "after-cursor" flag manual definition (the macro doesn't support a name
  // with hyphen)
  std::string FLAG_after_cursor;
  static const char kAfterCursorHelp[] =
      "Show logs starting after the specified cursor.";
  brillo::FlagHelper::GetInstance()->AddFlag(
      std::unique_ptr<brillo::Flag>(new brillo::StringFlag(
          "after-cursor", &FLAG_after_cursor, "", kAfterCursorHelp, true)));

  // "show-cursor" flag manual definition (the macro doesn't support a name with
  // hyphen)
  bool FLAGS_show_cursor = true;
  bool FLAGS_show_nocursor = false;
  static const char kShowCursorHelp[] =
      "Show the current cursor log logs at last.";
  brillo::FlagHelper::GetInstance()->AddFlag(
      std::unique_ptr<brillo::Flag>(new brillo::BoolFlag(
          "show-cursor", &FLAGS_show_cursor, &FLAGS_show_nocursor, "true",
          kShowCursorHelp, true)));
  brillo::FlagHelper::GetInstance()->AddFlag(
      std::unique_ptr<brillo::Flag>(new brillo::BoolFlag(
          "no-show-cursor", &FLAGS_show_nocursor, &FLAGS_show_cursor, "true",
          kShowCursorHelp, false)));

  // "pager" and "no-pager" flags manual definition (the macro doesn't support a
  // name with hyphen)
  bool FLAGS_pager = false;
  bool FLAGS_no_pager = true;
  static const char kPagerHelp[] =
      "Pipe the outout into pager (not implemented yet).";
  brillo::FlagHelper::GetInstance()->AddFlag(
      std::unique_ptr<brillo::Flag>(new brillo::BoolFlag(
          "pager", &FLAGS_pager, &FLAGS_no_pager, "false", kPagerHelp, true)));
  brillo::FlagHelper::GetInstance()->AddFlag(std::unique_ptr<brillo::Flag>(
      new brillo::BoolFlag("no-pager", &FLAGS_no_pager, &FLAGS_pager, "false",
                           kPagerHelp, false)));

  brillo::FlagHelper::Init(
      argc, argv,
      "Captures the stdout/stderr of the specified program and forward them "
      "to syslog.");

  const base::CommandLine* const command_line =
      base::CommandLine::ForCurrentProcess();

  bool result = true;

  if (FLAGS_source == "journal") {
    source = SourceMode::JOURNAL_LOG;
  } else if (FLAGS_source == "plaintext") {
    source = SourceMode::PLAINTEXT_LOG;
  } else {
    LOG(ERROR) << "Specified '--source' argument is invalid. "
               << "It must be 'journal' or 'plaintext'.";
    result = false;
  }

  if (base::CompareCaseInsensitiveASCII(FLAGS_output, "short") == 0) {
    output = OutputMode::SHORT;
  } else if (base::CompareCaseInsensitiveASCII(FLAGS_output, "export") == 0) {
    output = OutputMode::EXPORT;
  } else if (base::CompareCaseInsensitiveASCII(FLAGS_output, "json") == 0) {
    output = OutputMode::JSON;
  } else {
    LOG(ERROR) << "Specified '--output' argument is invalid. "
               << "It must be 'short', 'export' or 'json'.";
    result = false;
  }

  if (FLAGS_lines.empty()) {
    // Default value when the argument is specified without a value.
    lines = 10;
  } else if (base::ToLowerASCII(FLAGS_lines) == "all") {
    // Doesn't limit (same as the default behavior without the argument).
    lines = -1;
  } else if (base::StringToInt(FLAGS_lines, &lines)) {
    if (lines < 0) {
      LOG(ERROR) << "--lines argument value must be positive.";
      result = false;
    }
  } else {
    LOG(ERROR) << "--lines argument must be a number.";
    result = false;
  }

  // "--boot" distinguishes an empty argument and undefined.
  if (command_line->HasSwitch("boot")) {
    boot = FLAGS_boot;
  }

  identifier = FLAGS_identifier;

  if (FLAGS_priority.empty() || base::ToLowerASCII(FLAGS_priority) == "all") {
    severity = Severity::UNSPECIFIED;
  } else {
    // Supports only single priority, but doesn't support range.
    const std::string& severity_str =
        command_line->GetSwitchValueASCII("priority");
    severity = SeverityFromString(severity_str);
  }

  grep = FLAGS_grep;
  cursor = FLAGS_cursor;
  after_cursor = FLAG_after_cursor;
  show_cursor = FLAGS_show_cursor;
  quiet = FLAGS_quiet;
  no_pager = FLAGS_no_pager;
  follow = FLAGS_follow;

  return result;
}

}  // namespace croslog
