// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import '../asset.dart';
import '../base/common.dart';
import '../base/file_system.dart';
import '../base/logger.dart';
import '../base/platform.dart';
import '../build_info.dart';
import '../cmake_project.dart';

/// Generate an install manifest that is required for CMAKE on UWP projects.
Future<void> createManifest({
  required Logger logger,
  required FileSystem fileSystem,
  required Platform platform,
  required WindowsUwpProject project,
  required BuildInfo buildInfo,
  required Directory buildDirectory,
}) async {
  final List<File> outputs = <File>[];
  final AssetBundle assetBundle = AssetBundleFactory.defaultInstance(
    logger: logger,
    fileSystem: fileSystem,
    platform: platform,
  ).createBundle();
  final int resultCode = await assetBundle.build(
    packagesPath: buildInfo.packagesPath,
    assetDirPath: buildDirectory.childDirectory('flutter_assets').path,
  );
  if (resultCode != 0) {
    throwToolExit('Failed to build assets.');
  }

  if (buildInfo.mode.isPrecompiled) {
    outputs.add(buildDirectory.childFile('app.so'));
  } else {
    outputs.add(buildDirectory.parent.childDirectory('flutter_assets').childFile('kernel_blob.bin'));
  }
  for (final String key in assetBundle.entries.keys) {
    outputs.add(buildDirectory.parent.childDirectory('flutter_assets').childFile(key));
  }
  outputs.add(project.ephemeralDirectory.childFile('flutter_windows_winuwp.dll'));
  outputs.add(project.ephemeralDirectory.childFile('flutter_windows_winuwp.dll.pdb'));
  outputs.add(project.ephemeralDirectory.childFile('icudtl.dat'));
  project.ephemeralDirectory.childFile('install_manifest')
    ..createSync(recursive: true)
    ..writeAsStringSync(outputs.map((File file) => file.absolute.uri.path.substring(1)).join('\n'));
}
