// Copyright (c) 2017, 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.

library fasta.get_dependencies;

import 'package:kernel/kernel.dart' show Component, loadComponentFromBytes;

import 'package:kernel/target/targets.dart' show Target;

import '../api_prototype/compiler_options.dart' show CompilerOptions;

import '../api_prototype/file_system.dart' show FileSystem;

import '../base/processed_options.dart' show ProcessedOptions;

import 'compiler_context.dart' show CompilerContext;

import 'dill/dill_target.dart' show DillTarget;

import 'kernel/kernel_target.dart' show KernelTarget;

import 'uri_translator.dart' show UriTranslator;

Future<List<Uri>> getDependencies(Uri script,
    {Uri? sdk,
    Uri? packages,
    Uri? platform,
    bool verbose: false,
    Target? target}) async {
  CompilerOptions options = new CompilerOptions()
    ..target = target
    ..verbose = verbose
    ..packagesFileUri = packages
    ..sdkSummary = platform
    ..sdkRoot = sdk;
  ProcessedOptions pOptions =
      new ProcessedOptions(options: options, inputs: <Uri>[script]);
  return await CompilerContext.runWithOptions(pOptions,
      (CompilerContext c) async {
    FileSystem fileSystem = c.options.fileSystem;
    UriTranslator uriTranslator = await c.options.getUriTranslator();
    c.options.ticker.logMs("Read packages file");
    DillTarget dillTarget =
        new DillTarget(c.options.ticker, uriTranslator, c.options.target);
    if (platform != null) {
      List<int> bytes = await fileSystem.entityForUri(platform).readAsBytes();
      Component platformComponent = loadComponentFromBytes(bytes);
      dillTarget.loader.appendLibraries(platformComponent);
    }
    KernelTarget kernelTarget =
        new KernelTarget(fileSystem, false, dillTarget, uriTranslator);

    kernelTarget.setEntryPoints(<Uri>[script]);
    await dillTarget.buildOutlines();
    await kernelTarget.loader.buildOutlines();
    return new List<Uri>.from(c.dependencies);
  });
}
