// 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:io' show File, Platform;

import 'package:yaml/yaml.dart' show YamlMap, loadYaml;

void main() {
  YamlMap yaml = loadYaml(File.fromUri(computeYamlFile()).readAsStringSync());
  final currentVersion = getAsVersionNumber(yaml['current-version'])!;
  final enumNames = StringBuffer();
  final featureValues = StringBuffer();
  final featureNames = StringBuffer();

  YamlMap features = yaml['features'];
  for (var entry in features.entries) {
    final value = entry.value as YamlMap;
    final category = value['category'];
    if (category == null || category == "vm" || category == "language") {
      final version = getAsVersionNumber(value['enabledIn']);
      if (version != null) {
        final value = isGreaterOrEqualVersion(currentVersion, version);
        final name = (entry.key as String).replaceAll('-', '_');
        enumNames.write('  $name,\n');
        featureValues.write('    $value,\n');
        featureNames.write('    "${entry.key}",\n');
      }
    }
  }

  final h = '''
// 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.
// NOTE: THIS FILE IS GENERATED. DO NOT EDIT.
//
// Instead modify 'tools/experimental_features.yaml' and run
// 'dart tools/generate_experimental_flags.dart' to update.

#ifndef RUNTIME_VM_EXPERIMENTAL_FEATURES_H_
#define RUNTIME_VM_EXPERIMENTAL_FEATURES_H_

namespace dart {

enum class ExperimentalFeature {
$enumNames};

bool GetExperimentalFeatureDefault(ExperimentalFeature feature);
const char* GetExperimentalFeatureName(ExperimentalFeature feature);

}  // namespace dart

#endif  // RUNTIME_VM_EXPERIMENTAL_FEATURES_H_
''';

  final cc = '''
// 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.
// NOTE: THIS FILE IS GENERATED. DO NOT EDIT.
//
// Instead modify 'tools/experimental_features.yaml' and run
// 'dart tools/generate_experimental_flags.dart' to update.

#include "vm/experimental_features.h"

#include <cstring>
#include "platform/assert.h"
#include "vm/globals.h"

namespace dart {

bool GetExperimentalFeatureDefault(ExperimentalFeature feature) {
  constexpr bool kFeatureValues[] = {
$featureValues  };
  ASSERT(static_cast<size_t>(feature) < ARRAY_SIZE(kFeatureValues));
  return kFeatureValues[static_cast<int>(feature)];
}

const char* GetExperimentalFeatureName(ExperimentalFeature feature) {
  constexpr const char* kFeatureNames[] = {
$featureNames  };
  ASSERT(static_cast<size_t>(feature) < ARRAY_SIZE(kFeatureNames));
  return kFeatureNames[static_cast<int>(feature)];
}

}  // namespace dart
''';

  File.fromUri(computeHFile()).writeAsStringSync(h);
  File.fromUri(computeCcFile()).writeAsStringSync(cc);
}

Uri computeYamlFile() {
  return Platform.script.resolve("experimental_features.yaml");
}

Uri computeCcFile() {
  return Platform.script.resolve("../runtime/vm/experimental_features.cc");
}

Uri computeHFile() {
  return Platform.script.resolve("../runtime/vm/experimental_features.h");
}

List<num>? getAsVersionNumber(dynamic value) {
  if (value == null) return null;
  final version = List.of("$value".split(".").map(int.parse));
  while (version.length < 3) {
    version.add(0);
  }
  return version;
}

bool isGreaterOrEqualVersion(List<num> left, List<num> right) {
  assert(left.length == right.length);
  for (var i = 0; i < left.length; ++i) {
    if (left[i] != right[i]) return left[i] > right[i];
  }
  return true;
}
