// Copyright 2019 The Chromium 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 gapiauth2;

import "package:js/js.dart";
import "package:js/js_util.dart" show promiseToFuture;

/// Type definitions for non-npm package Google Sign-In API 0.0
/// Project: https://developers.google.com/identity/sign-in/web/
/// Definitions by: Derek Lawless <https://github.com/flawless2011>
/// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
/// TypeScript Version: 2.3

/// <reference types="gapi" />

@anonymous
@JS()
class GoogleAuthInitFailureError {
  external String get error;
  external set error(String value);

  external String get details;
  external set details(String value);
}

@anonymous
@JS()
class GoogleAuthSignInError {
  external String get error;
  external set error(String value);
}

// Module gapi.auth2
/// GoogleAuth is a singleton class that provides methods to allow the user to sign in with a Google account,
/// get the user's current sign-in status, get specific data from the user's Google profile,
/// request additional scopes, and sign out from the current account.
@JS("gapi.auth2.GoogleAuth")
class GoogleAuth {
  external IsSignedIn get isSignedIn;
  external set isSignedIn(IsSignedIn v);
  external CurrentUser get currentUser;
  external set currentUser(CurrentUser v);

  /// Calls the onInit function when the GoogleAuth object is fully initialized, or calls the onFailure function if
  /// initialization fails.
  external dynamic then(dynamic onInit(GoogleAuth googleAuth),
      [dynamic onFailure(GoogleAuthInitFailureError reason)]);

  /// Signs out all accounts from the application.
  external dynamic signOut();

  /// Revokes all of the scopes that the user granted.
  external dynamic disconnect();

  /// Attaches the sign-in flow to the specified container's click handler.
  external dynamic attachClickHandler(
      dynamic container,
      SigninOptions options,
      dynamic onsuccess(GoogleUser googleUser),
      dynamic onfailure(String reason));
}

@anonymous
@JS()
abstract class _GoogleAuth {
  external Promise<GoogleUser> signIn(
      [dynamic /*SigninOptions|SigninOptionsBuilder*/ options]);
  external Promise<dynamic /*{code: string}*/ > grantOfflineAccess(
      [OfflineAccessOptions options]);
}

extension GoogleAuthExtensions on GoogleAuth {
  Future<GoogleUser> signIn(
      [dynamic /*SigninOptions|SigninOptionsBuilder*/ options]) {
    final Object t = this;
    final _GoogleAuth tt = t;
    return promiseToFuture(tt.signIn(options));
  }

  Future<dynamic /*{code: string}*/ > grantOfflineAccess(
      [OfflineAccessOptions options]) {
    final Object t = this;
    final _GoogleAuth tt = t;
    return promiseToFuture(tt.grantOfflineAccess(options));
  }
}

@anonymous
@JS()
abstract class IsSignedIn {
  /// Returns whether the current user is currently signed in.
  external bool get();

  /// Listen for changes in the current user's sign-in state.
  external void listen(dynamic listener(bool signedIn));
}

@anonymous
@JS()
abstract class CurrentUser {
  /// Returns a GoogleUser object that represents the current user. Note that in a newly-initialized
  /// GoogleAuth instance, the current user has not been set. Use the currentUser.listen() method or the
  /// GoogleAuth.then() to get an initialized GoogleAuth instance.
  external GoogleUser get();

  /// Listen for changes in currentUser.
  external void listen(dynamic listener(GoogleUser user));
}

@anonymous
@JS()
abstract class SigninOptions {
  /// The package name of the Android app to install over the air.
  /// See Android app installs from your web site:
  /// https://developers.google.com/identity/sign-in/web/android-app-installs
  external String get app_package_name;
  external set app_package_name(String v);

  /// Fetch users' basic profile information when they sign in.
  /// Adds 'profile', 'email' and 'openid' to the requested scopes.
  /// True if unspecified.
  external bool get fetch_basic_profile;
  external set fetch_basic_profile(bool v);

  /// Specifies whether to prompt the user for re-authentication.
  /// See OpenID Connect Request Parameters:
  /// https://openid.net/specs/openid-connect-basic-1_0.html#RequestParameters
  external String get prompt;
  external set prompt(String v);

  /// The scopes to request, as a space-delimited string.
  /// Optional if fetch_basic_profile is not set to false.
  external String get scope;
  external set scope(String v);

  /// The UX mode to use for the sign-in flow.
  /// By default, it will open the consent flow in a popup.
  external String /*'popup'|'redirect'*/ get ux_mode;
  external set ux_mode(String /*'popup'|'redirect'*/ v);

  /// If using ux_mode='redirect', this parameter allows you to override the default redirect_uri that will be used at the end of the consent flow.
  /// The default redirect_uri is the current URL stripped of query parameters and hash fragment.
  external String get redirect_uri;
  external set redirect_uri(String v);
  external factory SigninOptions(
      {String app_package_name,
      bool fetch_basic_profile,
      String prompt,
      String scope,
      String /*'popup'|'redirect'*/ ux_mode,
      String redirect_uri});
}

/// Definitions by: John <https://github.com/jhcao23>
/// Interface that represents the different configuration parameters for the GoogleAuth.grantOfflineAccess(options) method.
/// Reference: https://developers.google.com/api-client-library/javascript/reference/referencedocs#gapiauth2offlineaccessoptions
@anonymous
@JS()
abstract class OfflineAccessOptions {
  external String get scope;
  external set scope(String v);
  external String /*'select_account'|'consent'*/ get prompt;
  external set prompt(String /*'select_account'|'consent'*/ v);
  external String get app_package_name;
  external set app_package_name(String v);
  external factory OfflineAccessOptions(
      {String scope,
      String /*'select_account'|'consent'*/ prompt,
      String app_package_name});
}

/// Interface that represents the different configuration parameters for the gapi.auth2.init method.
/// Reference: https://developers.google.com/api-client-library/javascript/reference/referencedocs#gapiauth2clientconfig
@anonymous
@JS()
abstract class ClientConfig {
  /// The app's client ID, found and created in the Google Developers Console.
  external String get client_id;
  external set client_id(String v);

  /// The domains for which to create sign-in cookies. Either a URI, single_host_origin, or none.
  /// Defaults to single_host_origin if unspecified.
  external String get cookie_policy;
  external set cookie_policy(String v);

  /// The scopes to request, as a space-delimited string. Optional if fetch_basic_profile is not set to false.
  external String get scope;
  external set scope(String v);

  /// Fetch users' basic profile information when they sign in. Adds 'profile' and 'email' to the requested scopes. True if unspecified.
  external bool get fetch_basic_profile;
  external set fetch_basic_profile(bool v);

  /// The Google Apps domain to which users must belong to sign in. This is susceptible to modification by clients,
  /// so be sure to verify the hosted domain property of the returned user. Use GoogleUser.getHostedDomain() on the client,
  /// and the hd claim in the ID Token on the server to verify the domain is what you expected.
  external String get hosted_domain;
  external set hosted_domain(String v);

  /// Used only for OpenID 2.0 client migration. Set to the value of the realm that you are currently using for OpenID 2.0,
  /// as described in <a href="https://developers.google.com/accounts/docs/OpenID#openid-connect">OpenID 2.0 (Migration)</a>.
  external String get openid_realm;
  external set openid_realm(String v);

  /// The UX mode to use for the sign-in flow.
  /// By default, it will open the consent flow in a popup.
  external String /*'popup'|'redirect'*/ get ux_mode;
  external set ux_mode(String /*'popup'|'redirect'*/ v);

  /// If using ux_mode='redirect', this parameter allows you to override the default redirect_uri that will be used at the end of the consent flow.
  /// The default redirect_uri is the current URL stripped of query parameters and hash fragment.
  external String get redirect_uri;
  external set redirect_uri(String v);
  external factory ClientConfig(
      {String client_id,
      String cookie_policy,
      String scope,
      bool fetch_basic_profile,
      String hosted_domain,
      String openid_realm,
      String /*'popup'|'redirect'*/ ux_mode,
      String redirect_uri});
}

@JS("gapi.auth2.SigninOptionsBuilder")
class SigninOptionsBuilder {
  external dynamic setAppPackageName(String name);
  external dynamic setFetchBasicProfile(bool fetch);
  external dynamic setPrompt(String prompt);
  external dynamic setScope(String scope);
}

@anonymous
@JS()
abstract class BasicProfile {
  external String getId();
  external String getName();
  external String getGivenName();
  external String getFamilyName();
  external String getImageUrl();
  external String getEmail();
}

/// Reference: https://developers.google.com/api-client-library/javascript/reference/referencedocs#gapiauth2authresponse
@anonymous
@JS()
abstract class AuthResponse {
  external String get access_token;
  external set access_token(String v);
  external String get id_token;
  external set id_token(String v);
  external String get login_hint;
  external set login_hint(String v);
  external String get scope;
  external set scope(String v);
  external num get expires_in;
  external set expires_in(num v);
  external num get first_issued_at;
  external set first_issued_at(num v);
  external num get expires_at;
  external set expires_at(num v);
  external factory AuthResponse(
      {String access_token,
      String id_token,
      String login_hint,
      String scope,
      num expires_in,
      num first_issued_at,
      num expires_at});
}

/// Reference: https://developers.google.com/api-client-library/javascript/reference/referencedocs#gapiauth2authorizeconfig
@anonymous
@JS()
abstract class AuthorizeConfig {
  external String get client_id;
  external set client_id(String v);
  external String get scope;
  external set scope(String v);
  external String get response_type;
  external set response_type(String v);
  external String get prompt;
  external set prompt(String v);
  external String get cookie_policy;
  external set cookie_policy(String v);
  external String get hosted_domain;
  external set hosted_domain(String v);
  external String get login_hint;
  external set login_hint(String v);
  external String get app_package_name;
  external set app_package_name(String v);
  external String get openid_realm;
  external set openid_realm(String v);
  external bool get include_granted_scopes;
  external set include_granted_scopes(bool v);
  external factory AuthorizeConfig(
      {String client_id,
      String scope,
      String response_type,
      String prompt,
      String cookie_policy,
      String hosted_domain,
      String login_hint,
      String app_package_name,
      String openid_realm,
      bool include_granted_scopes});
}

/// Reference: https://developers.google.com/api-client-library/javascript/reference/referencedocs#gapiauth2authorizeresponse
@anonymous
@JS()
abstract class AuthorizeResponse {
  external String get access_token;
  external set access_token(String v);
  external String get id_token;
  external set id_token(String v);
  external String get code;
  external set code(String v);
  external String get scope;
  external set scope(String v);
  external num get expires_in;
  external set expires_in(num v);
  external num get first_issued_at;
  external set first_issued_at(num v);
  external num get expires_at;
  external set expires_at(num v);
  external String get error;
  external set error(String v);
  external String get error_subtype;
  external set error_subtype(String v);
  external factory AuthorizeResponse(
      {String access_token,
      String id_token,
      String code,
      String scope,
      num expires_in,
      num first_issued_at,
      num expires_at,
      String error,
      String error_subtype});
}

/// A GoogleUser object represents one user account.
@anonymous
@JS()
abstract class GoogleUser {
  /// Get the user's unique ID string.
  external String getId();

  /// Returns true if the user is signed in.
  external bool isSignedIn();

  /// Get the user's Google Apps domain if the user signed in with a Google Apps account.
  external String getHostedDomain();

  /// Get the scopes that the user granted as a space-delimited string.
  external String getGrantedScopes();

  /// Get the user's basic profile information.
  external BasicProfile getBasicProfile();

  /// Get the response object from the user's auth session.
  external AuthResponse getAuthResponse([bool includeAuthorizationData]);

  /// Returns true if the user granted the specified scopes.
  external bool hasGrantedScopes(String scopes);

  /// Signs in the user. Use this method to request additional scopes for incremental
  /// authorization or to sign in a user after the user has signed out.
  /// When you use GoogleUser.signIn(), the sign-in flow skips the account chooser step.
  /// See GoogleAuth.signIn().
  external dynamic signIn(
      [dynamic /*SigninOptions|SigninOptionsBuilder*/ options]);

  /// See GoogleUser.signIn()
  external dynamic grant(
      [dynamic /*SigninOptions|SigninOptionsBuilder*/ options]);

  /// Get permission from the user to access the specified scopes offline.
  /// When you use GoogleUser.grantOfflineAccess(), the sign-in flow skips the account chooser step.
  /// See GoogleUser.grantOfflineAccess().
  external void grantOfflineAccess(String scopes);

  /// Revokes all of the scopes that the user granted.
  external void disconnect();
}

@anonymous
@JS()
abstract class _GoogleUser {
  external Promise<AuthResponse> reloadAuthResponse();
}

extension GoogleUserExtensions on GoogleUser {
  Future<AuthResponse> reloadAuthResponse() {
    final Object t = this;
    final _GoogleUser tt = t;
    return promiseToFuture(tt.reloadAuthResponse());
  }
}

/// Initializes the GoogleAuth object.
/// Reference: https://developers.google.com/api-client-library/javascript/reference/referencedocs#gapiauth2initparams
@JS("gapi.auth2.init")
external GoogleAuth init(ClientConfig params);

/// Returns the GoogleAuth object. You must initialize the GoogleAuth object with gapi.auth2.init() before calling this method.
@JS("gapi.auth2.getAuthInstance")
external GoogleAuth getAuthInstance();

/// Performs a one time OAuth 2.0 authorization.
/// Reference: https://developers.google.com/api-client-library/javascript/reference/referencedocs#gapiauth2authorizeparams-callback
@JS("gapi.auth2.authorize")
external void authorize(
    AuthorizeConfig params, void callback(AuthorizeResponse response));
// End module gapi.auth2

// Module gapi.signin2
@JS("gapi.signin2.render")
external void render(
    dynamic id,
    dynamic
        /*{
    /**
     * The auth scope or scopes to authorize. Auth scopes for individual APIs can be found in their documentation.
     */
    scope?: string;

    /**
     * The width of the button in pixels (default: 120).
     */
    width?: number;

    /**
     * The height of the button in pixels (default: 36).
     */
    height?: number;

    /**
     * Display long labels such as "Sign in with Google" rather than "Sign in" (default: false).
     */
    longtitle?: boolean;

    /**
     * The color theme of the button: either light or dark (default: light).
     */
    theme?: string;

    /**
     * The callback function to call when a user successfully signs in (default: none).
     */
    onsuccess?(user: auth2.GoogleUser): void;

    /**
     * The callback function to call when sign-in fails (default: none).
     */
    onfailure?(reason: { error: string }): void;

    /**
     * The package name of the Android app to install over the air. See
     * <a href="https://developers.google.com/identity/sign-in/web/android-app-installs">Android app installs from your web site</a>.
     * Optional. (default: none)
     */
    app_package_name?: string;
  }*/
        options);

// End module gapi.signin2
@JS()
abstract class Promise<T> {
  external factory Promise(
      void executor(void resolve(T result), Function reject));
  external Promise then(void onFulfilled(T result), [Function onRejected]);
}
