// Copyright 2016 The Fuchsia 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 <stdio.h>

#include <map>
#include <numeric>
#include <string>

#include "abigen_generator.h"
#include "syscall_parser.h"
#include "types.h"

using std::string;

constexpr Dispatch<AbigenGenerator> abigen_table[] = {
    // comments start with '#' and terminate at the end of line. this also handles #! reqs.
    {"#", nullptr, process_comment},
    // sycalls start with 'syscall' and terminate with ';'.
    {"syscall", ";", process_syscall},
    // table terminator.
    {nullptr, nullptr, nullptr}};

// =================================== driver ====================================================

int main(int argc, char* argv[]) {
  string output_prefix = "generated";
  bool verbose = false;
  bool generate_all = false;
  std::map<string, string> type_to_filename;

  argc--;
  argv++;
  while (argc > 0) {
    const string command(argv[0]);
    if (command[0] != '-')
      break;
    else if (get_type_to_generator().find(command.substr(1)) != get_type_to_generator().end()) {
      string type = command.substr(1);
      type_to_filename[type] = string(argv[1]);
      argc--;
      argv++;
    } else if (command == "-a") {
      generate_all = true;
    } else if (command == "-v") {
      verbose = true;
    } else if (command == "-o") {
      if (argc < 2) {
        fprintf(stderr, "no output prefix given\n");
        return -1;
      }
      output_prefix.assign(argv[1]);
      argc--;
      argv++;
    } else if (command == "-h") {
      fprintf(stderr,
              "usage: abigen [-a] [-v] [-o output_prefix] "
              "[-<type> filename] file1 ... fileN\n");
      const string delimiter = ", ";
      const string valid_types = std::accumulate(
          get_type_to_default_suffix().begin(), get_type_to_default_suffix().end(), std::string(),
          [delimiter](const std::string& s, const std::pair<const std::string, std::string>& p) {
            return s + (s.empty() ? std::string() : delimiter) + p.first;
          });
      fprintf(stderr, "\n       Valid <type>s: %s\n", valid_types.c_str());
      return 0;
    } else {
      fprintf(stderr, "unknown option: %s\n", command.c_str());
      return -1;
    }
    argc--;
    argv++;
  }
  if (argc < 1) {
    fprintf(stderr, "no syscall-spec input given\n");
    return -1;
  }

  // Use defaults for anything not specified.
  if (generate_all) {
    for (auto& entry : get_type_to_default_suffix()) {
      if (type_to_filename.find(entry.first) == type_to_filename.end()) {
        type_to_filename[entry.first] = output_prefix + entry.second;
      }
    }
  }

  AbigenGenerator generator(verbose);

  for (int ix = 0; ix < argc; ix++) {
    if (!run_parser(&generator, abigen_table, argv[ix], verbose))
      return 1;
  }
  return generator.Generate(type_to_filename) ? 0 : 1;
}
