Source: models/Mission.js

import { languageString, faction, missionType, node, insist } from 'warframe-worldstate-data/utilities';

import mdConfig from '../supporting/MarkdownSettings.js';

import Reward from './Reward.js';

/**
 * Represents an in-game mission
 */
export default class Mission {
  /**
   * @param   {object}             data            The mission data
   * @param   {string}             locale     Locale to use for translations
   */
  constructor(data, { locale = 'en' } = { locale: 'en' }) {
    const deps = {
      locale,
    };
    insist(data);

    /**
     * The mission's description
     * @type {?string}
     */
    this.description = languageString(data.descText, locale);

    /**
     * The node where the mission takes place
     * @type {string}
     */
    this.node = node(data.location || data.node, locale);

    /**
     * Unlocalized {@link mission#node}
     * @type {string}
     */
    this.nodeKey = node(data.location || data.node, 'en');

    /**
     * The mission's type
     * @type {string}
     */
    this.type = missionType(data.missionType, locale);

    /**
     * The mission's type
     * @type {string}
     */
    this.typeKey = missionType(data.missionType, 'en');

    /**
     * The factions that the players must fight in the mission
     * @type {string}
     */
    this.faction = faction(data.faction, locale);

    /**
     * The factions that the players must fight in the mission
     * @type {string}
     */
    this.factionKey = faction(data.faction, 'en');

    /**
     * The mission's reward
     * @type {?Reward}
     */
    this.reward = data.missionReward ? new Reward(data.missionReward, deps) : undefined;

    /**
     * The minimum level of the enemies in the mission
     * @type {number}
     */
    this.minEnemyLevel = data.minEnemyLevel;

    /**
     * The maximum level of the enemies in the mission
     * @type {number}
     */
    this.maxEnemyLevel = data.maxEnemyLevel;

    /**
     * The number of waves that the players need to complete (undefined if not applicable)
     * @type {?number}
     */
    this.maxWaveNum = data.maxWaveNum;

    /**
     * The Mission's nightmare boolean
     * @type {boolean}
     */
    this.nightmare = data.nightmare || false;

    /**
     * The Mission's archwing requirement
     * @type {boolean}
     */
    this.archwingRequired = data.archwingRequired || false;

    /**
     * The Mission's sharkwing requirement
     * @type {boolean}
     */
    this.isSharkwing = data.isSharkwingMission || false;

    /**
     * Override for the map on this mission
     * @type {string}
     */
    this.levelOverride = languageString(data.levelOverride, locale);

    /**
     * Enemy specification for the mission
     * @type {string}
     */
    this.enemySpec = languageString(data.enemySpec, locale);

    /**
     * Array of strings denoting extra spawners for a mission
     * @type {string[]}
     */
    this.advancedSpawners = (data.advancedSpawners || []).map((spawner) => languageString(spawner, locale));

    /**
     * Items required to enter the mission
     * @type {string[]}
     */
    this.requiredItems = (data.requiredItems || []).map((reqItem) => languageString(reqItem, locale));

    /**
     * Whether or not the required items are consumed
     * @type {boolean}
     */
    this.consumeRequiredItems = data.consumeRequiredItems;

    /**
     * Target for the mission
     * @type {string}
     */
    this.target = languageString(data.vipAgent, locale);

    /**
     * Whether or not leaders are always allowed
     * @type {boolean}
     */
    this.leadersAlwaysAllowed = data.leadersAlwaysAllowed;

    /**
     * A tag for the event that this corresponds to
     * @type {string}
     */
    this.goalTag = data.goalTag;

    /**
     * Affectors for this mission
     * @type {string[]}
     */
    this.levelAuras = (data.levelAuras || []).map((aura) => languageString(aura, locale));

    /**
     * Only weapon allowed for the mission
     * @type {string}
     */
    this.exclusiveWeapon = languageString(data.exclusiveWeapon, locale);
  }

  /**
   * The Mission's string representation
   * @returns {string} Mission's string representation
   */
  toString() {
    const lines = [this.reward.toString()];

    lines.push(`${this.faction} (${this.type})`);
    lines.push(this.node);
    lines.push(`level ${this.minEnemyLevel} - ${this.maxEnemyLevel}`);

    return lines.join(mdConfig.lineEnd);
  }
}