// Copyright (c) 2017, 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' show JsonEncoder;
import 'dart:io' show File, exit, stderr;
import 'dart:isolate' show RawReceivePort;

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

main(List<String> rawArguments) {
  var port = RawReceivePort();
  bool check = false;
  String? relative;
  List<String> arguments = [];
  for (String argument in rawArguments) {
    if (argument == '--check') {
      check = true;
    } else if (argument.startsWith('--relative=')) {
      relative = argument.substring('--relative='.length);
    } else {
      arguments.add(argument);
    }
  }
  if (arguments.length != 2) {
    stderr.writeln("Usage: yaml2json.dart input.yaml output.json [--check]");
    exit(1);
  }
  Uri input = File(arguments[0]).absolute.uri;
  Uri output = File(arguments[1]).absolute.uri;
  String inputString = arguments[0];
  String outputString = arguments[1];
  if (relative != null) {
    String relativeTo = File(relative).absolute.uri.toString();
    if (input.toString().startsWith(relativeTo)) {
      inputString = input.toString().substring(relativeTo.length);
    }
    if (output.toString().startsWith(relativeTo)) {
      outputString = output.toString().substring(relativeTo.length);
    }
  }
  Map yaml = loadYaml(File.fromUri(input).readAsStringSync());
  Map<String, dynamic> result = <String, dynamic>{};
  result["comment:0"] = "NOTE: THIS FILE IS GENERATED. DO NOT EDIT.";
  result["comment:1"] =
      "Instead modify '$inputString' and follow the instructions therein.";
  for (String key in yaml.keys) {
    result[key] = yaml[key];
  }
  File file = File.fromUri(output);
  String text = const JsonEncoder.withIndent("  ").convert(result);
  if (check) {
    bool needsUpdate = true;
    if (file.existsSync()) {
      String existingText = file.readAsStringSync();
      needsUpdate = text != existingText;
    }
    if (needsUpdate) {
      stderr.write('''
The file $outputString is not up to date. Regenerate using

  dart tools/yaml2json.dart $inputString $outputString
''');
      exit(1);
    }
  } else {
    file.writeAsStringSync(text);
  }
  port.close();
}
