// Copyright 2019 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 "console.h"

#include <optional>
#include <string>
#include <vector>

#include "src/developer/shell/josh/console/command_line_options.h"
#include "src/developer/shell/josh/console/li.h"
#include "src/developer/shell/josh/lib/runtime.h"
#include "third_party/quickjs/quickjs-libc.h"
#include "third_party/quickjs/quickjs.h"

namespace shell {

extern "C" const uint8_t qjsc_repl[];
extern "C" const uint32_t qjsc_repl_size;

extern "C" const uint8_t qjsc_repl_init[];
extern "C" const uint32_t qjsc_repl_init_size;

int ConsoleMain(int argc, const char **argv) {
  CommandLineOptions options;
  std::vector<std::string> params;

  cmdline::Status status = ParseCommandLine(argc, argv, &options, &params);
  if (status.has_error()) {
    fprintf(stderr, "%s\n", status.error_message().c_str());
    return 1;
  }

  Runtime rt;
  if (rt.Get() == nullptr) {
    fprintf(stderr, "Cannot allocate JS runtime");
    return 1;
  }

  Context ctx(&rt);
  if (ctx.Get() == nullptr) {
    fprintf(stderr, "Cannot allocate JS context");
    return 1;
  }

  if (!ctx.InitStd()) {
    ctx.DumpError();
    return 1;
  }

  if (!ctx.InitBuiltins(options.fidl_ir_path[0], options.boot_js_lib_path[0])) {
    ctx.DumpError();
    return 1;
  }

  JSContext *ctx_ptr = ctx.Get();

  // TODO(jeremymanson): The second and third parameter below let you define properties on the
  // command line, which might be nice at some point.
  js_std_add_helpers(ctx_ptr, 0, nullptr);

  if (!options.command_string) {
    if (!options.line_editor) {
      // Use the qjs repl for the time being.
      js_std_eval_binary(ctx_ptr, qjsc_repl, qjsc_repl_size, 0);
    } else {
      if (li::LiModuleInit(ctx_ptr, "li_internal") == nullptr) {
        ctx.DumpError();
        return 1;
      }
      js_std_eval_binary(ctx_ptr, qjsc_repl_init, qjsc_repl_init_size, 0);
    }
  } else {
    const char *command = options.command_string->c_str();
    JSValue result = JS_Eval(ctx_ptr, command, options.command_string->length(), "batch", 0);
    if (JS_IsException(result)) {
      ctx.DumpError();
      return 1;
    }
  }
  js_std_loop(ctx_ptr);

  return 0;
}

}  // namespace shell
