/*
 * Copyright 2015 WebAssembly Community Group participants
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "support/command-line.h"
#include "config.h"
#include "support/debug.h"
#include "support/path.h"

#ifdef USE_WSTRING_PATHS
#ifndef NOMINMAX
#define NOMINMAX
#endif
#include <windows.h>

#include <shellapi.h>
#endif

using namespace wasm;

#ifndef SCREEN_WIDTH
#define SCREEN_WIDTH 80
#endif

void printWrap(std::ostream& os, int leftPad, const std::string& content) {
  int len = content.size();
  int space = SCREEN_WIDTH - leftPad;
  std::string nextWord;
  std::string pad(leftPad, ' ');
  for (int i = 0; i <= len; ++i) {
    if (i != len && content[i] != ' ' && content[i] != '\n') {
      nextWord += content[i];
    } else {
      if (static_cast<int>(nextWord.size()) > space) {
        os << '\n' << pad;
        space = SCREEN_WIDTH - leftPad;
      }
      os << nextWord;
      space -= nextWord.size();
      nextWord.clear();
      if (i < len) {
        if (content[i] == ' ') {
          if (space > 0) {
            os << ' ';
            space -= 1;
          }
        } else if (content[i] == '\n') {
          os << '\n';
          space = SCREEN_WIDTH - leftPad;
        }
      }
    }
  }
}

Options::Options(const std::string& command, const std::string& description)
  : debug(false), positional(Arguments::Zero) {
  std::string GeneralOption = "General options";

  if (getenv("BINARYEN_DEBUG")) {
    setDebugEnabled(getenv("BINARYEN_DEBUG"));
  }

  add("--version",
      "",
      "Output version information and exit",
      GeneralOption,
      Arguments::Zero,
      [command](Options*, const std::string&) {
        std::cout << command << " version " << PROJECT_VERSION << '\n';
        exit(0);
      });
  add("--help",
      "-h",
      "Show this help message and exit",
      GeneralOption,
      Arguments::Zero,
      [this, command, description](Options* o, const std::string&) {
        for (size_t i = 0; i < SCREEN_WIDTH; i++) {
          std::cout << '=';
        }
        std::cout << '\n';
        std::cout << command;
        if (positional != Arguments::Zero) {
          std::cout << ' ' << positionalName;
        }
        std::cout << "\n\n";
        printWrap(std::cout, 0, description);
        std::cout << '\n';
        for (size_t i = 0; i < SCREEN_WIDTH; i++) {
          std::cout << '=';
        }
        std::cout << '\n';
        size_t optionWidth = 0;
        for (const auto& o : options) {
          if (o.hidden) {
            continue;
          }
          optionWidth =
            std::max(optionWidth, o.longName.size() + o.shortName.size());
        }
        for (int i = int(categories.size()) - 1; i >= 0; i--) {
          auto& category = categories[i];
          std::cout << "\n\n" << category << ":\n";
          for (size_t i = 0; i < category.size() + 1; i++) {
            std::cout << '-';
          }
          std::cout << '\n';
          for (const auto& o : options) {
            if (o.hidden || o.category != category) {
              continue;
            }
            std::cout << '\n';
            bool long_n_short =
              o.longName.size() != 0 && o.shortName.size() != 0;
            size_t pad =
              1 + optionWidth - o.longName.size() - o.shortName.size();
            std::cout << "  " << o.longName << (long_n_short ? ',' : ' ')
                      << o.shortName << std::string(pad, ' ');
            printWrap(std::cout, optionWidth + 4, o.description);
            std::cout << '\n';
          }
        }
        std::cout << '\n';
        exit(EXIT_SUCCESS);
      });
  add("--debug",
      "-d",
      "Print debug information to stderr",
      GeneralOption,
      Arguments::Optional,
      [&](Options* o, const std::string& arguments) {
        debug = true;
        setDebugEnabled(arguments.c_str());
      });
}

Options::~Options() {}

Options& Options::add(const std::string& longName,
                      const std::string& shortName,
                      const std::string& description,
                      const std::string& category,
                      Arguments arguments,
                      const Action& action,
                      bool hidden) {
  options.push_back(
    {longName, shortName, description, category, arguments, action, hidden, 0});

  if (std::find(categories.begin(), categories.end(), category) ==
      categories.end()) {
    categories.push_back(category);
  }

  return *this;
}

Options& Options::add_positional(const std::string& name,
                                 Arguments arguments,
                                 const Action& action) {
  positional = arguments;
  positionalName = name;
  positionalAction = action;
  return *this;
}

void Options::parse(int argc, const char* argv[]) {

// On Windows, get the wide char version of the command line flags, and convert
// each one to std::string with UTF-8 manually. This means that all paths in
// Binaryen are stored this way on all platforms right up until a library call
// is made to open a file (at which point we use Path::to_path to convert back)
// so that it works with the underlying Win32 APIs.
// Only argList (and not argv) should be used below.
#ifdef USE_WSTRING_PATHS
  LPWSTR* argListW = CommandLineToArgvW(GetCommandLineW(), &argc);
  std::vector<std::string> argList;
  for (size_t i = 0, e = argc; i < e; ++i) {
    argList.push_back(wasm::Path::wstring_to_string(argListW[i]));
  }
#else
  const char** argList = argv;
#endif

  assert(argc > 0 && "expect at least program name as an argument");
  size_t positionalsSeen = 0;
  auto dashes = [](const std::string& s) {
    for (size_t i = 0; i < s.size(); ++i) {
      if (s[i] != '-') {
        return i;
      }
    }
    return s.size();
  };
  for (size_t i = 1, e = argc; i != e; ++i) {
    std::string currentOption = argList[i];

    // "-" alone is a positional option
    if (dashes(currentOption) == 0 || currentOption == "-") {
      // Positional.
      switch (positional) {
        case Arguments::Zero:
          // Optional arguments must use --flag=A format, and not separated by
          // spaces (which would be ambiguous).
        case Arguments::Optional:
          std::cerr << "Unexpected positional argument '" << currentOption
                    << "'\n";
          exit(EXIT_FAILURE);
        case Arguments::One:
          if (positionalsSeen) {
            std::cerr << "Unexpected second positional argument '"
                      << currentOption << "' for " << positionalName << '\n';
            exit(EXIT_FAILURE);
          }
          [[fallthrough]];
        case Arguments::N:
          positionalAction(this, currentOption);
          ++positionalsSeen;
          break;
      }
      continue;
    }

    // Non-positional.
    std::string argument;
    bool explicitArg = false;
    auto equal = currentOption.find_first_of('=');
    if (equal != std::string::npos) {
      argument = currentOption.substr(equal + 1);
      currentOption = currentOption.substr(0, equal);
      explicitArg = true;
    }
    Option* option = nullptr;
    for (auto& o : options) {
      if (o.longName == currentOption || o.shortName == currentOption) {
        option = &o;
      }
    }
    if (!option) {
      std::cerr << "Unknown option '" << currentOption << "'\n";
      exit(EXIT_FAILURE);
    }
    switch (option->arguments) {
      case Arguments::Zero:
        if (argument.size()) {
          std::cerr << "Unexpected argument '" << argument << "' for option '"
                    << currentOption << "'\n";
          exit(EXIT_FAILURE);
        }
        break;
      case Arguments::One:
        if (option->seen) {
          std::cerr << "Unexpected second argument '" << argument << "' for '"
                    << currentOption << "'\n";
          exit(EXIT_FAILURE);
        }
        [[fallthrough]];
      case Arguments::N:
        if (!argument.size() && !explicitArg) {
          if (i + 1 == e) {
            std::cerr << "Couldn't find expected argument for '"
                      << currentOption << "'\n";
            exit(EXIT_FAILURE);
          }
          argument = argList[++i];
        }
        break;
      case Arguments::Optional:
        break;
    }
    option->action(this, argument);
    ++option->seen;
  }
}
