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

// @dart = 2.7

/// Loads a source map file and outputs a human-readable version of it.

library load;

import 'dart:convert';
import 'dart:io';
import 'package:source_maps/source_maps.dart';

void main(List<String> args) {
  if (args.isEmpty) {
    print('''
Usage: load <dir-containing 'out.js.map'>
   or: load <source-map-file> [<human-readable-source-map-file>]''');
    exit(1);
  }

  File humanReadableSourceMapFile;
  File sourceMapFile;
  if (args.length == 1 && new Directory(args[0]).existsSync()) {
    humanReadableSourceMapFile = new File('${args[0]}/out.js.map2');
    sourceMapFile = new File('${args[0]}/out.js.map');
  } else {
    sourceMapFile = new File(args[0]);
    if (args.length > 1) {
      humanReadableSourceMapFile = new File(args[1]);
    }
  }
  mainInternal(sourceMapFile, humanReadableSourceMapFile);
}

void mainInternal(File sourceMapFile, File humanReadableSourceMapFile) {
  SingleMapping sourceMap =
      new SingleMapping.fromJson(json.decode(sourceMapFile.readAsStringSync()));
  String humanReadableSourceMap = convertToHumanReadableSourceMap(sourceMap);
  if (humanReadableSourceMapFile != null) {
    humanReadableSourceMapFile.writeAsStringSync(humanReadableSourceMap);
  } else {
    print(humanReadableSourceMap);
  }
}

String convertToHumanReadableSourceMap(SingleMapping sourceMap) {
  StringBuffer sb = new StringBuffer();
  sb.write('{\n');
  sb.write('  "file": "${sourceMap.targetUrl}",\n');
  sb.write('  "sourceRoot": "${sourceMap.sourceRoot}",\n');
  sb.write('  "sources": {\n');
  for (int index = 0; index < sourceMap.urls.length; index++) {
    if (index > 0) {
      sb.write(',\n');
    }
    sb.write('    "$index": "${sourceMap.urls[index]}"');
  }
  sb.write('\n  },\n');
  sb.write('  "lines": [\n');
  bool needsComma = false;
  for (int lineIndex = 0; lineIndex < sourceMap.lines.length; lineIndex++) {
    TargetLineEntry lineEntry = sourceMap.lines[lineIndex];
    int line = lineEntry.line + 1;
    for (int entryIndex = 0;
        entryIndex < lineEntry.entries.length;
        entryIndex++) {
      TargetEntry entry = lineEntry.entries[entryIndex];
      int columnStart = entry.column + 1;
      int columnEnd;
      String position;
      if (entryIndex + 1 < lineEntry.entries.length) {
        columnEnd = lineEntry.entries[entryIndex + 1].column + 1;
        position = '$line,$columnStart-$columnEnd';
      } else {
        position = '$line,$columnStart-';
      }
      if (entry.sourceUrlId != null || columnEnd == null) {
        if (needsComma) {
          sb.write(',\n');
        }
        sb.write('    {"target": "$position"');
        if (entry.sourceUrlId != null) {
          int sourceUrlId = entry.sourceUrlId;
          int sourceLine = entry.sourceLine + 1;
          int sourceColumn = entry.sourceColumn + 1;
          sb.write(', "source": "$sourceUrlId:$sourceLine,$sourceColumn"');
          if (entry.sourceNameId != null) {
            sb.write(', "name": "${sourceMap.names[entry.sourceNameId]}"');
          }
        }
        sb.write('}');
        needsComma = true;
      }
    }
  }
  sb.write('\n  ]\n');
  sb.write('}');
  return sb.toString();
}
