Skip to content
Snippets Groups Projects
consumptionDataFormatterService.ts 1.71 KiB
Newer Older
Hugo NOUTS's avatar
Hugo NOUTS committed
/* eslint-disable @typescript-eslint/interface-name-prefix */
import { TimeStep, ITimePeriod, IDataload } from './dataConsumptionContracts'
import { compareDates } from 'utils/utils'
import { compareStepDate } from './dateChartService'
//import _ from 'lodash'

export default class ConsumptionDataFormatter {
  public formatGraphData(
    data: IDataload[],
    timePeriod: ITimePeriod,
    timeStep: TimeStep
  ): IDataload[] {
    data.sort((dataA, dataB) => compareDates(dataA.date, dataB.date))

    const formattedData = this.fillMissingData(data, timePeriod, timeStep)

    // complete missing data within data

    return formattedData
  }

  private fillMissingData(
    data: IDataload[],
    timePeriod: ITimePeriod,
    timeStep: TimeStep
  ): IDataload[] {
    const filledData = []
    let parsingDate = timePeriod.startDate

    while (parsingDate <= timePeriod.endDate) {
      //const filtereddata = data.filter(dt => dt.date.equals(parsingDate))
      const filtereddata = data.filter(dt =>
        compareStepDate(timeStep, dt.date, parsingDate)
      )

      const newElement = filtereddata[0]
        ? filtereddata[0]
        : {
            date: parsingDate,
            value: -1,
          }
      filledData.push({ ...newElement, valueDetail: null })
      parsingDate = parsingDate.plus(this.getTimeFromStepTime(timeStep))
    }

    return filledData
  }

  private getTimeFromStepTime(timeStep: TimeStep) {
    switch (timeStep) {
      case TimeStep.HALF_AN_HOUR:
        return { minutes: 30 }

      case TimeStep.DAY:
        return { days: 1 }

      case TimeStep.MONTH:
        return { months: 1 }

      case TimeStep.YEAR:
        return { years: 1 }

      default:
        return { minutes: 30 }
    }
  }
}