// Copyright (c) 2019, 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 'package:analyzer/file_system/file_system.dart';
import 'package:path/path.dart' as path;

/// An object that can map the file paths of analyzed files to the file paths of
/// the HTML files used to view the content of those files.
class PathMapper {
  /// The resource provider used to map paths.
  ResourceProvider provider;

  /// The absolute path of the folder that should contain all of the generated
  /// HTML files.
  final String outputFolder;

  /// The root of the package containing the files being migrated.
  final String packageRoot;

  /// A table mapping the file paths of analyzed files to the file paths of the
  /// HTML files used to view the content of those files.
  final Map<String, String> pathMap = {};

  /// The index to be used when creating the next synthetic file name.
  int nextIndex = 1;

  /// Initialize a newly created path mapper.
  PathMapper(this.provider, this.outputFolder, this.packageRoot);

  /// Return the path of the HTML file used to view the content of the analyzed
  /// file with the given [path].
  String map(String path) {
    return pathMap.putIfAbsent(path, () => _computePathFor(path));
  }

  /// Return the path of the HTML file corresponding to the Dart file with the
  /// given [path].
  String _computePathFor(String filePath) {
    path.Context context = provider.pathContext;
    if (context.isWithin(packageRoot, filePath)) {
      String packageParent = context.dirname(packageRoot);
      String relative = context.relative(filePath, from: packageParent);
      return context.join(
          outputFolder, context.setExtension(relative, '.html'));
    }
    // TODO(brianwilkerson) Find a better mapping algorithm, that would produce
    //  a more readable URI. For example, have other packages and the sdk be
    //  parallel to the directory containing the files for the library being
    //  migrated.
    return context.join(outputFolder, 'f${nextIndex++}.html');
  }
}
