// This script assumes the following:
//   1. You've installed wd with `npm install wd'.
//   2. You've set the environment variables $SAUCE_USERNAME and $SAUCE_ACCESS_KEY.
//   3. If the environment variable $CIRCLE_ARTIFACTS is not set imanges will be saved in /tmp
//
// The intention of this script is that it will be ran from CircleCI
//
// Example usage:
// node screenshots.js http://localhost:9292/test/visual.html
// node screenshots.js http://google.com

var wd = require('wd');
var username = process.env['SAUCE_USERNAME'];
var accessKey = process.env['SAUCE_ACCESS_KEY'];
var dir = process.env['CIRCLE_ARTIFACTS'] || '/tmp';
var url = process.argv[2];

var browserVersions = [
  {
    'browserName': 'Internet Explorer',
    'platform': 'Windows XP'
  },
  {
    'browserName': 'firefox',
    'platform': 'OS X 10.11'
  },
  {
    'browserName': 'safari'
    //'platform': 'OS X 10.10'
  },
  {
    'browserName': 'chrome',
    'platform': 'OS X 10.11'
  }
];


browserVersions.forEach(function(cfg) {
  var browserDriver = wd.remote('ondemand.saucelabs.com', 80, username, accessKey);
  // The following is in the style of
  // https://github.com/admc/wd/blob/62f2b0060d36a402de5634477b26a5ed4c051967/examples/async/chrome.js#L25-L40
  browserDriver.init(cfg, function(err, _, cap) {
    if (err) console.log(err);

    browserDriver.get(url, function(err) {
      if (err) console.log(err);
      browserDriver.safeExecute('document.documentElement.scrollHeight', function(err,scrollHeight) {
        if (err) console.log(err);
        browserDriver.safeExecute('document.documentElement.clientHeight', function(err,windowHeight) {
          if (err) console.log(err);

          var position = 0;
          // loop generates the image(s). Firefox and Internet Explorer will take
          // a screenshot of the entire webpage, but Opera, Safari, and Chrome
          // do not. For those browsers we scroll through the page and take
          // incremental screenshots.
          (function loop() {
            var browser = cfg.browserName.replace(/\s/g, '_')+(!!cap ? '_'+cap.version : '');
            var platform = (cap ? cap : cfg).platform.replace(/\s/g, '_');
            var shot = (position/windowHeight) + 1;

            if (cfg.browserName == 'firefox' || cfg.browserName == 'Internet Explorer') {
              // saves file in the file `dir/browser_version_platform.png`
              var filename = dir+'/'+browser+'_'+platform+'.png';
              browserDriver.saveScreenshot(filename, function(err) {
                if (err) console.log(err);

                browserDriver.quit();
              });
            } else {
              // Use `window.scrollTo` because thats what jQuery does
              // https://github.com/jquery/jquery/blob/1.12.3/src/offset.js#L186
              browserDriver.safeEval('window.scrollTo(0,'+position+');', function(err) {
                if (err) console.log(JSON.stringify(err));

                // saves file in the file `dir/browser_version_platform_#.png`
                var filename = dir+'/'+browser+'_'+platform+'_'+shot+'.png';
                browserDriver.saveScreenshot(filename, function(err) {
                  if (err) console.log(err);

                  position += windowHeight;
                  if (position >= scrollHeight) {
                    browserDriver.quit();
                  } else {
                    loop();
                  }
                });
              });
            }
          })();
        });
      });
    });
  });
});
