///<reference path="../../headers/common.d.ts" />

var waitSeconds = 100;
var head = document.getElementsByTagName('head')[0];

// get all link tags in the page
var links = document.getElementsByTagName('link');
var linkHrefs = [];
for (var i = 0; i < links.length; i++) {
  linkHrefs.push(links[i].href);
}

var isWebkit = !!window.navigator.userAgent.match(/AppleWebKit\/([^ ;]*)/);
var webkitLoadCheck = function(link, callback) {
  setTimeout(function() {
    for (var i = 0; i < document.styleSheets.length; i++) {
      var sheet = document.styleSheets[i];
      if (sheet.href === link.href) {
        return callback();
      }
    }
    webkitLoadCheck(link, callback);
  }, 10);
};

var noop = function() {};

var loadCSS = function(url) {
  return new Promise(function(resolve, reject) {
    var link = document.createElement('link');
    var timeout = setTimeout(function() {
      reject('Unable to load CSS');
    }, waitSeconds * 1000);

    var _callback = function(error) {
      clearTimeout(timeout);
      link.onload = link.onerror = noop;
      setTimeout(function() {
        if (error) {
          reject(error);
        } else {
          resolve('');
        }
      }, 7);
    };

    link.type = 'text/css';
    link.rel = 'stylesheet';
    link.href = url;

    if (!isWebkit) {
      link.onload = function() { _callback(undefined); };
    } else {
      webkitLoadCheck(link, _callback);
    }

    link.onerror = function(evt: any) {
      _callback(evt.error || new Error('Error loading CSS file.'));
    };

    head.appendChild(link);
  });
};

export function fetch(load): any {
  if (typeof window === 'undefined') {
    return '';
  }

  // dont reload styles loaded in the head
  for (var i = 0; i < linkHrefs.length; i++) {
    if (load.address === linkHrefs[i]) {
      return '';
    }
  }
  return loadCSS(load.address);
}

