// Copyright 2023 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:io';

import 'package:github/github.dart';

const Duration clockSkew = Duration(seconds: 5);
int minApiPoints = 250; // number of points to leave for debugging, etc

class Abort implements Exception { }
enum Mode { full, abbreviated, aborted }
Mode mode = Mode.full;
final Completer<void> aborter = Completer<void>();

Future<void> rateLimit(final GitHub github, final String status, final String next) async {
  if (mode == Mode.aborted) {
    throw Abort();
  }
  stdout.write('$status${ github.rateLimitRemaining != null ? ". Rate limits: ${github.rateLimitRemaining}/${github.rateLimitLimit} per hour" : "" }.\x1B[K\r');
  if (github.rateLimitRemaining != null && github.rateLimitRemaining! < minApiPoints) {
    Duration delay = github.rateLimitReset!.difference(DateTime.now());
    if (delay > Duration.zero) {
      delay += clockSkew;
      print('\nWaiting until ${DateTime.now().add(delay).toLocal()} to continue with $next...');
      await Future.any<void>(<Future<void>>[
        Future<void>.delayed(delay),
        aborter.future,
      ]);
      minApiPoints = 50;
    }
  }
}

void verifyStringSanity(final String value, final Set<String> disallowedSubstrings) {
  for (final String substring in disallowedSubstrings) {
    if (value.contains(substring)) {
      throw FormatException('Found "$disallowedSubstrings" in "$value".');
    }
  }
}

DateTime maxAge(final Duration maxAge) => DateTime.now().subtract(maxAge);
