// 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(
                '../tools',
              ) || // A tool package for developing 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']}';
}
