// Copyright 2016 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 <sysexits.h>
#include <unistd.h>

#include <iomanip>
#include <iostream>
#include <map>
#include <string>

#include <client/linux/minidump_writer/linux_core_dumper.h>
#include <client/linux/minidump_writer/minidump_writer.h>

#include "crash-reporter/core-collector/coredump_writer.h"
#include "crash-reporter/core-collector/logging.h"

namespace {

struct Flag {
  std::string description;
  std::string value;
};

using Flags = std::map<std::string, Flag>;

const char kCoreSwitch[] = "--coredump";
const char kDumpSwitch[] = "--minidump";
const char kHelpSwitch[] = "--help";
const char kPrefixSwitch[] = "--prefix";
const char kProcSwitch[] = "--proc";

void PrintUsage(const Flags& flags);
bool ParseFlags(int argc, char* argv[], Flags* flags);

}  // namespace

const char* g_exec_name;

int main(int argc, char* argv[]) {
  g_exec_name = argv[0];

  Flags flags = {
      {kCoreSwitch, {"Stripped core dump", "core"}},
      {kDumpSwitch, {"Output minidump", "dump"}},
      {kPrefixSwitch, {"Root directory to which .so paths are relative", ""}},
      {kProcSwitch, {"Temporary directory for generated proc files", "/tmp"}},
  };

  if (argc == 2 && std::string(argv[1]) == kHelpSwitch) {
    PrintUsage(flags);
    return EX_OK;
  }

  if (!ParseFlags(argc, argv, &flags)) {
    LOG_ERROR << "See '" << g_exec_name << ' ' << kHelpSwitch << "' for usage";
    return EX_USAGE;
  }

  if (isatty(STDIN_FILENO)) {
    LOG_ERROR << "Core dump must be piped to standard input";
    return EX_USAGE;
  }

  const char *const core = flags.find(kCoreSwitch)->second.value.c_str(),
                    *const proc = flags.find(kProcSwitch)->second.value.c_str();

  CoredumpWriter writer(STDIN_FILENO, core, proc);
  const int error = writer.WriteCoredump();
  if (error != EX_OK) {
    LOG_ERROR << "Failed to write stripped core dump";
    return error;
  }

  const char *const dump = flags.find(kDumpSwitch)->second.value.c_str(),
                    *const prefix =
                        flags.find(kPrefixSwitch)->second.value.c_str();

  google_breakpad::MappingList mappings;
  google_breakpad::AppMemoryList memory_list;
  google_breakpad::LinuxCoreDumper dumper(/* unused */ -1, core, proc, prefix);
  if (!WriteMinidump(dump, mappings, memory_list, &dumper)) {
    LOG_ERROR << "Failed to convert core dump to minidump";
    return EX_SOFTWARE;
  }

  return EX_OK;
}

namespace {

void PrintUsage(const Flags& flags) {
  std::cout << "Generate minidump from core dump piped to standard input.\n"
            << std::endl;

  for (const auto& flag : flags)
    std::cout << std::setw(12) << flag.first << "  " << flag.second.description
              << " (default: \"" << flag.second.value << "\")" << std::endl;
}

bool ParseFlags(int argc, char* argv[], Flags* flags) {
  for (int i = 1; i < argc; ++i) {
    const char* const flag = argv[i];
    const auto it = flags->find(flag);

    if (it == flags->end()) {
      LOG_ERROR << "Invalid flag '" << flag << "'";
      return false;
    }

    if (++i == argc) {
      LOG_ERROR << "Missing value for flag '" << flag << "'";
      return false;
    }

    it->second.value = argv[i];
  }

  return true;
}

}  // namespace
