//===-- LSPClient.h - Helper for ClangdLSPServer tests ----------*- 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
//
//===----------------------------------------------------------------------===//

#include <condition_variable>
#include <deque>
#include <llvm/ADT/Optional.h>
#include <llvm/Support/Error.h>
#include <llvm/Support/JSON.h>
#include <mutex>

namespace clang {
namespace clangd {
class Transport;

// A client library for talking to ClangdLSPServer in tests.
// Manages serialization of messages, pairing requests/repsonses, and implements
// the Transport abstraction.
class LSPClient {
  class TransportImpl;
  std::unique_ptr<TransportImpl> T;

public:
  // Represents the result of an LSP call: a promise for a result or error.
  class CallResult {
  public:
    ~CallResult();
    // Blocks up to 10 seconds for the result to be ready.
    // Records a test failure if there was no reply.
    llvm::Expected<llvm::json::Value> take();
    // Like take(), but records a test failure if the result was an error.
    llvm::json::Value takeValue();

  private:
    // Should be called once to provide the value.
    void set(llvm::Expected<llvm::json::Value> V);

    llvm::Optional<llvm::Expected<llvm::json::Value>> Value;
    std::mutex Mu;
    std::condition_variable CV;

    friend TransportImpl; // Calls set().
  };

  LSPClient();
  ~LSPClient();
  LSPClient(LSPClient &&) = delete;
  LSPClient &operator=(LSPClient &&) = delete;

  // Enqueue an LSP method call, returns a promise for the reply. Threadsafe.
  CallResult &call(llvm::StringRef Method, llvm::json::Value Params);
  // Enqueue an LSP notification. Threadsafe.
  void notify(llvm::StringRef Method, llvm::json::Value Params);
  // Returns matching notifications since the last call to takeNotifications.
  std::vector<llvm::json::Value> takeNotifications(llvm::StringRef Method);
  // The transport is shut down after all pending messages are sent.
  void stop();

  // Shorthand for common LSP methods. Relative paths are passed to testPath().
  static llvm::json::Value uri(llvm::StringRef Path);
  static llvm::json::Value documentID(llvm::StringRef Path);
  void didOpen(llvm::StringRef Path, llvm::StringRef Content);
  void didChange(llvm::StringRef Path, llvm::StringRef Content);
  void didClose(llvm::StringRef Path);
  // Blocks until the server is idle (using the 'sync' protocol extension).
  void sync();
  // sync()s to ensure pending diagnostics arrive, and returns the newest set.
  llvm::Optional<std::vector<llvm::json::Value>>
  diagnostics(llvm::StringRef Path);

  // Get the transport used to connect this client to a ClangdLSPServer.
  Transport &transport();

private:
};

} // namespace clangd
} // namespace clang
