// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

var debug = require('debug')('reader:device');
var event = require('synthetic-dom-events');
var extend = require('xtend');
var hg = require('mercury');
var raf = require('raf');
var uuid = require('uuid').v4;
var window = require('global/window');

module.exports = {
  state: state
};

function state(options, key) {
  options = extend({
    id: key || uuid(),
    screen: {}
  }, options);
  debug('init: %o', options);

  var atom = hg.state({
    id: hg.value(options.id),
    current: hg.value(options.current || false),
    type: hg.value(options.type),
    alias: hg.value(options.alias),
    arch: hg.value(options.arch),
    screen: hg.struct({
      width: hg.value(options.screen.width),
      height: hg.value(options.screen.height)
    })
  });

  if (atom.current()) {
    // Fire the resize event just in case the size has changed since a previous
    // value was stashed.
    window.addEventListener('resize', resize(atom));
    window.dispatchEvent(event('resize'));
  }

  return atom;
}

// HACK(jasoncampbell): I couldn't get this event plumbed into to
// state.channels.resize handler. This is a quick way to get an
// optimized resize listener around window resize events.
// SEE: https://developer.mozilla.org/en-US/docs/Web/Events/resize
//
// TODO(jasoncampbell): Make it so only the last resize event trigers the state
// update.
function resize(state) {
  var running = false;

  return function listener(event) {
    if (! running) {
      running = true;
      raf(update);
    }
  };

  function update() {
    var width = window.innerWidth;
    var height = window.innerHeight;

    if (state.screen.width() !== width) {
      state.screen.width.set(width);
    }

    if (state.screen.height() !== height) {
      state.screen.height.set(height);
    }

    running = false;
  }
}
