// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'dart:async';
import 'dart:convert';
import 'dart:io';

Future<void> main(List<String> args) async {
  print('''
================================================================================
  Stress test tool for language-server protocol.

  Example run:
  out/ReleaseX64/dart-sdk/bin/dart \\
     pkg/analysis_server/tool/lspTestWithParameters.dart \\
     --root=pkg/analysis_server \\
     --sdk=out/ReleaseX64/dart-sdk/ \\
     --click=pkg/analyzer/lib/src/dart/analysis/driver.dart \\
     --line=506 \\
     --column=20

  Additional options:
  -v / --verbose     Be more verbose. Specify several times for more verbosity.
  --verbosity=<int>  Set verbosity directly. Defaults to 0. A higher number is
                     more verbose.
  --every=<int>      Set how often - in ms - to fire an event. Defaults to 100.

================================================================================
''');
  {
    Uri exe = Uri.base.resolve(Platform.resolvedExecutable);
    Uri librariesDart =
        exe.resolve('../lib/_internal/sdk_library_metadata/lib/libraries.dart');
    if (!File.fromUri(librariesDart).existsSync()) {
      throw 'Execute with a dart that has '
          "'../lib/_internal/sdk_library_metadata/lib/libraries.dart' "
          'available (e.g. out/ReleaseX64/dart-sdk/bin/dart)';
    }
  }
  Uri? rootUri;
  Uri? sdkUri;
  Uri? clickOnUri;
  int? clickLine;
  int? clickColumn;
  int everyMs = 100;
  for (String arg in args) {
    if (arg.startsWith('--root=')) {
      rootUri = Uri.base.resolve(arg.substring('--root='.length).trim());
    } else if (arg.startsWith('--sdk=')) {
      sdkUri = Uri.base.resolve(arg.substring('--sdk='.length).trim());
    } else if (arg.startsWith('--click=')) {
      clickOnUri = Uri.base.resolve(arg.substring('--click='.length).trim());
    } else if (arg.startsWith('--line=')) {
      clickLine = int.parse(arg.substring('--line='.length).trim());
    } else if (arg.startsWith('--column=')) {
      clickColumn = int.parse(arg.substring('--column='.length).trim());
    } else if (arg.startsWith('--every=')) {
      everyMs = int.parse(arg.substring('--every='.length).trim());
    } else if (arg == '--verbose' || arg == '-v') {
      verbosity++;
    } else if (arg.startsWith('--verbosity=')) {
      verbosity = int.parse(arg.substring('--verbosity='.length).trim());
    } else {
      throw 'Unknown argument: $arg';
    }
  }

  if (rootUri == null) {
    throw "Didn't get a root uri. Specify with --root=";
  }
  if (!Directory.fromUri(rootUri).existsSync()) {
    throw "Directory $rootUri doesn't exist. "
        'Specify existing directory with --root=';
  }

  if (sdkUri == null) {
    throw "Didn't get a sdk path. Specify with --sdk=";
  }
  if (!Directory.fromUri(sdkUri).existsSync()) {
    throw "Directory $sdkUri doesn't exist. "
        'Specify existing directory with --sdk=';
  }

  if (clickOnUri == null) {
    throw "Didn't get a sdk path. Specify with --click=";
  }
  if (!File.fromUri(clickOnUri).existsSync()) {
    throw "File $clickOnUri doesn't exist. "
        'Specify existing file with --click=';
  }

  if (clickLine == null) {
    throw "Didn't get a line to click on. Specify with --line=";
  }
  if (clickColumn == null) {
    throw "Didn't get a column to click on. Specify with --column=";
  }

  Process p = await Process.start(Platform.resolvedExecutable, [
    'language-server',
  ]);

  p.stdout.listen(listenToStdout);
  Timer.periodic(const Duration(seconds: 1), (timer) {
    bool reportedSomething = false;
    for (MapEntry<int, Stopwatch> waitingFor
        in outstandingRequestsWithId.entries) {
      if (waitingFor.value.elapsed > const Duration(seconds: 1)) {
        if (!reportedSomething) {
          print('----');
          reportedSomething = true;
        }
        print('==> Has been waiting for ${waitingFor.key} for '
            '${waitingFor.value.elapsed}');
      }
    }
    if (reportedSomething) {
      print('----');
    } else {
      print(' -- not waiting for anything -- ');
    }
  });

  await send(p, initMessage(pid, rootUri));
  await receivedCompleter.future;
  await send(p, initNotification);
  await receivedCompleter.future;
  await send(p, initMore(sdkUri));
  await receivedCompleter.future;

  // Try to let it get done...
  await Future.delayed(const Duration(seconds: 2));

  Duration everyDuration = Duration(milliseconds: everyMs);
  while (true) {
    await send(
        p,
        gotoDef(
          largestIdSeen + 1,
          clickOnUri,
          clickLine,
          clickColumn,
        ));
    await Future.delayed(everyDuration);
  }
}

final buffer = <int>[];

int? headerContentLength;

Map<String, dynamic> initNotification = {
  'jsonrpc': '2.0',
  'method': 'initialized',
  'params': {}
};

/// There's something weird about getting (several) id 3's that wasn't
/// requested...
int largestIdSeen = 3;
Map<int, Stopwatch> outstandingRequestsWithId = {};
Completer<Map<String, dynamic>> receivedCompleter = Completer();

int verbosity = 0;
Map<String, dynamic> gotoDef(int id, Uri uri, int line, int char) {
  return {
    'jsonrpc': '2.0',
    'id': id,
    'method': 'textDocument/definition',
    'params': {
      'textDocument': {'uri': '$uri'},
      'position': {'line': line, 'character': char}
    }
  };
}

// Messages taken from what VSCode sent.

Map<String, dynamic> initMessage(int processId, Uri rootUri) {
  String rootPath = rootUri.toFilePath();
  String name = rootUri.pathSegments.last;
  if (name.isEmpty) {
    name = rootUri.pathSegments[rootUri.pathSegments.length - 2];
  }
  return {
    'id': 0,
    'jsonrpc': '2.0',
    'method': 'initialize',
    'params': {
      'processId': processId,
      'clientInfo': {'name': 'lspTestScript', 'version': '0.0.1'},
      'locale': 'en',
      'rootPath': rootPath,
      'rootUri': '$rootUri',
      'capabilities': {},
      'initializationOptions': {},
      'workspaceFolders': [
        {'uri': '$rootUri', 'name': rootUri.pathSegments.last}
      ]
    }
  };
}

Map<String, dynamic> initMore(Uri sdkUri) {
  String sdkPath = sdkUri.toFilePath();
  return {
    'id': 1,
    'jsonrpc': '2.0',
    'result': [
      {
        'useLsp': true,
        'sdkPath': sdkPath,
        'allowAnalytics': false,
      }
    ]
  };
}

void listenToStdout(List<int> event) {
  // General idea taken from
  // pkg/analysis_server/lib/src/lsp/lsp_packet_transformer.dart
  for (int element in event) {
    buffer.add(element);
    if (verbosity > 3 && buffer.length % 1000 == 999) {
      print('DEBUG MESSAGE: Stdout buffer with length ${buffer.length} so far: '
          '${utf8.decode(buffer)}');
    }
    if (headerContentLength == null && _endsWithCrLfCrLf()) {
      String headerRaw = utf8.decode(buffer);
      buffer.clear();
      List<String> headers = headerRaw.split('\r\n');
      for (String header in headers) {
        if (header.startsWith('Content-Length:')) {
          String contentLength =
              header.substring('Content-Length:'.length).trim();
          headerContentLength = int.parse(contentLength);
          break;
        }
      }
    } else if (headerContentLength != null &&
        buffer.length == headerContentLength!) {
      String messageString = utf8.decode(buffer);
      buffer.clear();
      headerContentLength = null;
      Map<String, dynamic> message =
          json.decode(messageString) as Map<String, dynamic>;
      dynamic possibleId = message['id'];
      if (possibleId is int) {
        if (possibleId > largestIdSeen) {
          largestIdSeen = possibleId;
        }

        if (verbosity > 0) {
          if (messageString.length > 100) {
            print('Got message ${messageString.substring(0, 100)}...');
          } else {
            print('Got message $messageString');
          }
        }

        Stopwatch? stopwatch = outstandingRequestsWithId.remove(possibleId);
        if (stopwatch != null) {
          stopwatch.stop();
          if (verbosity > 2) {
            print(' => Got response for $possibleId in ${stopwatch.elapsed}');
          }
        }
      } else if (verbosity > 1) {
        if (messageString.length > 100) {
          print('Got message ${messageString.substring(0, 100)}...');
        } else {
          print('Got message $messageString');
        }
      }
      receivedCompleter.complete(message);
      receivedCompleter = Completer();
    }
  }
}

Future<void> send(Process p, Map<String, dynamic> json) async {
  // Mostly copied from
  // pkg/analysis_server/lib/src/lsp/channel/lsp_byte_stream_channel.dart
  var jsonEncodedBody = jsonEncode(json);
  var utf8EncodedBody = utf8.encode(jsonEncodedBody);
  var header = 'Content-Length: ${utf8EncodedBody.length}\r\n'
      'Content-Type: application/vscode-jsonrpc; charset=utf-8\r\n\r\n';
  var asciiEncodedHeader = ascii.encode(header);

  dynamic possibleId = json['id'];
  if (possibleId is int && possibleId > largestIdSeen) {
    largestIdSeen = possibleId;
    outstandingRequestsWithId[possibleId] = Stopwatch()..start();
    if (verbosity > 2) {
      print('Sending message with id $possibleId');
    }
  }

  // Header is always ascii, body is always utf8!
  p.stdin.add(asciiEncodedHeader);
  p.stdin.add(utf8EncodedBody);
  await p.stdin.flush();
  if (verbosity > 2) {
    print('\n\nMessage sent...\n\n');
  }
}

/// Copied from pkg/analysis_server/lib/src/lsp/lsp_packet_transformer.dart.
bool _endsWithCrLfCrLf() {
  var l = buffer.length;
  return l > 4 &&
      buffer[l - 1] == 10 &&
      buffer[l - 2] == 13 &&
      buffer[l - 3] == 10 &&
      buffer[l - 4] == 13;
}
