/* eslint no-var: 0 */
/**
  This script prepares a non-Qualia web page for the quoting widget by loading
  all of the needed resources and adding the relevant iframes to the DOM.
  It isn't transpiled, so use JavaScript that works in the browser!
*/
(function quoteWidgetInitScript() {
  var namespace = 'QualiaQuoteWidget';
  window[namespace] = window[namespace] || {};
  var namespaceObject = window[namespace];

  var $;
  var WindowMessenger;
  var windowMessenger;

  function loadjQuery(url, onLoad) {
    var script = document.createElement('script');
    script.src = url;
    script.addEventListener('load', function() {
      $ = jQuery.noConflict(true);
      namespaceObject.$ = $;
      onLoad($);
    });
    document.body.appendChild(script);
  }

  function loadLibraries(urls, onLoad) {
    var loadedPromises = [];
    urls.forEach(function(url) {
      var loadedPromise = $.getScript(url).then(function(code) {
        Function(code)();
      });
      loadedPromises.push(loadedPromise);
    });
    $.when.apply($, loadedPromises).done(onLoad);
  }

  function Frame(frameName, src) {
    var frame = document.createElement('iframe');
    frame.style.display = 'none';
    if (src) {
      frame.src = src;
    }
    frame.name = frameName;

    this.frame = frame;
    this.$frame = $(frame);

    document.body.appendChild(frame);
  }
  Frame.prototype.css = function() {
    this.$frame.css.apply(this.$frame, arguments);
    if (this.frame.iFrameResizer) {
      this.frame.iFrameResizer.resize();
    }
  };
  Frame.prototype.iFrameResize = function(options) {
    iFrameResize(options, this.frame);
  };

  function initFrames(connectURL, settings) {
    WindowMessenger = namespaceObject.WindowMessenger;
    windowMessenger = new WindowMessenger(window, 'host');

    var frames = {
      activator: new Frame('activator', connectURL + '/quote-widget/ui/activator'),
      stage: new Frame('stage', connectURL + '/quote-widget/ui/stage'),
    };

    // Send the token to the child iframes after they register
    windowMessenger.on('registrationAcknowledged', function(windowName) {
      windowMessenger.call(windowName, 'settings', settings);
    });

    windowMessenger.onAny(function(methodName, methodArgs) {
      var args = methodArgs.args || [];
      var targetFrameName = methodArgs.frame;
      var targetFrame = frames[targetFrameName];

      // Call the function on the iframe if we know of it
      if (targetFrame) {
        var method = targetFrame[methodName];
        method && method.apply(targetFrame, args);
      }

      // Call the function within the target frame
      if (targetFrameName) {
        // The below is equivalent to windowMessenger.call(targetFrameName, methodName, ...args)
        args = [targetFrameName, methodName].concat(args);
        windowMessenger.call.apply(windowMessenger, args);
      }
    });
  }

  function init(connectURL, token) {

    var jQueryURL = 'https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js';
    var libraries = [
      connectURL + '/quote-widget/scripts/window-messenger',
      'https://cdnjs.cloudflare.com/ajax/libs/iframe-resizer/3.6.0/iframeResizer.min.js',
    ];
    var settingsEndpoint = connectURL + '/quote-widget/settings/' + token;

    loadjQuery(jQueryURL, function() {
      $.get(settingsEndpoint).then(function(settings) {
        // Make sure the token is valid and enabled before proceeding
        if (!settings.enabled) {
          return;
        }

        // If the token is enabled, load the libraries and iframes
        loadLibraries(libraries, function() {
          initFrames(connectURL, settings);
        });

        // Allow customers to add their own link which can open the qualia quoting modal.
        window.addEventListener('click', function(event) {
          if ($(event.target).is('.get-qualia-quote')) {
            windowMessenger.call('stage', 'show', {
              frame: 'stage',
            });
          }
        });
      });
    });
  }

  var currentScript = document.getElementById('qualia-quote-widget-loader');
  var token = currentScript.getAttribute('data-token');
  var host = 'https://connect.qualia.com';

  window.addEventListener('load', function() {
    init(host, token);
  });

})();
