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

@JS()
library gapi_onload;

import 'dart:async';

import 'package:flutter/foundation.dart' show visibleForTesting;
import 'package:js/js.dart';

import 'js_interop/gapi.dart' as gapi;
import 'utils.dart' show injectJSLibraries;

@JS()
external set gapiOnloadCallback(Function callback);

// This name must match the external setter above
/// This is only exposed for testing. It shouldn't be accessed by users of the
/// plugin as it could break at any point.
@visibleForTesting
const String kGapiOnloadCallbackFunctionName = 'gapiOnloadCallback';
String _addOnloadToScript(String url) => url.startsWith('data:')
    ? url
    : '$url?onload=$kGapiOnloadCallbackFunctionName';

/// Injects the GAPI library by its [url], and other additional [libraries].
///
/// GAPI has an onload API where it'll call a callback when it's ready, JSONP style.
Future<void> inject(String url, {List<String> libraries = const <String>[]}) {
  // Inject the GAPI library, and configure the onload global
  final Completer<void> gapiOnLoad = Completer<void>();
  gapiOnloadCallback = allowInterop(() {
    // Funnel the GAPI onload to a Dart future
    gapiOnLoad.complete();
  });

  // Attach the onload callback to the main url
  final List<String> allLibraries = <String>[
    _addOnloadToScript(url),
    ...libraries
  ];

  return Future.wait(
      <Future<void>>[injectJSLibraries(allLibraries), gapiOnLoad.future]);
}

/// Initialize the global gapi object so 'auth2' can be used.
/// Returns a promise that resolves when 'auth2' is ready.
Future<void> init() {
  final Completer<void> gapiLoadCompleter = Completer<void>();
  gapi.load('auth2', allowInterop(() {
    gapiLoadCompleter.complete();
  }));

  // After this resolves, we can use gapi.auth2!
  return gapiLoadCompleter.future;
}
