text: 'use strict';
  
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  
  function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
  
  function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
  
  var Worksheet = require('./worksheet');
  
  var DefinedNames = require('./defined-names');
  
  var XLSX = require('./../xlsx/xlsx');
  
  var CSV = require('./../csv/csv'); // Workbook requirements
  //  Load and Save from file and stream
  //  Access/Add/Delete individual worksheets
  //  Manage String table, Hyperlink table, etc.
  //  Manage scaffolding for contained objects to write to/read from
  
  
  var Workbook =
  /*#__PURE__*/
  function () {
    function Workbook() {
      _classCallCheck(this, Workbook);
  
      this.created = new Date();
      this.modified = this.created;
      this.properties = {};
      this.calcProperties = {};
      this._worksheets = [];
      this.views = [];
      this.media = [];
      this._definedNames = new DefinedNames();
    }
  
    _createClass(Workbook, [{
      key: "addWorksheet",
      value: function addWorksheet(name, options) {
        var id = this.nextId;
  
        if (name && name.length > 31) {
          // eslint-disable-next-line no-console
          console.warn("Worksheet name ".concat(name, " exceeds 31 chars. This will be truncated"));
        }
  
        name = (name || "sheet".concat(id)).substring(0, 31);
  
        if (this._worksheets.find(function (ws) {
          return ws && ws.name === name;
        })) {
          throw new Error("Worksheet name already exists: ".concat(name));
        } // if options is a color, call it tabColor (and signal deprecated message)
  
  
        if (options) {
          if (typeof options === 'string') {
            // eslint-disable-next-line no-console
            console.trace('tabColor argument is now deprecated. Please use workbook.addWorksheet(name, {properties: { tabColor: { argb: "rbg value" } }');
            options = {
              properties: {
                tabColor: {
                  argb: options
                }
              }
            };
          } else if (options.argb || options.theme || options.indexed) {
            // eslint-disable-next-line no-console
            console.trace('tabColor argument is now deprecated. Please use workbook.addWorksheet(name, {properties: { tabColor: { ... } }');
            options = {
              properties: {
                tabColor: options
              }
            };
          }
        }
  
        var lastOrderNo = this._worksheets.reduce(function (acc, ws) {
          return (ws && ws.orderNo) > acc ? ws.orderNo : acc;
        }, 0);
  
        var worksheetOptions = Object.assign({}, options, {
          id: id,
          name: name,
          orderNo: lastOrderNo + 1,
          workbook: this
        });
        var worksheet = new Worksheet(worksheetOptions);
        this._worksheets[id] = worksheet;
        return worksheet;
      }
    }, {
      key: "removeWorksheetEx",
      value: function removeWorksheetEx(worksheet) {
        delete this._worksheets[worksheet.id];
      }
    }, {
      key: "removeWorksheet",
      value: function removeWorksheet(id) {
        var worksheet = this.getWorksheet(id);
  
        if (worksheet) {
          worksheet.destroy();
        }
      }
    }, {
      key: "getWorksheet",
      value: function getWorksheet(id) {
        if (id === undefined) {
          return this._worksheets.find(Boolean);
        }
  
        if (typeof id === 'number') {
          return this._worksheets[id];
        }
  
        if (typeof id === 'string') {
          return this._worksheets.find(function (worksheet) {
            return worksheet && worksheet.name === id;
          });
        }
  
        return undefined;
      }
    }, {
      key: "eachSheet",
      value: function eachSheet(iteratee) {
        this.worksheets.forEach(function (sheet) {
          iteratee(sheet, sheet.id);
        });
      }
    }, {
      key: "clearThemes",
      value: function clearThemes() {
        // Note: themes are not an exposed feature, meddle at your peril!
        this._themes = undefined;
      }
    }, {
      key: "addImage",
      value: function addImage(image) {
        // TODO:  validation?
        var id = this.media.length;
        this.media.push(Object.assign({}, image, {
          type: 'image'
        }));
        return id;
      }
    }, {
      key: "getImage",
      value: function getImage(id) {
        return this.media[id];
      }
    }, {
      key: "xlsx",
      get: function get() {
        if (!this._xlsx) this._xlsx = new XLSX(this);
        return this._xlsx;
      }
    }, {
      key: "csv",
      get: function get() {
        if (!this._csv) this._csv = new CSV(this);
        return this._csv;
      }
    }, {
      key: "nextId",
      get: function get() {
        // find the next unique spot to add worksheet
        for (var i = 1; i < this._worksheets.length; i++) {
          if (!this._worksheets[i]) {
            return i;
          }
        }
  
        return this._worksheets.length || 1;
      }
    }, {
      key: "worksheets",
      get: function get() {
        // return a clone of _worksheets
        return this._worksheets.slice(1).sort(function (a, b) {
          return a.orderNo - b.orderNo;
        }).filter(Boolean);
      }
    }, {
      key: "definedNames",
      get: function get() {
        return this._definedNames;
      }
    }, {
      key: "model",
      get: function get() {
        return {
          creator: this.creator || 'Unknown',
          lastModifiedBy: this.lastModifiedBy || 'Unknown',
          lastPrinted: this.lastPrinted,
          created: this.created,
          modified: this.modified,
          properties: this.properties,
          worksheets: this.worksheets.map(function (worksheet) {
            return worksheet.model;
          }),
          sheets: this.worksheets.map(function (ws) {
            return ws.model;
          }).filter(Boolean),
          definedNames: this._definedNames.model,
          views: this.views,
          company: this.company,
          manager: this.manager,
          title: this.title,
          subject: this.subject,
          keywords: this.keywords,
          category: this.category,
          description: this.description,
          language: this.language,
          revision: this.revision,
          contentStatus: this.contentStatus,
          themes: this._themes,
          media: this.media,
          calcProperties: this.calcProperties
        };
      },
      set: function set(value) {
        var _this = this;
  
        this.creator = value.creator;
        this.lastModifiedBy = value.lastModifiedBy;
        this.lastPrinted = value.lastPrinted;
        this.created = value.created;
        this.modified = value.modified;
        this.company = value.company;
        this.manager = value.manager;
        this.title = value.title;
        this.subject = value.subject;
        this.keywords = value.keywords;
        this.category = value.category;
        this.description = value.description;
        this.language = value.language;
        this.revision = value.revision;
        this.contentStatus = value.contentStatus;
        this.properties = value.properties;
        this.calcProperties = value.calcProperties;
        this._worksheets = [];
        value.worksheets.forEach(function (worksheetModel) {
          var id = worksheetModel.id,
              name = worksheetModel.name,
              state = worksheetModel.state;
          var orderNo = value.sheets && value.sheets.findIndex(function (ws) {
            return ws.id === id;
          });
          var worksheet = _this._worksheets[id] = new Worksheet({
            id: id,
            name: name,
            orderNo: orderNo,
            state: state,
            workbook: _this
          });
          worksheet.model = worksheetModel;
        });
        this._definedNames.model = value.definedNames;
        this.views = value.views;
        this._themes = value.themes;
        this.media = value.media || [];
      }
    }]);
  
    return Workbook;
  }();
  
  module.exports = Workbook;
  //# sourceMappingURL=workbook.js.map
  