text: var Immutable = require('immutable');
  
  var Book = require('./book');
  var LocationUtils = require('../utils/location');
  
  var Output = Immutable.Record({
      book:       Book(),
  
      // Name of the generator being used
      generator:  String(),
  
      // Map of plugins to use (String -> Plugin)
      plugins:    Immutable.OrderedMap(),
  
      // Map pages to generation (String -> Page)
      pages:      Immutable.OrderedMap(),
  
      // List assets (String)
      assets:     Immutable.List(),
  
      // Option for the generation
      options:    Immutable.Map(),
  
      // Internal state for the generation
      state:      Immutable.Map()
  });
  
  Output.prototype.getBook = function() {
      return this.get('book');
  };
  
  Output.prototype.getGenerator = function() {
      return this.get('generator');
  };
  
  Output.prototype.getPlugins = function() {
      return this.get('plugins');
  };
  
  Output.prototype.getPages = function() {
      return this.get('pages');
  };
  
  Output.prototype.getOptions = function() {
      return this.get('options');
  };
  
  Output.prototype.getAssets = function() {
      return this.get('assets');
  };
  
  Output.prototype.getState = function() {
      return this.get('state');
  };
  
  /**
      Return a page byt its file path
  
      @param {String} filePath
      @return {Page|undefined}
  */
  Output.prototype.getPage = function(filePath) {
      filePath = LocationUtils.normalize(filePath);
  
      var pages = this.getPages();
      return pages.get(filePath);
  };
  
  /**
      Get root folder for output
  
      @return {String}
  */
  Output.prototype.getRoot = function() {
      return this.getOptions().get('root');
  };
  
  /**
      Update state of output
  
      @param {Map} newState
      @return {Output}
  */
  Output.prototype.setState = function(newState) {
      return this.set('state', newState);
  };
  
  /**
      Update options
  
      @param {Map} newOptions
      @return {Output}
  */
  Output.prototype.setOptions = function(newOptions) {
      return this.set('options', newOptions);
  };
  
  /**
      Return logegr for this output (same as book)
  
      @return {Logger}
  */
  Output.prototype.getLogger = function() {
      return this.getBook().getLogger();
  };
  
  module.exports = Output;
  