// Copyright 2013 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 'dart:convert' as convert;
import 'dart:io' as io show Directory, File;

import 'package:path/path.dart' as p;

import 'build_config.dart';

/// This is a utility class for reading all of the build configurations from
/// a subdirectory of the engine repo. After building an instance of this class,
/// the build configurations can be accessed on the [configs] getter.
class BuildConfigLoader {
  BuildConfigLoader({required this.buildConfigsDir});

  /// Any errors encountered while parsing and loading the build config files
  /// are accumulated in this list as strings. It should be checked for errors
  /// after the first access to the [configs] getter.
  final List<String> errors = <String>[];

  /// The directory where the engine's build config .json files exist.
  final io.Directory buildConfigsDir;

  /// Walks [buildConfigsDir] looking for .json files, which it attempts to
  /// parse as engine build configs. JSON parsing errors during this process
  /// are added as strings to the [errors] list. That last should be checked
  /// for errors after accessing this getter.
  ///
  /// The [BuilderConfig]s given by this getter should be further checked for
  /// validity by calling `BuildConfig.check()` on each one. See
  /// `bin/check.dart` for an example.
  late final Map<String, BuilderConfig> configs = () {
    return _parseAllBuildConfigs(buildConfigsDir);
  }();

  Map<String, BuilderConfig> _parseAllBuildConfigs(io.Directory dir) {
    final Map<String, BuilderConfig> result = <String, BuilderConfig>{};
    if (!dir.existsSync()) {
      errors.add('${buildConfigsDir.path} does not exist.');
      return result;
    }
    final List<io.File> jsonFiles = dir
        .listSync(recursive: true)
        .whereType<io.File>()
        .where((io.File f) => f.path.endsWith('.json'))
        .toList();
    for (final io.File jsonFile in jsonFiles) {
      final String basename = p.basename(jsonFile.path);
      final String name = basename.substring(
        0,
        basename.length - 5,
      );
      final String jsonData = jsonFile.readAsStringSync();
      final dynamic maybeJson;
      try {
        maybeJson = convert.jsonDecode(jsonData);
      } on FormatException catch (e) {
        errors.add('While parsing ${jsonFile.path}:\n$e');
        continue;
      }
      if (maybeJson is! Map<String, Object?>) {
        errors.add('${jsonFile.path} did not contain a json map.');
        continue;
      }
      result[name] =
          BuilderConfig.fromJson(path: jsonFile.path, map: maybeJson);
    }
    return result;
  }
}
