// 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-sets');
var device = require('../device');
var deviceSet = require('../device-set');
var format = require('format');
var hg = require('mercury');
var window = require('global/window');

module.exports = {
  render: require('./render'),
  state: state
};

function state(options) {
  options = options || {};

  debug('init: %o', options);

  var atom = hg.state({
    error: hg.value(null),
    current: hg.value(null),
    collection: hg.varhash(options.collection || {}, deviceSet.state),
    channels: {
      add: add,
      remove: remove
    }
  });

  return atom;
}

function add(state, data) {
  if (! data.blob) {
    return;
  }

  var blob = data.blob;

  debug('adding new device set for file: %o', blob);

  if (blob.type !== 'application/pdf') {
    var message = format('The file "%s" is not a PDF.', blob.name);
    var err = new Error(message);
    return state.error.set(err);
  }

  var ds = deviceSet.state({
    file: { blob: data.blob }
  });

  var d = device.state({
    type: 'Browser',
    current: true,
    arch: window.navigator.platform,
    screen: {
      width: window.innerWidth,
      height: window.innerHeight,
    }
  });

  ds.devices.put(d.id(), d);
  state.collection.put(ds.id(), ds);

  // TODO(jasoncampbell): Remove once syncbase is hooked back up.
  debug('adding 3 more fake devices for debugging');
  for (var i = 0; i < 3; i++) {
    d = device.state({ index: i + 1 });
    ds.devices.put(d.id(), d);
  }
}

function remove(state, data) {
  state.collection.delete(data.id);
}
