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

// Invokes infer_native_assets_yaml_process_run_helper.dart with
// `dart --snapshot-kind=kernel`.
// 1. With an explicitly passed package_config.json path.
// 2. Without an explicitly passed package_config.json, walking up the file
//    tree.

import 'dart:io';

import 'helpers.dart';

Future<void> main(List<String> args, Object? message) async {
  await invokeHelperWithPackagesFlag();
  await invokeHelperWorkingDir();
}

const helperName = 'infer_native_assets_yaml_dart_kernel_snapshot_helper.dart';

final helperSourceuri = Platform.script.resolve(helperName);

final packageMetaUri = Platform.script.resolve('../../../pkg/meta');

/// Add an unused import to see that we're using actually the package config.
final testPackageConfig = '''{
  "configVersion": 2,
  "packages": [
    {
      "name": "meta",
      "rootUri": "$packageMetaUri",
      "packageUri": "lib/",
      "languageVersion": "2.12"
    }
  ],
  "generated": "${DateTime.now()}",
  "generator": "test"
}
''';

Future<void> invokeHelperWithPackagesFlag() async {
  print('invoke helper with --package=...');
  await withTempDir((tempUri) async {
    await createTestFiles(tempUri);

    final helperCopiedUri = tempUri.resolve(helperName);
    final dartToolsUri = tempUri.resolve('.dart_tool/');
    final packageConfigUri = dartToolsUri.resolve('package_config.json');
    final kernelFileUri = tempUri.resolve('$helperName.dill');

    await runDartKernelSnapshot(
      packageConfigUri: packageConfigUri,
      inputUri: helperCopiedUri,
      outputUri: kernelFileUri,
    );
    print('dill file created: $kernelFileUri');
    await runDart(scriptUri: kernelFileUri);
  });
  print('invoke helper with --package=... done');
}

Future<void> invokeHelperWorkingDir() async {
  print('invoke helper in working dir');
  await withTempDir((tempUri) async {
    final helperDillName = '$helperName.dill';
    await createTestFiles(tempUri);
    await runDartKernelSnapshot(
      workingDirectory: tempUri,
      inputUri: Uri(path: helperName),
      outputUri: Uri(path: helperDillName),
    );
    print('dill file created: $helperDillName');
    await runDart(
      workingDirectory: tempUri,
      scriptUri: Uri(path: helperDillName),
    );
  });
  print('invoke helper in working dir done');
}

Future<void> createTestFiles(Uri tempUri) async {
  final helperCopiedUri = tempUri.resolve(helperName);
  await File.fromUri(helperSourceuri).copy(helperCopiedUri.toFilePath());
  print('File copied to $helperCopiedUri.');

  final dartToolsUri = tempUri.resolve('.dart_tool/');
  await Directory.fromUri(dartToolsUri).create();

  final packageConfigUri = dartToolsUri.resolve('package_config.json');
  await File.fromUri(packageConfigUri).writeAsString(testPackageConfig);

  final nativeAssetsYaml = createNativeAssetYaml(
    asset: helperCopiedUri.toString(),
    assetMapping: [
      'absolute',
      ffiTestFunctionsUriAbsolute.toFilePath(),
    ],
  );
  final nativeAssetsUri = dartToolsUri.resolve('native_assets.yaml');
  await File.fromUri(nativeAssetsUri).writeAsString(nativeAssetsYaml);
  print('File native_assets.yaml written to $nativeAssetsUri.');
}
