import 'dart:io';
import 'package:source_maps/parser.dart';
import 'package:source_span/source_span.dart';
import 'dart2js_mapping.dart';

abstract class FileProvider {
  String sourcesFor(Uri uri);
  SourceFile fileFor(Uri uri);
  Dart2jsMapping mappingFor(Uri uri);
}

class CachingFileProvider implements FileProvider {
  final Map<Uri, String> _sources = {};
  final Map<Uri, SourceFile> _files = {};
  final Map<Uri, Dart2jsMapping> _mappings = {};
  final Logger? logger;

  CachingFileProvider({this.logger});

  String sourcesFor(Uri uri) =>
      _sources[uri] ??= new File.fromUri(uri).readAsStringSync();

  SourceFile fileFor(Uri uri) =>
      _files[uri] ??= new SourceFile.fromString(sourcesFor(uri));

  Dart2jsMapping mappingFor(Uri uri) =>
      _mappings[uri] ??= parseMappingFor(uri, logger: logger)!;
}

/// A provider that converts `http:` URLs to a `file:` URI assuming that all
/// files were downloaded on the current working directory.
///
/// Typically used when downloading the source and source-map files and applying
/// deobfuscation locally for debugging purposes.
class DownloadedFileProvider extends CachingFileProvider {
  _localize(uri) {
    if (uri.scheme == 'http' || uri.scheme == 'https') {
      String filename = uri.path.substring(uri.path.lastIndexOf('/') + 1);
      return Uri.base.resolve(filename);
    }
    return uri;
  }

  String sourcesFor(Uri uri) => super.sourcesFor(_localize(uri));

  SourceFile fileFor(Uri uri) => super.fileFor(_localize(uri));

  Dart2jsMapping mappingFor(Uri uri) => super.mappingFor(_localize(uri));
}

class Logger {
  Set<String> _seenMessages = new Set<String>();
  log(String message) {
    if (_seenMessages.add(message)) {
      print(message);
    }
  }
}

var logger = Logger();

SingleMapping parseSingleMapping(Map json) => parseJson(json) as SingleMapping;
