// Copyright (c) 2012, 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.

// Simple interactive debugger shell that connects to the Dart VM's debugger
// connection port.

import "dart:convert";
import "dart:io";
import "dart:async";
import "dart:math";

import "ddbg/lib/commando.dart";

class TargetScript {
  // The text of a script.
  String source = null;

  // A mapping from line number to source text.
  List<String> lineToSource = null;

  // A mapping from token offset to line number.
  Map<int,int> tokenToLine = null;
}


class TargetIsolate {
  int id;
  // The location of the last paused event.
  Map pausedLocation = null;

  TargetIsolate(this.id);
  bool get isPaused => pausedLocation != null;

  Map<String, TargetScript> scripts = {};
}

Map<int, TargetIsolate> targetIsolates= new Map<int, TargetIsolate>();

Map<int, Completer> outstandingCommands;

Socket vmSock;
String vmData;
var cmdSubscription;
Commando cmdo;
var vmSubscription;
int seqNum = 0;

bool isDebugging = false;
Process targetProcess = null;
bool suppressNextExitCode = false;

final verbose = false;
final printMessages = false;

TargetIsolate currentIsolate;
TargetIsolate mainIsolate;

int debugPort = 5858;

String formatLocation(Map location) {
  if (location == null) return "";
  var fileName = location["url"].split("/").last;
  return "file: $fileName lib: ${location['libraryId']} token: ${location['tokenOffset']}";
}


Future sendCmd(Map<String, dynamic> cmd) {
  var completer = new Completer.sync();
  int id = cmd["id"];
  outstandingCommands[id] = completer;
  if (verbose) {
    print("sending: '${JSON.encode(cmd)}'");
  }
  vmSock.write(JSON.encode(cmd));
  return completer.future;
}


bool checkCurrentIsolate() {
  if (vmSock == null) {
    print("There is no active script.  Try 'help run'.");
    return false;
  }
  if (currentIsolate == null) {
    print('There is no current isolate.');
    return false;
  }
  return true;
}


void setCurrentIsolate(TargetIsolate isolate) {
  if (isolate != currentIsolate) {
    currentIsolate = isolate;
    if (mainIsolate == null) {
      print("Main isolate is ${isolate.id}");
      mainIsolate = isolate;
    }
    print("Current isolate is now ${isolate.id}");
  }
}


bool checkPaused() {
  if (!checkCurrentIsolate()) return false;
  if (currentIsolate.isPaused) return true;
  print("Current isolate must be paused");
  return false;
}

// These settings are allowed in the 'set' and 'show' debugger commands.
var validSettings = ['vm', 'vmargs', 'script', 'args'];

// The current values for all settings.
var settings = new Map();

String _leftJustify(text, int width) {
  StringBuffer buffer = new StringBuffer();
  buffer.write(text);
  while (buffer.length < width) {
    buffer.write(' ');
  }
  return buffer.toString();
}

// TODO(turnidge): Move all commands here.
List<Command> commandList =
    [ new HelpCommand(),
      new QuitCommand(),
      new RunCommand(),
      new KillCommand(),
      new ConnectCommand(),
      new DisconnectCommand(),
      new SetCommand(),
      new ShowCommand() ];


List<Command> matchCommand(String commandName, bool exactMatchWins) {
  List matches = [];
  for (var command in commandList) {
    if (command.name.startsWith(commandName)) {
      if (exactMatchWins && command.name == commandName) {
        // Exact match
        return [command];
      } else {
        matches.add(command);
      }
    }
  }
  return matches;
}

abstract class Command {
  String get name;
  Future run(List<String> args);
}

class HelpCommand extends Command {
  final name = 'help';
  final helpShort = 'Show a list of debugger commands';
  final helpLong ="""
Show a list of debugger commands or get more information about a
particular command.

Usage:
  help
  help <command>
""";

  Future run(List<String> args) {
    if (args.length == 1) {
      print("Debugger commands:\n");
      for (var command in commandList) {
        print('  ${_leftJustify(command.name, 11)} ${command.helpShort}');
      }

      // TODO(turnidge): Convert all commands to use the Command class.
      print("""
  bt          Show backtrace
  r           Resume execution
  s           Single step
  so          Step over
  si          Step into
  sbp [<file>] <line> Set breakpoint
  rbp <id>    Remove breakpoint with given id
  po <id>     Print object info for given id
  eval obj <id> <expr> Evaluate expr on object id
  eval cls <id> <expr> Evaluate expr on class id
  eval lib <id> <expr> Evaluate expr in toplevel of library id
  pl <id> <idx> [<len>] Print list element/slice
  pc <id>     Print class info for given id
  ll          List loaded libraries
  plib <id>   Print library info for given library id
  slib <id> <true|false> Set library id debuggable
  pg <id>     Print all global variables visible within given library id
  ls <lib_id> List loaded scripts in library
  gs <lib_id> <script_url> Get source text of script in library
  tok <lib_id> <script_url> Get line and token table of script in library
  epi <none|all|unhandled>  Set exception pause info
  li          List ids of all isolates in the VM
  sci <id>    Set current target isolate
  i <id>      Interrupt execution of given isolate id
""");

      print("For more information about a particular command, type:\n\n"
            "  help <command>\n");

      print("Commands may be abbreviated: e.g. type 'h' for 'help.\n");
    } else if (args.length == 2) {
      var commandName = args[1];
      var matches = matchCommand(commandName, true);
      if (matches.length == 0) {
        print("Command '$commandName' not recognized.  "
              "Try 'help' for a list of commands.");
      } else {
        for (var command in matches) {
          print("---- ${command.name} ----\n${command.helpLong}");
        }
      }
    } else {
      print("Command '$command' not recognized.  "
            "Try 'help' for a list of commands.");
    }

    return new Future.value();
  }
}


class QuitCommand extends Command {
  final name = 'quit';
  final helpShort = 'Quit the debugger.';
  final helpLong ="""
Quit the debugger.

Usage:
  quit
""";

  Future run(List<String> args) {
    if (args.length > 1) {
      print("Unexpected arguments to $name command.");
      return new Future.value();
    }
    return debuggerQuit();
  }
}

class SetCommand extends Command {
  final name = 'set';
  final helpShort = 'Change the value of a debugger setting.';
  final helpLong ="""
Change the value of a debugger setting.

Usage:
  set <setting> <value>

Valid settings are:
  ${validSettings.join('\n  ')}.

See also 'help show'.
""";

  Future run(List<String> args) {
    if (args.length < 3 || !validSettings.contains(args[1])) {
      print("Undefined $name command.  Try 'help $name'.");
      return new Future.value();
    }
    var option = args[1];
    var value = args.getRange(2, args.length).join(' ');
    settings[option] = value;
    return new Future.value();
  }
}

class ShowCommand extends Command {
  final name = 'show';
  final helpShort = 'Show the current value of a debugger setting.';
  final helpLong ="""
Show the current value of a debugger setting.

Usage:
  show
  show <setting>

If no <setting> is specified, all current settings are shown.

Valid settings are:
  ${validSettings.join('\n  ')}.

See also 'help set'.
""";

  Future run(List<String> args) {
    if (args.length == 1) {
      for (var option in validSettings) {
        var value = settings[option];
        print("$option = '$value'");
      }
    } else if (args.length == 2 && validSettings.contains(args[1])) {
      var option = args[1];
      var value = settings[option];
      if (value == null) {
        print('$option has not been set.');
      } else {
        print("$option = '$value'");
      }
      return new Future.value();
    } else {
      print("Undefined $name command.  Try 'help $name'.");
    }
    return new Future.value();
  }
}

class RunCommand extends Command {
  final name = 'run';
  final helpShort = "Run the currrent script.";
  final helpLong ="""
Runs the current script.

Usage:
  run
  run <args>

The current script will be run on the current vm.  The 'vm' and
'vmargs' settings are used to specify the current vm and vm arguments.
The 'script' and 'args' settings are used to specify the current
script and script arguments.

For more information on settings type 'help show' or 'help set'.

If <args> are provided to the run command, it is the same as typing
'set args <args>' followed by 'run'.
""";

  Future run(List<String> cmdArgs) {
    if (isDebugging) {
      // TODO(turnidge): Implement modal y/n dialog to stop running script.
      print("There is already a running dart process.  "
            "Try 'kill'.");
      return new Future.value();
    }
    assert(targetProcess == null);
    if (settings['script'] == null) {
      print("There is no script specified.  "
            "Use 'set script' to set the current script.");
      return new Future.value();
    }
    if (cmdArgs.length > 1) {
      settings['args'] = cmdArgs.getRange(1, cmdArgs.length);
    }

    // Build the process arguments.
    var processArgs = ['--debug:$debugPort'];
    if (verbose) {
      processArgs.add('--verbose_debug');
    }
    if (settings['vmargs'] != null) {
      processArgs.addAll(settings['vmargs'].split(' '));
    }
    processArgs.add(settings['script']);
    if (settings['args'] != null) {
      processArgs.addAll(settings['args'].split(' '));
    }
    String vm = settings['vm'];

    isDebugging = true;
    cmdo.hide();
    return Process.start(vm, processArgs).then((process) {
        print("Started process ${process.pid} '$vm ${processArgs.join(' ')}'");
        targetProcess = process;
        process.stdin.close();

        // TODO(turnidge): For now we only show full lines of output
        // from the debugged process.  Should show each character.
        process.stdout
            .transform(UTF8.decoder)
            .transform(new LineSplitter())
            .listen((String line) {
                cmdo.hide();
                // TODO(turnidge): Escape output in any way?
                print(line);
                cmdo.show();
              });

        process.stderr
            .transform(UTF8.decoder)
            .transform(new LineSplitter())
            .listen((String line) {
                cmdo.hide();
                print(line);
                cmdo.show();
              });

        process.exitCode.then((int exitCode) {
            cmdo.hide();
            if (suppressNextExitCode) {
              suppressNextExitCode = false;
            } else {
              if (exitCode == 0) {
                print('Process exited normally.');
              } else {
                print('Process exited with code $exitCode.');
              }
            }
            targetProcess = null;
            cmdo.show();
          });

        // Wait for the vm to open the debugging port.
        return openVmSocket(0);
      });
  }
}

class KillCommand extends Command {
  final name = 'kill';
  final helpShort = 'Kill the currently executing script.';
  final helpLong ="""
Kill the currently executing script.

Usage:
  kill
""";

  Future run(List<String> cmdArgs) {
    if (!isDebugging) {
      print('There is no running script.');
      return new Future.value();
    }
    if (targetProcess == null) {
      print("The active dart process was not started with 'run'. "
            "Try 'disconnect' instead.");
      return new Future.value();
    }
    assert(targetProcess != null);
    bool result = targetProcess.kill();
    if (result) {
      print('Process killed.');
      suppressNextExitCode = true;
    } else {
      print('Unable to kill process ${targetProcess.pid}');
    }
    return new Future.value();
  }
}

class ConnectCommand extends Command {
  final name = 'connect';
  final helpShort = "Connect to a running dart script.";
  final helpLong ="""
Connect to a running dart script.

Usage:
  connect
  connect <port>

The debugger will connect to a dart script which has already been
started with the --debug option.  If no port is provided, the debugger
will attempt to connect on the default debugger port.
""";

  Future run(List<String> cmdArgs) {
    if (cmdArgs.length > 2) {
      print("Too many arguments to 'connect'.");
    }
    if (isDebugging) {
      // TODO(turnidge): Implement modal y/n dialog to stop running script.
      print("There is already a running dart process.  "
            "Try 'kill'.");
      return new Future.value();
    }
    assert(targetProcess == null);
    if (cmdArgs.length == 2) {
      debugPort = int.parse(cmdArgs[1]);
    }

    isDebugging = true;
    cmdo.hide();
    return openVmSocket(0);
  }
}

class DisconnectCommand extends Command {
  final name = 'disconnect';
  final helpShort = "Disconnect from a running dart script.";
  final helpLong ="""
Disconnect from a running dart script.

Usage:
  disconnect

The debugger will disconnect from a dart script's debugging port.  The
script must have been connected to earlier with the 'connect' command.
""";

  Future run(List<String> cmdArgs) {
    if (cmdArgs.length > 1) {
      print("Too many arguments to 'disconnect'.");
    }
    if (!isDebugging) {
      // TODO(turnidge): Implement modal y/n dialog to stop running script.
      print("There is no active dart process.  "
            "Try 'connect'.");
      return new Future.value();
    }
    if (targetProcess != null) {
      print("The active dart process was started with 'run'.  "
            "Try 'kill'.");
    }

    cmdo.hide();
    return closeVmSocket();
  }
}

typedef void HandlerType(Map response);

HandlerType showPromptAfter(void handler(Map response)) {
  return (response) {
    handler(response);
    cmdo.show();
  };
}

void processCommand(String cmdLine) {
  void huh() {
    print("'$cmdLine' not understood, try 'help' for help.");
  }

  cmdo.hide();
  seqNum++;
  cmdLine = cmdLine.trim();
  var args = cmdLine.split(' ');
  if (args.length == 0) {
    return;
  }
  var command = args[0];

  var resume_commands =
      { 'r':'resume', 's':'stepOver', 'si':'stepInto', 'so':'stepOut'};
  if (resume_commands[command] != null) {
    if (!checkPaused()) {
      cmdo.show();
      return;
    }
    var cmd = { "id": seqNum,
                "command": resume_commands[command],
                "params": { "isolateId" : currentIsolate.id } };
    sendCmd(cmd).then(showPromptAfter(handleResumedResponse));
  } else if (command == "bt") {
    if (!checkCurrentIsolate()) {
      cmdo.show();
      return;
    }
    var cmd = { "id": seqNum,
                "command": "getStackTrace",
                "params": { "isolateId" : currentIsolate.id } };
    sendCmd(cmd).then(showPromptAfter(handleStackTraceResponse));
  } else if (command == "ll") {
    if (!checkCurrentIsolate()) {
      cmdo.show();
      return;
    }
    var cmd = { "id": seqNum,
                "command": "getLibraries",
                "params": { "isolateId" : currentIsolate.id } };
    sendCmd(cmd).then(showPromptAfter(handleGetLibraryResponse));
  } else if (command == "sbp" && args.length >= 2) {
    if (!checkCurrentIsolate()) {
      cmdo.show();
      return;
    }
    var url, line;
    if (args.length == 2 && currentIsolate.pausedLocation != null) {
      url = currentIsolate.pausedLocation["url"];
      assert(url != null);
      line = int.parse(args[1]);
    } else {
      url = args[1];
      line = int.parse(args[2]);
    }
    var cmd = { "id": seqNum,
                "command": "setBreakpoint",
                "params": { "isolateId" : currentIsolate.id,
                            "url": url,
                            "line": line }};
    sendCmd(cmd).then(showPromptAfter(handleSetBpResponse));
  } else if (command == "rbp" && args.length == 2) {
    if (!checkCurrentIsolate()) {
      cmdo.show();
      return;
    }
    var cmd = { "id": seqNum,
                "command": "removeBreakpoint",
                "params": { "isolateId" : currentIsolate.id,
                            "breakpointId": int.parse(args[1]) } };
    sendCmd(cmd).then(showPromptAfter(handleGenericResponse));
  } else if (command == "ls" && args.length == 2) {
    if (!checkCurrentIsolate()) {
      cmdo.show();
      return;
    }
    var cmd = { "id": seqNum,
                "command": "getScriptURLs",
                "params": { "isolateId" : currentIsolate.id,
                            "libraryId": int.parse(args[1]) } };
    sendCmd(cmd).then(showPromptAfter(handleGetScriptsResponse));
  } else if (command == "eval" && args.length > 3) {
    if (!checkCurrentIsolate()) {
      cmdo.show();
      return;
    }
    var expr = args.getRange(3, args.length).join(" ");
    var target = args[1];
    if (target == "obj") {
      target = "objectId";
    } else if (target == "cls") {
      target = "classId";
    } else if (target == "lib") {
      target = "libraryId";
    } else {
      huh();
      return;
    }
    var cmd = { "id": seqNum,
                "command": "evaluateExpr",
                "params": { "isolateId": currentIsolate.id,
                            target: int.parse(args[2]),
                            "expression": expr } };
    sendCmd(cmd).then(showPromptAfter(handleEvalResponse));
  } else if (command == "po" && args.length == 2) {
    if (!checkCurrentIsolate()) {
      cmdo.show();
      return;
    }
    var cmd = { "id": seqNum,
                "command": "getObjectProperties",
                "params": { "isolateId" : currentIsolate.id,
                            "objectId": int.parse(args[1]) } };
    sendCmd(cmd).then(showPromptAfter(handleGetObjPropsResponse));
  } else if (command == "pl" && args.length >= 3) {
    if (!checkCurrentIsolate()) {
      cmdo.show();
      return;
    }
    var cmd;
    if (args.length == 3) {
      cmd = { "id": seqNum,
              "command": "getListElements",
              "params": { "isolateId" : currentIsolate.id,
                          "objectId": int.parse(args[1]),
                          "index": int.parse(args[2]) } };
    } else {
      cmd = { "id": seqNum,
              "command": "getListElements",
              "params": { "isolateId" : currentIsolate.id,
                          "objectId": int.parse(args[1]),
                          "index": int.parse(args[2]),
                          "length": int.parse(args[3]) } };
    }
    sendCmd(cmd).then(showPromptAfter(handleGetListResponse));
  } else if (command == "pc" && args.length == 2) {
    if (!checkCurrentIsolate()) {
      cmdo.show();
      return;
    }
    var cmd = { "id": seqNum,
                "command": "getClassProperties",
                "params": { "isolateId" : currentIsolate.id,
                            "classId": int.parse(args[1]) } };
    sendCmd(cmd).then(showPromptAfter(handleGetClassPropsResponse));
  } else if (command == "plib" && args.length == 2) {
    if (!checkCurrentIsolate()) {
      cmdo.show();
      return;
    }
    var cmd = { "id": seqNum,
                "command": "getLibraryProperties",
                "params": {"isolateId" : currentIsolate.id,
                           "libraryId": int.parse(args[1]) } };
    sendCmd(cmd).then(showPromptAfter(handleGetLibraryPropsResponse));
  } else if (command == "slib" && args.length == 3) {
    if (!checkCurrentIsolate()) {
      cmdo.show();
      return;
    }
    var cmd = { "id": seqNum,
                "command": "setLibraryProperties",
                "params": {"isolateId" : currentIsolate.id,
                           "libraryId": int.parse(args[1]),
                           "debuggingEnabled": args[2] } };
    sendCmd(cmd).then(showPromptAfter(handleSetLibraryPropsResponse));
  } else if (command == "pg" && args.length == 2) {
    if (!checkCurrentIsolate()) {
      cmdo.show();
      return;
    }
    var cmd = { "id": seqNum,
                "command": "getGlobalVariables",
                "params": { "isolateId" : currentIsolate.id,
                            "libraryId": int.parse(args[1]) } };
    sendCmd(cmd).then(showPromptAfter(handleGetGlobalVarsResponse));
  } else if (command == "gs" && args.length == 3) {
    if (!checkCurrentIsolate()) {
      cmdo.show();
      return;
    }
    var cmd = { "id": seqNum,
                "command":  "getScriptSource",
                "params": { "isolateId" : currentIsolate.id,
                            "libraryId": int.parse(args[1]),
                            "url": args[2] } };
    sendCmd(cmd).then(showPromptAfter(handleGetSourceResponse));
  } else if (command == "tok" && args.length == 3) {
    if (!checkCurrentIsolate()) {
      cmdo.show();
      return;
    }
    var cmd = { "id": seqNum,
                "command":  "getLineNumberTable",
                "params": { "isolateId" : currentIsolate.id,
                            "libraryId": int.parse(args[1]),
                            "url": args[2] } };
    sendCmd(cmd).then(showPromptAfter(handleGetLineTableResponse));
  } else if (command == "epi" && args.length == 2) {
    if (!checkCurrentIsolate()) {
      cmdo.show();
      return;
    }
    var cmd = { "id": seqNum,
                "command":  "setPauseOnException",
                "params": { "isolateId" : currentIsolate.id,
                            "exceptions": args[1] } };
    sendCmd(cmd).then(showPromptAfter(handleGenericResponse));
  } else if (command == "li") {
    if (!checkCurrentIsolate()) {
      cmdo.show();
      return;
    }
    var cmd = { "id": seqNum, "command": "getIsolateIds" };
    sendCmd(cmd).then(showPromptAfter(handleGetIsolatesResponse));
  } else if (command == "sci" && args.length == 2) {
    var id = int.parse(args[1]);
    if (targetIsolates[id] != null) {
      setCurrentIsolate(targetIsolates[id]);
    } else {
      print("$id is not a valid isolate id");
    }
    cmdo.show();
  } else if (command == "i" && args.length == 2) {
    var cmd = { "id": seqNum,
                "command": "interrupt",
                "params": { "isolateId": int.parse(args[1]) } };
    sendCmd(cmd).then(showPromptAfter(handleGenericResponse));
  } else if (command.length == 0) {
    huh();
    cmdo.show();
  } else {
    // TODO(turnidge): Use this for all commands.
    var matches = matchCommand(command, true);
    if (matches.length == 0) {
      huh();
      cmdo.show();
    } else if (matches.length == 1) {
      matches[0].run(args).then((_) {
          cmdo.show();
        });
    } else {
      var matchNames = matches.map((handler) => handler.name);
      print("Ambigous command '$command' : ${matchNames.toList()}");
      cmdo.show();
    }
  }
}


void processError(error, trace) {
  cmdo.hide();
  print("\nInternal error:\n$error\n$trace");
  cmdo.show();
}


void processDone() {
  debuggerQuit();
}


String remoteObject(value) {
  var kind = value["kind"];
  var text = value["text"];
  var id = value["objectId"];
  if (kind == "string") {
    return "(string, id $id) '$text'";
  } else if (kind == "list") {
    var len = value["length"];
    return "(list, id $id, len $len) $text";
  } else if (kind == "object") {
    return "(obj, id $id) $text";
  } else if (kind == "function") {
    var location = formatLocation(value['location']);
    var name = value['name'];
    var signature = value['signature'];
    return "(closure ${name}${signature} $location)";
  } else {
    return "$text";
  }
}


printNamedObject(obj) {
  var name = obj["name"];
  var value = obj["value"];
  print("  $name = ${remoteObject(value)}");
}


handleGetObjPropsResponse(Map response) {
  Map props = response["result"];
  int class_id = props["classId"];
  if (class_id == -1) {
    print("  null");
    return;
  }
  List fields = props["fields"];
  print("  class id: $class_id");
  for (int i = 0; i < fields.length; i++) {
    printNamedObject(fields[i]);
  }
}

handleGetListResponse(Map response) {
  Map result = response["result"];
  if (result["elements"] != null) {
    // List slice.
    var index = result["index"];
    var length = result["length"];
    List elements = result["elements"];
    assert(length == elements.length);
    for (int i = 0; i < length; i++) {
      var kind = elements[i]["kind"];
      var text = elements[i]["text"];
      print("  ${index + i}: ($kind) $text");
    }
  } else {
    // One element, a remote object.
    print(result);
    print("  ${remoteObject(result)}");
  }
}


handleGetClassPropsResponse(Map response) {
  Map props = response["result"];
  assert(props["name"] != null);
  int libId = props["libraryId"];
  assert(libId != null);
  print("  class ${props["name"]} (library id: $libId)");
  List fields = props["fields"];
  if (fields.length > 0) {
    print("  static fields:");
    for (int i = 0; i < fields.length; i++) {
      printNamedObject(fields[i]);
    }
  }
}


handleGetLibraryPropsResponse(Map response) {
  Map props = response["result"];
  assert(props["url"] != null);
  print("  library url: ${props["url"]}");
  assert(props["debuggingEnabled"] != null);
  print("  debugging enabled: ${props["debuggingEnabled"]}");
  List imports = props["imports"];
  assert(imports != null);
  if (imports.length > 0) {
    print("  imports:");
    for (int i = 0; i < imports.length; i++) {
      print("    id ${imports[i]["libraryId"]} prefix ${imports[i]["prefix"]}");
    }
  }
  List globals = props["globals"];
  assert(globals != null);
  if (globals.length > 0) {
    print("  global variables:");
    for (int i = 0; i < globals.length; i++) {
      printNamedObject(globals[i]);
    }
  }
}


handleSetLibraryPropsResponse(Map response) {
  Map props = response["result"];
  assert(props["debuggingEnabled"] != null);
  print("  debugging enabled: ${props["debuggingEnabled"]}");
}


handleGetGlobalVarsResponse(Map response) {
  List globals = response["result"]["globals"];
  for (int i = 0; i < globals.length; i++) {
    printNamedObject(globals[i]);
  }
}


handleGetSourceResponse(Map response) {
  Map result = response["result"];
  String source = result["text"];
  print("Source text:\n$source\n--------");
}


handleGetLineTableResponse(Map response) {
  Map result = response["result"];
  var info = result["lines"];
  print("Line info table:\n$info");
}


void handleGetIsolatesResponse(Map response) {
  Map result = response["result"];
  List ids = result["isolateIds"];
  assert(ids != null);
  print("List of isolates:");
  for (int id in ids) {
    TargetIsolate isolate = targetIsolates[id];
    var state = (isolate != null) ? "running" : "<unknown isolate>";
    if (isolate != null && isolate.isPaused) {
      var loc = formatLocation(isolate.pausedLocation);
      state = "paused at $loc";
    }
    var marker = " ";
    if (currentIsolate != null && id == currentIsolate.id) {
      marker = "*";
    }
    print("$marker $id $state");
  }
}


void handleGetLibraryResponse(Map response) {
  Map result = response["result"];
  List libs = result["libraries"];
  print("Loaded libraries:");
  print(libs);
  for (int i = 0; i < libs.length; i++) {
    print("  ${libs[i]["id"]} ${libs[i]["url"]}");
  }
}


void handleGetScriptsResponse(Map response) {
  Map result = response["result"];
  List urls = result["urls"];
  print("Loaded scripts:");
  for (int i = 0; i < urls.length; i++) {
    print("  $i ${urls[i]}");
  }
}


void handleEvalResponse(Map response) {
  Map result = response["result"];
  print(remoteObject(result));
}


void handleSetBpResponse(Map response) {
  Map result = response["result"];
  var id = result["breakpointId"];
  assert(id != null);
  print("Set BP $id");
}


void handleGenericResponse(Map response) {
  if (response["error"] != null) {
    print("Error: ${response["error"]}");
  }
}

void handleResumedResponse(Map response) {
  if (response["error"] != null) {
    print("Error: ${response["error"]}");
    return;
  }
  assert(currentIsolate != null);
  currentIsolate.pausedLocation = null;
}


void handleStackTraceResponse(Map response) {
  Map result = response["result"];
  List callFrames = result["callFrames"];
  assert(callFrames != null);
  printStackTrace(callFrames);
}


void printStackFrame(frame_num, Map frame) {
  var fname = frame["functionName"];
  var loc = formatLocation(frame["location"]);
  print("#${_leftJustify(frame_num,2)} $fname at $loc");
  List locals = frame["locals"];
  for (int i = 0; i < locals.length; i++) {
    printNamedObject(locals[i]);
  }
}


void printStackTrace(List frames) {
  for (int i = 0; i < frames.length; i++) {
    printStackFrame(i, frames[i]);
  }
}


Map<int, int> parseLineNumberTable(List<List<int>> table) {
  Map tokenToLine = {};
  for (var line in table) {
    // Each entry begins with a line number...
    var lineNumber = line[0];
    for (var pos = 1; pos < line.length; pos += 2) {
      // ...and is followed by (token offset, col number) pairs.
      // We ignore the column numbers.
      var tokenOffset = line[pos];
      tokenToLine[tokenOffset] = lineNumber;
    }
  }
  return tokenToLine;
}


Future<TargetScript> getTargetScript(Map location) {
  var isolate = targetIsolates[currentIsolate.id];
  var url = location['url'];
  var script = isolate.scripts[url];
  if (script != null) {
    return new Future.value(script);
  }
  script = new TargetScript();

  // Ask the vm for the source and line number table.
  var sourceCmd = {
    "id": seqNum++,
    "command":  "getScriptSource",
    "params": { "isolateId": currentIsolate.id,
                "libraryId": location['libraryId'],
                "url": url } };

  var lineNumberCmd = {
    "id": seqNum++,
    "command":  "getLineNumberTable",
    "params": { "isolateId": currentIsolate.id,
                "libraryId": location['libraryId'],
                "url": url } };

  // Send the source command
  var sourceResponse = sendCmd(sourceCmd).then((response) {
      Map result = response["result"];
      script.source = result['text'];
      // Line numbers are 1-based so add a dummy for line 0.
      script.lineToSource = [''];
      script.lineToSource.addAll(script.source.split('\n'));
    });

  // Send the line numbers command
  var lineNumberResponse = sendCmd(lineNumberCmd).then((response) {
      Map result = response["result"];
      script.tokenToLine = parseLineNumberTable(result['lines']);
    });

  return Future.wait([sourceResponse, lineNumberResponse]).then((_) {
      // When both commands complete, cache the result.
      isolate.scripts[url] = script;
      return script;
    });
}


Future printLocation(String label, Map location) {
  // Figure out the line number.
  return getTargetScript(location).then((script) {
      var lineNumber = script.tokenToLine[location['tokenOffset']];
      var text = script.lineToSource[lineNumber];
      if (label != null) {
        var fileName = location['url'].split("/").last;
        print("$label \n"
              "    at $fileName:$lineNumber");
      }
      print("${_leftJustify(lineNumber, 8)}$text");
    });
}


Future handlePausedEvent(msg) {
  assert(msg["params"] != null);
  var reason = msg["params"]["reason"];
  int isolateId = msg["params"]["isolateId"];
  assert(isolateId != null);
  var isolate = targetIsolates[isolateId];
  assert(isolate != null);
  assert(!isolate.isPaused);
  var location = msg["params"]["location"];;
  assert(location != null);
  setCurrentIsolate(isolate);
  isolate.pausedLocation = location;
  if (reason == "breakpoint") {
    var bpId = (msg["params"]["breakpointId"]);
    var label = (bpId != null) ? "Breakpoint $bpId" : null;
    return printLocation(label, location);
  } else if (reason == "interrupted") {
    return printLocation("Interrupted", location);
  } else {
    assert(reason == "exception");
    var excObj = msg["params"]["exception"];
    print("Isolate $isolateId paused on exception");
    print(remoteObject(excObj));
    return new Future.value();
  }
}

void handleIsolateEvent(msg) {
  Map params = msg["params"];
  assert(params != null);
  var isolateId = params["id"];
  var reason = params["reason"];
  if (reason == "created") {
    print("Isolate $isolateId has been created.");
    assert(targetIsolates[isolateId] == null);
    targetIsolates[isolateId] = new TargetIsolate(isolateId);
  } else {
    assert(reason == "shutdown");
    var isolate = targetIsolates.remove(isolateId);
    assert(isolate != null);
    if (isolate == mainIsolate) {
      mainIsolate = null;
      print("Main isolate ${isolate.id} has terminated.");
    } else {
      print("Isolate ${isolate.id} has terminated.");
    }
    if (isolate == currentIsolate) {
      currentIsolate = mainIsolate;
      if (currentIsolate == null && !targetIsolates.isEmpty) {
        currentIsolate = targetIsolates.values.first;
      }
      if (currentIsolate != null) {
        print("Setting current isolate to ${currentIsolate.id}.");
      } else {
        print("All isolates have terminated.");
      }
    }
  }
}

void processVmMessage(String jsonString) {
  var msg = JSON.decode(jsonString);
  if (msg == null) {
    return;
  }
  var event = msg["event"];
  if (event == "isolate") {
    cmdo.hide();
    handleIsolateEvent(msg);
    cmdo.show();
    return;
  }
  if (event == "paused") {
    cmdo.hide();
    handlePausedEvent(msg).then((_) {
        cmdo.show();
      });
    return;
  }
  if (event == "breakpointResolved") {
    Map params = msg["params"];
    assert(params != null);
    var isolateId = params["isolateId"];
    var location = formatLocation(params["location"]);
    cmdo.hide();
    print("Breakpoint ${params["breakpointId"]} resolved in isolate $isolateId"
          " at $location.");
    cmdo.show();
    return;
  }
  if (msg["id"] != null) {
    var id = msg["id"];
    if (outstandingCommands.containsKey(id)) {
      var completer = outstandingCommands.remove(id);
      if (msg["error"] != null) {
        print("VM says: ${msg["error"]}");
        // TODO(turnidge): Rework how hide/show happens.  For now we
        // show here explicitly.
        cmdo.show();
      } else {
        completer.complete(msg);
      }
    }
  }
}

bool haveGarbageVmData() {
  if (vmData == null || vmData.length == 0) return false;
  var i = 0, char = " ";
  while (i < vmData.length) {
    char = vmData[i];
    if (char != " " && char != "\n" && char != "\r" && char != "\t") break;
    i++;
  }
  if (i >= vmData.length) {
    return false;
  } else {
    return char != "{";
  }
}


void processVmData(String data) {
  if (vmData == null || vmData.length == 0) {
    vmData = data;
  } else {
    vmData = vmData + data;
  }
  if (haveGarbageVmData()) {
    print("Error: have garbage data from VM: '$vmData'");
    return;
  }
  int msg_len = jsonObjectLength(vmData);
  if (printMessages && msg_len == 0) {
    print("have partial or illegal json message"
          " of ${vmData.length} chars:\n'$vmData'");
    return;
  }
  while (msg_len > 0 && msg_len <= vmData.length) {
    if (msg_len == vmData.length) {
      if (printMessages) { print("have one full message:\n$vmData"); }
      processVmMessage(vmData);
      vmData = null;
      return;
    }
    if (printMessages) { print("at least one message: '$vmData'"); }
    var msg = vmData.substring(0, msg_len);
    if (printMessages) { print("first message: $msg"); }
    vmData = vmData.substring(msg_len);
    if (haveGarbageVmData()) {
      print("Error: garbage data after previous message: '$vmData'");
      print("Previous message was: '$msg'");
      return;
    }
    processVmMessage(msg);
    msg_len = jsonObjectLength(vmData);
  }
  if (printMessages) { print("leftover vm data '$vmData'"); }
}

/**
 * Skip past a JSON object value.
 * The object value must start with '{' and continues to the
 * matching '}'. No attempt is made to otherwise validate the contents
 * as JSON. If it is invalid, a later [parseJson] will fail.
 */
int jsonObjectLength(String string) {
  int skipWhitespace(int index) {
    while (index < string.length) {
      String char = string[index];
      if (char != " " && char != "\n" && char != "\r" && char != "\t") break;
      index++;
    }
    return index;
  }
  int skipString(int index) {
    assert(string[index - 1] == '"');
    while (index < string.length) {
      String char = string[index];
      if (char == '"') return index + 1;
      if (char == r'\') index++;
      if (index == string.length) return index;
      index++;
    }
    return index;
  }
  int index = 0;
  index = skipWhitespace(index);
  // Bail out if the first non-whitespace character isn't '{'.
  if (index == string.length || string[index] != '{') return 0;
  int nesting = 0;
  while (index < string.length) {
    String char = string[index++];
    if (char == '{') {
      nesting++;
    } else if (char == '}') {
      nesting--;
      if (nesting == 0) return index;
    } else if (char == '"') {
      // Strings can contain braces. Skip their content.
      index = skipString(index);
    }
  }
  return 0;
}

List<String> debuggerCommandCompleter(List<String> commandParts) {
  List<String> completions = new List<String>();

  // TODO(turnidge): Have a global command table and use it to for
  // help messages, command completion, and command dispatching.  For now
  // we hardcode the list here.
  //
  // TODO(turnidge): Implement completion for arguments as well.
  List<String> oldCommands = ['bt', 'r', 's', 'so', 'si', 'sbp', 'rbp',
                              'po', 'eval', 'pl', 'pc', 'll', 'plib', 'slib',
                              'pg', 'ls', 'gs', 'tok', 'epi', 'li', 'i' ];

  // Completion of first word in the command.
  if (commandParts.length == 1) {
    String prefix = commandParts.last;
    for (var command in oldCommands) {
      if (command.startsWith(prefix)) {
        completions.add(command);
      }
    }
    for (var command in commandList) {
      if (command.name.startsWith(prefix)) {
        completions.add(command.name);
      }
    }
  }

  return completions;
}

Future closeCommando() {
  var subscription = cmdSubscription;
  cmdSubscription = null;
  cmdo = null;

  var future = subscription.cancel();
  if (future != null) {
    return future;
  } else {
    return new Future.value();
  }
}


Future openVmSocket(int attempt) {
  return Socket.connect("127.0.0.1", debugPort).then(
      setupVmSocket,
      onError: (e) {
        // We were unable to connect to the debugger's port.  Try again.
        retryOpenVmSocket(e, attempt);
      });
}


void setupVmSocket(Socket s) {
  vmSock = s;
  vmSock.setOption(SocketOption.TCP_NODELAY, true);
  var stringStream = vmSock.transform(UTF8.decoder);
  outstandingCommands = new Map<int, Completer>();
  vmSubscription = stringStream.listen(
      (String data) {
        processVmData(data);
      },
      onDone: () {
        cmdo.hide();
        if (verbose) {
          print("VM debugger connection closed");
        }
        closeVmSocket().then((_) {
            cmdo.show();
          });
      },
      onError: (err) {
        cmdo.hide();
        // TODO(floitsch): do we want to print the stack trace?
        print("Error in debug connection: $err");

        // TODO(turnidge): Kill the debugged process here?
        closeVmSocket().then((_) {
            cmdo.show();
          });
      });
}


Future retryOpenVmSocket(error, int attempt) {
  var delay;
  if (attempt < 10) {
    delay = new Duration(milliseconds:10);
  } else if (attempt < 20) {
    delay = new Duration(seconds:1);
  } else {
    // Too many retries.  Give up.
    //
    // TODO(turnidge): Kill the debugged process here?
    print('Timed out waiting for debugger to start.\nError: $e');
    return closeVmSocket();
  }
  // Wait and retry.
  return new Future.delayed(delay, () {
      openVmSocket(attempt + 1);
    });
}


Future closeVmSocket() {
  if (vmSubscription == null) {
    // Already closed, nothing to do.
    assert(vmSock == null);
    return new Future.value();
  }

  isDebugging = false;
  var subscription = vmSubscription;
  var sock = vmSock;

  // Wait for the socket to close and the subscription to be
  // cancelled.  Perhaps overkill, but it means we know these will be
  // done.
  //
  // This is uglier than it needs to be since cancel can return null.
  var cleanupFutures = [sock.close()];
  var future = subscription.cancel();
  if (future != null) {
    cleanupFutures.add(future);
  }

  vmSubscription = null;
  vmSock = null;
  outstandingCommands = null;
  return Future.wait(cleanupFutures);
}

void debuggerError(self, parent, zone, error, StackTrace trace) {
  print('\n--------\nExiting due to unexpected error:\n'
        '  $error\n$trace\n');
  debuggerQuit();
}

Future debuggerQuit() {
  // Kill target process, if any.
  if (targetProcess != null) {
    if (!targetProcess.kill()) {
      print('Unable to kill process ${targetProcess.pid}');
    }
  }

  // Restore terminal settings, close connections.
  return Future.wait([closeCommando(), closeVmSocket()]).then((_) {
      exit(0);

      // Unreachable.
      return new Future.value();
    });
}


void parseArgs(List<String> args) {
  int pos = 0;
  settings['vm'] = Platform.executable;
  while (pos < args.length && args[pos].startsWith('-')) {
    pos++;
  }
  if (pos < args.length) {
    settings['vmargs'] = args.getRange(0, pos).join(' ');
    settings['script'] = args[pos];
    settings['args'] = args.getRange(pos + 1, args.length).join(' ');
  }
}

void main(List<String> args) {
  // Setup a zone which will exit the debugger cleanly on any uncaught
  // exception.
  var zone = Zone.ROOT.fork(specification:new ZoneSpecification(
      handleUncaughtError: debuggerError));

  zone.run(() {
      parseArgs(args);
      cmdo = new Commando(completer: debuggerCommandCompleter);
      cmdSubscription = cmdo.commands.listen(processCommand,
                                             onError: processError,
                                             onDone: processDone);
    });
}
