const tv4 = require('tv4');

// Adjust properties of this class when the details of
// library item and inventory item
// diverge from each other in actual use cases

class InventoryBioDetails {
  constructor(opt) {
    this.materialType = null;
    this.riskGroup = null;
    this.category = null;
    this.knownPathogens = null;
    this.naturalHost = null;
    this.naturalHost = null;
    this.exemptAmount = null;
    this.mouseLd50 = null;
    this.blp = null;

    if (opt) {
      this.fillObject(opt);
    }
  }

  fillObject(opt) {
    this.materialType = opt.materialType || null;
    this.riskGroup = opt.riskGroup || null;
    this.category = opt.category || null;
    this.knownPathogens = opt.knownPathogens || null;
    this.naturalHost = opt.naturalHost || null;
    this.exemptAmount = opt.exemptAmount || null;
    this.mouseLd50 = opt.mouseLd50 || null;
    this.blp = opt.blp || null;
  }

  validate() {
    return tv4.validateMultiple(this, InventoryBioDetails.schema());
  }

  static schema() {
    return {
      $schema: 'http://json-schema.org/draft-04/schema#',
      id: 'inventory-item.bio.details.schema.json',
      title: 'Library Item Bio details Schema',
      type: 'object',
      additionalProperties: false,
      properties: {
        materialType: { type: ['string'] },
        riskGroup: { type: ['string'] },
        category: { type: ['string'] },
        knownPathogens: { type: ['string', 'null'] },
        naturalHost: { type: ['string', 'null'] },
        exemptAmount: { type: ['string', 'null'] },
        mouseLd50: { type: ['string', 'null'] },
        blp: { type: ['string', 'null'] },
      },
      required: [
        'blp',
        'category',
        'exemptAmount',
        'knownPathogens',
        'materialType',
        'mouseLd50',
        'naturalHost',
        'riskGroup',
      ],
    };
  }
}

module.exports = InventoryBioDetails;
