// 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.

/// 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 && Directory(args[0]).existsSync()) {
    humanReadableSourceMapFile = File('${args[0]}/out.js.map2');
    sourceMapFile = File('${args[0]}/out.js.map');
  } else {
    sourceMapFile = File(args[0]);
    if (args.length > 1) {
      humanReadableSourceMapFile = File(args[1]);
    }
  }
  mainInternal(sourceMapFile, humanReadableSourceMapFile);
}

void mainInternal(File sourceMapFile, File? humanReadableSourceMapFile) {
  SingleMapping sourceMap =
      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 = 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();
}
