// Copyright (c) 2018, 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_fe_comparison/src/analyzer.dart' as analyzer;
import 'package:analyzer_fe_comparison/src/comparison_node.dart';
import 'package:analyzer_fe_comparison/src/kernel.dart' as kernel;
import 'package:path/path.dart' as path;

/// Compares the analyzer and kernel representations of a package, and prints
/// the resulting diff.
void comparePackages(
    String platformPath, String projectLibPath, String packagesFilePath) async {
  ComparisonNode analyzerNode = await analyzer.analyzePackage(projectLibPath);
  var packagesFileUri = Uri.file(packagesFilePath);
  var inputs = <Uri>[];
  for (var library in analyzerNode.children) {
    inputs.add(Uri.parse(library.text));
  }
  var platformUri = Uri.file(platformPath);
  ComparisonNode kernelNode =
      await kernel.analyzePackage(inputs, packagesFileUri, platformUri);
  print(ComparisonNode.diff(kernelNode, analyzerNode));
}

/// Compares the analyzer and kernel representations of a test file, and prints
/// the resulting diff.
///
/// Only libraries reached by a "file:" URI are compared.
void compareTestPrograms(
    String sourcePath, String platformPath, String packagesFilePath) async {
  var packagesFileUri = Uri.file(packagesFilePath);
  var platformUri = Uri.file(platformPath);
  ComparisonNode kernelNode = await kernel.analyzeProgram(
      path.toUri(sourcePath),
      packagesFileUri,
      platformUri,
      (uri) => uri.scheme == 'file');
  if (kernelNode.text == 'Error occurred') {
    // TODO(paulberry): really we should verify that the analyzer detects an
    // error as well.  But that's not easy to do right now because we use the
    // front end to chase imports so that we know which files to pass to the
    // analyzer, and we can't rely on the front end import chasing when an error
    // occurred.
    print('No differences found (skipped due to front end compilation error)');
    return;
  }
  String startingPath;
  var inputs = <String>[];
  for (var library in kernelNode.children) {
    var filePath = path.fromUri(Uri.parse(library.text));
    if (startingPath == null) {
      startingPath = path.dirname(filePath);
    } else {
      while (!path.isWithin(startingPath, filePath)) {
        startingPath = path.dirname(startingPath);
      }
    }
    inputs.add(filePath);
  }
  ComparisonNode analyzerNode =
      await analyzer.analyzeFiles(startingPath, inputs);
  var diff = ComparisonNode.diff(kernelNode, analyzerNode);
  if (diff.children.isEmpty && diff.text.startsWith('=')) {
    print('No differences found!');
  } else {
    print('Differences found:');
    print(diff);
  }
}
