Source: models/SteelPathOffering.js

import { timeDeltaToString, steelPath } from 'warframe-worldstate-data/utilities';

const monday = 1;

/**
 * Gets the first day of the week
 * @returns {Date} first day of the week
 */
function getFirstDayOfWeek() {
  const resultDate = new Date();
  /* istanbul ignore next */
  const offset = resultDate.getUTCDay() === 0 ? 6 : resultDate.getUTCDay() - monday;
  resultDate.setUTCDate(resultDate.getUTCDate() - offset);
  resultDate.setUTCHours(0);
  resultDate.setUTCMinutes(0);
  resultDate.setUTCSeconds(0);
  resultDate.setUTCMilliseconds(0);
  return resultDate;
}

/**
 * Get the last day of the week
 * @returns {Date} last day of the week
 */
function getLastDayOfWeek() {
  const last = new Date(getFirstDayOfWeek());
  last.setUTCDate(last.getUTCDate() + 6);
  last.setUTCHours(23);
  last.setUTCMinutes(59);
  last.setUTCSeconds(59);
  last.setUTCMilliseconds(0);
  return last;
}

/**
 * When was the start of the day
 * @returns {Date} start of the day
 */
function getStartOfDay() {
  const today = new Date();
  today.setUTCHours(0);
  today.setUTCMinutes(0);
  today.setUTCSeconds(0);
  today.setUTCMilliseconds(0);
  return today;
}

/**
 * When was the end of the day
 * @returns {Date} end of the day
 */
function getEndOfDay() {
  const last = new Date();
  last.setUTCHours(23);
  last.setUTCMinutes(59);
  last.setUTCSeconds(59);
  last.setUTCMilliseconds(0);
  return last;
}

/**
 * Start of Steel Path cycle calculations
 * @type {Date}
 */
const start = new Date('2020-11-16T00:00:00.000Z');

export default class SteelPathOffering {
  constructor({ locale }) {
    const sSinceStart = (Date.now() - start.getTime()) / 1000;
    const eightWeeks = 4838400;
    const sevenDays = 604800;

    const ind = Math.floor((sSinceStart % eightWeeks) / sevenDays);

    this.currentReward = steelPath(locale).rotation[ind];

    this.activation = getFirstDayOfWeek();

    this.expiry = getLastDayOfWeek();

    this.remaining = timeDeltaToString(this.expiry.getTime() - Date.now());

    this.rotation = steelPath(locale).rotation;
    this.evergreens = steelPath(locale).evergreen;

    /**
     * General data pertaining to incursions
     * @type {object}
     * @property {string} id Identifier for steel path incursion based on start of day.
     * @property {Date} activation when the current incursions became active
     * @property {Date} expiry when the current incursions become inactive
     */
    this.incursions = {
      id: `spi:${getStartOfDay().getTime()}`,
      activation: getStartOfDay(),
      expiry: getEndOfDay(),
    };
  }
}