// Copyright (c) 2020, 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:nnbd_migration/src/front_end/migration_info.dart';
import 'package:nnbd_migration/src/front_end/path_mapper.dart';
import 'package:nnbd_migration/src/front_end/unit_link.dart';
import 'package:nnbd_migration/src/front_end/web/navigation_tree.dart';
import 'package:path/path.dart' as path;

/// Groups the items in [iterable] by the result of applying [groupFn] to each
/// item.
Map<K, List<T>> _groupBy<K, T>(
    Iterable<T> iterable, K Function(T item) groupFn) {
  var result = <K, List<T>>{};
  for (var item in iterable) {
    var key = groupFn(item);
    result.putIfAbsent(key, () => <T>[]).add(item);
  }
  return result;
}

/// The HTML that is displayed for a region of code.
class NavigationTreeRenderer {
  final MigrationInfo migrationInfo;

  /// An object used to map the file paths of analyzed files to the file paths
  /// of the HTML files used to view the content of those files.
  final PathMapper pathMapper;

  /// Initializes a newly created region page within the given [site]. The
  /// [unitInfo] provides the information needed to render the page.
  NavigationTreeRenderer(this.migrationInfo, this.pathMapper);

  /// Returns the path context used to manipulate paths.
  path.Context get pathContext => migrationInfo.pathContext;

  /// Renders the navigation link tree.
  List<NavigationTreeNode> render() {
    var linkData = migrationInfo.unitLinks();
    var tree = _renderNavigationSubtree(linkData, 0);
    for (var node in tree) {
      node.parent = null;
    }
    return tree;
  }

  /// Renders the navigation link subtree at [depth].
  List<NavigationTreeNode> _renderNavigationSubtree(
      List<UnitLink> links, int depth) {
    var linksGroupedByDirectory = _groupBy(
        links.where((link) => link.depth > depth),
        (UnitLink link) => link.pathParts[depth]);

    return [
      for (var entry in linksGroupedByDirectory.entries)
        NavigationTreeDirectoryNode(
          name: entry.key,
          path: pathContext
              .dirname(pathContext.joinAll(entry.value.first.pathParts)),
          subtree: _renderNavigationSubtree(entry.value, depth + 1),
        )..setSubtreeParents(),
      for (var link in links.where((link) => link.depth == depth))
        NavigationTreeFileNode(
          name: link.fileName,
          path: pathContext.joinAll(link.pathParts),
          href: pathMapper.map(link.fullPath),
          editCount: link.editCount,
          wasExplicitlyOptedOut: link.wasExplicitlyOptedOut,
          migrationStatus: link.migrationStatus,
          migrationStatusCanBeChanged: link.migrationStatusCanBeChanged,
        ),
    ];
  }
}
