#!tools/sdks/dart-sdk/bin/dart
// 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.

import 'dart:io';

import 'package:pool/pool.dart';

final pool = Pool(Platform.numberOfProcessors);

main(List<String> args) async {
  final sdkRoot = Platform.script.resolve('../').toFilePath();
  Directory.current = Directory(sdkRoot);

  final extractedOffsetsFile =
      'runtime/vm/compiler/runtime_offsets_extracted.h';

  final old = File(extractedOffsetsFile).readAsStringSync();
  final header = old.substring(0, old.indexOf('\n#if '));
  final footer = old.substring(old.lastIndexOf('\n#endif '));

  // Build all configurations
  await forAllConfigurationsMode(
      (String buildDir, String mode, String arch) async {
    print('Building $buildDir');
    await run([
      'tools/build.py',
      ...args,
      '-a$arch',
      '-m$mode',
      '--no-rbe',
      'offsets_extractor',
      'offsets_extractor_precompiled_runtime'
    ]);
    print('Building $buildDir - done');
  });

  final (jit, aot) = await (
    forAllConfigurationsMode((String buildDir, _, __) async {
      return await run(['$buildDir/offsets_extractor']);
    }).then<String>((lines) => lines.join('\n')),
    forAllConfigurationsMode((String buildDir, _, __) async {
      return await run(['$buildDir/offsets_extractor_precompiled_runtime']);
    }).then<String>((lines) => lines.join('\n')),
  ).wait;

  if (exitCode == 0) {
    final output = StringBuffer();
    output.writeln(header);
    output.writeln(jit);
    output.writeln(aot);
    output.writeln(footer);
    File(extractedOffsetsFile).writeAsStringSync(output.toString());
    print('Written $extractedOffsetsFile');
    print('Running `git cl format $extractedOffsetsFile');
    await run(['git', 'cl', 'format', extractedOffsetsFile]);
  }
}

Future<List<T>> forAllConfigurationsMode<T>(
    Future<T> Function(String buildDir, String mode, String arch) fun) async {
  final archs = [
    'simarm',
    'x64',
    'ia32',
    'simarm64',
    'x64c',
    'simarm64c',
    'simriscv32',
    'simriscv64',
  ];
  final futures = <Future<T>>[];
  for (final mode in ['release', 'product']) {
    for (final arch in archs) {
      final buildDir = 'out/${mode.capitalized}${arch.upper}/';
      futures.add(pool.withResource(() => fun(buildDir, mode, arch)));
    }
  }
  return await Future.wait(futures);
}

Future<String> run(List<String> args) async {
  final result =
      await Process.run(args.first, args.skip(1).toList(), runInShell: true);
  if (result.exitCode != 0) {
    exitCode = result.exitCode;
    print('Running ${args.join(' ')} has failed with exit code $exitCode:');
    print('${result.stdout}');
    print('${result.stderr}');
  }
  return result.stdout;
}

extension on String {
  String get capitalized => substring(0, 1).toUpperCase() + substring(1);
  String get upper => toUpperCase();
}
