goog.provide('webfont.NativeFontWatchRunner');

goog.require('webfont.Font');

goog.scope(function () {

/**
* @constructor
* @param {function(webfont.Font)} activeCallback
* @param {function(webfont.Font)} inactiveCallback
* @param {webfont.DomHelper} domHelper
* @param {webfont.Font} font
* @param {number=} opt_timeout
* @param {string=} opt_fontTestString
*/
webfont.NativeFontWatchRunner = function(activeCallback, inactiveCallback, domHelper, font, opt_timeout, opt_fontTestString) {
  this.activeCallback_ = activeCallback;
  this.inactiveCallback_ = inactiveCallback;
  this.font_ = font;
  this.domHelper_ = domHelper;
  this.timeout_ = opt_timeout || 3000;
  this.fontTestString_ = opt_fontTestString || undefined;
};

var NativeFontWatchRunner = webfont.NativeFontWatchRunner;

NativeFontWatchRunner.prototype.start = function () {
  var doc = this.domHelper_.getLoadWindow().document,
      that = this;

  var start = goog.now();

  var loader = new Promise(function (resolve, reject) {
    var check = function () {
      var now = goog.now();

      if (now - start >= that.timeout_) {
        reject();
      } else {
        doc.fonts.load(that.font_.toCssString(), that.fontTestString_).then(function (fonts) {
          if (fonts.length >= 1) {
            resolve();
          } else {
            setTimeout(check, 25);
          }
        }, function () {
          reject();
        });
      }
    };

    check();
  });

  var timeoutId = null,
    timer = new Promise(function (resolve, reject) {
      timeoutId = setTimeout(reject, that.timeout_);
    });

  Promise.race([timer, loader]).then(function () {
    if (timeoutId) {
      clearTimeout(timeoutId);
      timeoutId = null;
    }
    that.activeCallback_(that.font_);
  }, function () {
    that.inactiveCallback_(that.font_);
  });
};

});