// Copyright 2022 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 "src/developer/debug/zxdb/console/command_sequence.h"

#include "src/developer/debug/shared/message_loop.h"
#include "src/developer/debug/shared/string_util.h"
#include "src/developer/debug/zxdb/console/console.h"
#include "src/lib/files/file.h"
#include "src/lib/fxl/strings/split_string.h"

namespace zxdb {

namespace {

// Returns a child CommandContext of the given one. Upon completion, this child will run the
// next command in the sequence.
fxl::RefPtr<CommandContext> MakeSequencedCommandContext(std::vector<std::string> commands,
                                                        size_t next_index,
                                                        fxl::RefPtr<CommandContext> cmd_context) {
  return fxl::MakeRefCounted<NestedCommandContext>(
      cmd_context,
      [commands = std::move(commands), next_index, cmd_context](const Err& err) mutable {
        if (err.has_error())
          return;  // Can't continue.

        if (next_index >= commands.size())
          return;  // Success.

        debug::MessageLoop::Current()->PostTask(
            FROM_HERE, [commands = std::move(commands), next_index, cmd_context]() {
              if (!cmd_context->console())
                return;

              std::string cur_line = commands[next_index];
              cmd_context->console()->ProcessInputLine(
                  cur_line,
                  MakeSequencedCommandContext(std::move(commands), next_index + 1,
                                              std::move(cmd_context)),
                  false);
            });
      });
}

}  // namespace

void RunCommandSequence(Console* console, std::vector<std::string> commands,
                        fxl::RefPtr<CommandContext> cmd_context) {
  if (commands.empty())
    return;

  auto weak_console = console->GetWeakPtr();
  std::string cur_line = commands[0];
  console->ProcessInputLine(
      cur_line, MakeSequencedCommandContext(std::move(commands), 1, std::move(cmd_context)), false);
}

ErrOr<std::vector<std::string>> ReadCommandsFromFile(const std::string& path) {
  std::string contents;
  if (!files::ReadFileToString(path, &contents))
    return Err("Could not read file \"" + path + "\"");

  std::vector<std::string> result;
  for (auto& cmd :
       fxl::SplitStringCopy(contents, "\n", fxl::kTrimWhitespace, fxl::kSplitWantNonEmpty)) {
    if (!cmd.empty() && !debug::StringStartsWith(cmd, "#"))
      result.push_back(std::move(cmd));
  }

  return result;
}

}  // namespace zxdb
