// Copyright 2021 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:async';
import 'dart:convert';
import 'dart:io';

import 'package:cocoon_service/protos.dart' as pb;
import 'package:github/github.dart';
import 'package:http/http.dart' as http;
import 'package:yaml/yaml.dart';

Future<String> githubFileContent(
  RepositorySlug slug,
  String filePath, {
  String ref = 'master',
  Duration timeout = const Duration(seconds: 5),
}) async {
  final Uri githubUrl = Uri.https('raw.githubusercontent.com', '${slug.fullName}/$ref/$filePath');
  return getUrl(githubUrl);
}

FutureOr<String> getUrl(Uri url) async {
  final http.Client client = http.Client();
  try {
    final http.Response response = await client.get(url);

    if (response.statusCode == HttpStatus.ok) {
      return response.body;
    } else {
      throw HttpException('HTTP ${response.statusCode}: $url');
    }
  } finally {
    client.close();
  }
}

Future<String> getRemoteConfigContent(String repo, String ref) async {
  final String configContent = await githubFileContent(
    RepositorySlug('flutter', repo),
    '.ci.yaml',
    ref: ref,
  );
  return configContent;
}

String getLocalConfigContent(String path) {
  final File configFile = File(path);
  return configFile.readAsStringSync();
}

Future<void> main(List<String> args) async {
  if (args.length != 1 && args.length != 2) {
    print('generate_jspb.dart \$local_ci_yaml');
    print('generate_jspb.dart \$repo \$sha');
    exit(1);
  }
  String configContent;
  if (args.length == 2) {
    configContent = await getRemoteConfigContent(args[0], args[1]);
  } else {
    configContent = getLocalConfigContent(args[0]);
  }

  final YamlMap configYaml = loadYaml(configContent) as YamlMap;
  final pb.SchedulerConfig schedulerConfig = pb.SchedulerConfig()..mergeFromProto3Json(configYaml);

  print(jsonEncode(schedulerConfig.toProto3Json()));
}
