//===-- RunInTerminal.h ----------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_TOOLS_LLDB_VSCODE_RUNINTERMINAL_H
#define LLDB_TOOLS_LLDB_VSCODE_RUNINTERMINAL_H

#include "FifoFiles.h"

#include <future>
#include <thread>

namespace lldb_vscode {

enum RunInTerminalMessageKind {
  eRunInTerminalMessageKindPID = 0,
  eRunInTerminalMessageKindError,
  eRunInTerminalMessageKindDidAttach,
};

struct RunInTerminalMessage;
struct RunInTerminalMessagePid;
struct RunInTerminalMessageError;
struct RunInTerminalMessageDidAttach;

struct RunInTerminalMessage {
  RunInTerminalMessage(RunInTerminalMessageKind kind);

  virtual ~RunInTerminalMessage() = default;

  /// Serialize this object to JSON
  virtual llvm::json::Value ToJSON() const = 0;

  const RunInTerminalMessagePid *GetAsPidMessage() const;

  const RunInTerminalMessageError *GetAsErrorMessage() const;

  RunInTerminalMessageKind kind;
};

using RunInTerminalMessageUP = std::unique_ptr<RunInTerminalMessage>;

struct RunInTerminalMessagePid : RunInTerminalMessage {
  RunInTerminalMessagePid(lldb::pid_t pid);

  llvm::json::Value ToJSON() const override;

  lldb::pid_t pid;
};

struct RunInTerminalMessageError : RunInTerminalMessage {
  RunInTerminalMessageError(llvm::StringRef error);

  llvm::json::Value ToJSON() const override;

  std::string error;
};

struct RunInTerminalMessageDidAttach : RunInTerminalMessage {
  RunInTerminalMessageDidAttach();

  llvm::json::Value ToJSON() const override;
};

class RunInTerminalLauncherCommChannel {
public:
  RunInTerminalLauncherCommChannel(llvm::StringRef comm_file);

  /// Wait until the debug adaptor attaches.
  ///
  /// \param[in] timeout
  ///     How long to wait to be attached.
  //
  /// \return
  ///     An \a llvm::Error object in case of errors or if this operation times
  ///     out.
  llvm::Error WaitUntilDebugAdaptorAttaches(std::chrono::milliseconds timeout);

  /// Notify the debug adaptor this process' pid.
  ///
  /// \return
  ///     An \a llvm::Error object in case of errors or if this operation times
  ///     out.
  llvm::Error NotifyPid();

  /// Notify the debug adaptor that there's been an error.
  void NotifyError(llvm::StringRef error);

private:
  FifoFileIO m_io;
};

class RunInTerminalDebugAdapterCommChannel {
public:
  RunInTerminalDebugAdapterCommChannel(llvm::StringRef comm_file);

  /// Notify the runInTerminal launcher that it was attached.
  ///
  /// \return
  ///     A future indicated whether the runInTerminal launcher received the
  ///     message correctly or not.
  std::future<lldb::SBError> NotifyDidAttach();

  /// Fetch the pid of the runInTerminal launcher.
  ///
  /// \return
  ///     An \a llvm::Error object in case of errors or if this operation times
  ///     out.
  llvm::Expected<lldb::pid_t> GetLauncherPid();

  /// Fetch any errors emitted by the runInTerminal launcher or return a
  /// default error message if a certain timeout if reached.
  std::string GetLauncherError();

private:
  FifoFileIO m_io;
};

/// Create a fifo file used to communicate the debug adaptor with
/// the runInTerminal launcher.
llvm::Expected<std::shared_ptr<FifoFile>> CreateRunInTerminalCommFile();

} // namespace lldb_vscode

#endif // LLDB_TOOLS_LLDB_VSCODE_RUNINTERMINAL_H
