// 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.

import 'dart:convert';
import 'dart:io';

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

/// A class to represent a SDK configuration file.
///
/// This file may or may not be present in a Dart SDK. If it exists, the values
/// in it can be used to configure the SDK for specific environments, like
/// google3. This file generally lives in `<dart-sdk>/config/settings.json`.
class SdkConfiguration {
  final Map<String, dynamic> _values = {};

  SdkConfiguration.readFromFile(File file) {
    if (!file.existsSync()) {
      throw '$file not found';
    }

    _readFromFile(file);
  }

  /// Create an SDK configuration based on any SDK configuration file at
  /// <dart-sdk>/config/settings.json.
  ///
  /// This constructor will still create an object even if a configuration file
  /// is not found.
  SdkConfiguration.readFromSdk() {
    // <dart-sdk>/config/settings.json:
    final sdkDir =
        Directory(path.dirname(path.dirname(Platform.resolvedExecutable)));
    final configFile = File(path.join(sdkDir.path, 'config', 'settings.json'));

    if (configFile.existsSync()) {
      _readFromFile(configFile);
    }
  }

  /// Whether analytics is forced on.
  bool? get analyticsForceEnabled => _values['server.analytics.forceEnabled'];

  /// Return an override value for the analysis server's google analytics ID, or
  /// `null` if the default value should be used.
  String? get analyticsId => _values['server.analytics.id'];

  /// Whether crash reporting is forced on.
  bool? get crashReportingForceEnabled =>
      _values['server.crash.reporting.forceEnabled'];

  /// Return an override value for the analysis server's crash reporting product
  /// ID, or `null` if the default value should be used.
  String? get crashReportingId => _values['server.crash.reporting.id'];

  /// Return a string describing the contents of this SDK configuration.
  String get displayString {
    return _values.keys.map((key) => '$key: ${_values[key]}').join('\n');
  }

  /// Returns whether this SDK configuration has any configured values.
  bool get hasAnyOverrides => _values.isNotEmpty;

  @override
  String toString() => displayString;

  void _readFromFile(File file) {
    try {
      Map m = jsonDecode(file.readAsStringSync());
      for (var key in m.keys) {
        _values[key] = m[key];
      }
    } catch (_) {
      // ignore issues reading the file
    }
  }
}
