Oidc = {};

// Request OpenID Connect credentials for the user
// @param options {optional}
// @param credentialRequestCompleteCallback {Function} Callback function to call on
//   completion. Takes one argument, credentialToken on success, or Error on
//   error.
Oidc.requestCredential = function (options, credentialRequestCompleteCallback) {
  // support both (options, callback) and (callback).
  if (!credentialRequestCompleteCallback && typeof options === 'function') {
    credentialRequestCompleteCallback = options;
    options = {};
  }

  Meteor.call("getServiceConfiguration", "oidc",(_, result) => {
    if (result) {
      var config = result;
      var credentialToken = Random.secret();
      var loginStyle = OAuth._loginStyle('oidc', config, options);
      // options
      options = options || {};
      options.client_id = config.clientId;
      options.response_type = options.response_type || 'code';
      options.redirect_uri = OAuth._redirectUri('oidc', config);
      options.state = OAuth._stateParam(loginStyle, credentialToken, options.redirectUrl);
      options.scope = config.requestPermissions || 'openid profile email';

      if (config.loginStyle && config.loginStyle == 'popup') {
        options.display = 'popup';
      }

      var loginUrl = config.serverUrl + config.authorizationEndpoint;
      // check if the loginUrl already contains a "?"
      var first = loginUrl.indexOf('?') === -1;
      for (var k in options) {
        if (first) {
          loginUrl += '?';
          first = false;
        }
        else {
          loginUrl += '&'
        }
        loginUrl += encodeURIComponent(k) + '=' + encodeURIComponent(options[k]);
      }

      //console.log('XXX: loginURL: ' + loginUrl)

      options.popupOptions = options.popupOptions || {};
      var popupOptions = {
        width:  options.popupOptions.width || 320,
        height: options.popupOptions.height || 450
      };

      OAuth.launchLogin({
        loginService: 'oidc',
        loginStyle: loginStyle,
        loginUrl: loginUrl,
        credentialRequestCompleteCallback: credentialRequestCompleteCallback,
        credentialToken: credentialToken,
        popupOptions: popupOptions,
      });
    }
    else
    {
      credentialRequestCompleteCallback && credentialRequestCompleteCallback(
        new ServiceConfiguration.ConfigError('Service oidc not configured.'));
      return;
    }
  });


};
