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

/// Generates the repo's ".dart_tool/package_config.json" file.
library;

// This script should not depend on any external packages, as it is run before
// any package resolution has taken place.
import 'dart:convert';
import 'dart:io';

final repoRoot = File(Platform.script.toFilePath()).parent.parent.uri;

void main() {
  final fluteExists =
      Directory.fromUri(repoRoot.resolve('third_party/flute')).existsSync();
  final overridesFile = File.fromUri(
    repoRoot.resolve('pubspec_overrides.yaml'),
  );
  if (fluteExists) {
    // Make a `pubspec_overrides.yaml` file that includes all existing overrides
    // and also `package:flute` and `package:characters`
    final pubspec =
        File.fromUri(repoRoot.resolve('pubspec.yaml')).readAsStringSync();
    final overrides = RegExp(
      r'^dependency_overrides:\n([^]*?)^$',
      multiLine: true,
    ).firstMatch(pubspec)![1]!;
    overridesFile.writeAsStringSync('''
# Created by tools/generate_package_config.dart to support flute.

dependency_overrides:
  flute:
    path: third_party/flute/framework
  engine:
    path: third_party/flute/engine
  flute_script:
    path: third_party/flute/script
  flute_benchmarks:
    path: third_party/flute/benchmarks
  material_color_utilities:
    path: third_party/pkg/material_color_utilities/dart
  characters:
    path: third_party/pkg/core/pkgs/characters/
$overrides
''');
  } else {
    // Delete the overrides file if it exists.
    if (overridesFile.existsSync()) {
      overridesFile.deleteSync();
    }
  }

  // Invoke `dart pub get` to create a .dart_tool/package_config.json file.
  final result = Process.runSync(
    Platform.resolvedExecutable,
    ['pub', 'get'],
    workingDirectory: repoRoot.toFilePath(),
    // Solve pretending we are running [currentSDKVersion].
    environment: {
      '_PUB_TEST_SDK_VERSION': currentSDKVersion()
    }, // Prevent overriding, e.g., PUB_CACHE
  );
  if (result.exitCode != 0) {
    print('`pub get` failed');
    print(result.stderr);
    print(result.stdout);
    exit(-1);
  }
  final packageConfig = jsonDecode(
    File.fromUri(
      repoRoot.resolve('.dart_tool/package_config.json'),
    ).readAsStringSync(),
  ) as Map<String, Object?>;

  if (!fluteExists) {
    final packages = packageConfig['packages'] as List<Object?>;
    for (final (package as Map<String, Object?>) in packages) {
      final rootUri = package['rootUri'] as String;
      if (!(rootUri.startsWith('../third_party/') || // Third-party package
              rootUri.startsWith('../pkg/') || // SDK package
              rootUri.startsWith('../samples/') || // sample package
              rootUri.startsWith('../runtime/') || // VM package
              rootUri.startsWith('../tests/ffi') || // FFI tests
              rootUri.startsWith(
                '../tools',
              ) || // A tool package for developing the SDK.
              rootUri.startsWith('../utils' ) || // Utils for building the SDK.
              rootUri == '../' // The main workspace package
          )) {
        print('Package ${package['name']} is imported from outside the SDK.');
        print('It has rootUri $rootUri.');
        print(
          'See https://github.com/dart-lang/sdk/blob/main/docs/Adding-and-Updating-Dependencies.md',
        );

        exit(-1);
      }
    }
  }
}

String currentSDKVersion() {
  final versionContents =
      File.fromUri(repoRoot.resolve('tools/VERSION')).readAsStringSync();
  final lines = LineSplitter.split(versionContents);
  final versionParts = {
    for (var line in lines)
      if (line.isNotEmpty && !line.startsWith('#'))
        if (line.split(' ') case [final key, final value]) key: value
  };
  return '${versionParts['MAJOR']}.${versionParts['MINOR']}.${versionParts['PATCH']}';
}
