// 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 db = require('../../dom/blob-store');
var debug = require('debug')('reader:file');
var extend = require('xtend');
var hash = require('./hash-blob');
var hg = require('mercury');
var uuid = require('uuid').v4;
var window = require('global/window');

module.exports = {
  state: state
};

function state(options, key) {
  options = extend({
    id: key || uuid()
  }, options);

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

  // If the blob was created in this application instance it will be a File
  // object and have a name attribute. If it was created by a peer it will
  // manifest locally as a Blob object (Files can't be directly constructed).
  //
  // SEE: https://developer.mozilla.org/en-US/docs/Web/API/File
  var blob = options.blob || {};

  var atom = hg.state({
    id: hg.value(options.id),
    ref: hg.value(options.ref || ''),
    title: hg.value(options.title || blob.name || ''),
    size: hg.value(options.size || blob.size),
    type: hg.value(options.type || blob.type),
    blob: hg.value(blob || null),
    hash: hg.value(options.hash || ''),
    error: hg.value(null),
  });

  // If this file's blob is set, hash it's contents and save it in the local db
  // for later. This makes reloading the page easier as the blob data will be
  // available for quick retreival later.
  if (blob instanceof window.Blob) {
    save(atom, { blob: atom.blob() });
  } else if (atom.hash()) {
    load(atom, { hash: atom.hash() });
  }

  return atom;
}

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

  hash(data.blob, onhash);

  function onhash(err, digest) {
    if (err) {
      return done(err);
    }

    state.hash.set(digest);
    db.put(digest, data.blob, done);
  }

  function done(err) {
    if (err) {
      return state.error.set(err);
    }
  }
}

function load(state, data) {
  if (! data.hash) {
    return;
  }

  db.get(data.hash, onget);

  function onget(err, blob) {
    if (err) {
      return state.error.set(err);
    }

    state.blob.set(blob);
  }
}
