/* eslint-disable @typescript-eslint/interface-name-prefix */
import { DateTime } from 'luxon'

import { FluidType } from 'enum/fluid.enum'
//import _ from 'lodash'

export interface IDataload {
  date: DateTime
  value: number
  valueDetail?: number[] | null
}

export interface IPerformanceIndicator {
  value: number | null
  compareValue: number | null
  percentageVariation: number | null
}

class Dataload implements IDataload {
  date: DateTime
  value: number
  valueDetail?: number[]

  constructor(date: DateTime, value: number, valueDetail?: number[]) {
    this.date = date
    this.value = value
    this.valueDetail = valueDetail
  }
}

export interface IChartData {
  actualData: IDataload[]
  comparisonData: IDataload[] | null
}

export class ChartData implements IChartData {
  actualData: IDataload[]
  comparisonData: IDataload[] | null

  constructor(actualData: IDataload[], comparisonData?: IDataload[]) {
    this.actualData = actualData
    if (comparisonData) this.comparisonData = comparisonData
    else this.comparisonData = null
  }
}

export interface ITimePeriod {
  startDate: DateTime
  endDate: DateTime
}

export class TimePeriod implements ITimePeriod {
  startDate: DateTime
  endDate: DateTime

  constructor(startDate: DateTime, endDate: DateTime) {
    this.startDate = startDate
    this.endDate = endDate
  }
}

export enum TimeStep {
  HALF_AN_HOUR = 10,
  HOUR = 15,
  DAY = 20,
  WEEK = 30,
  MONTH = 40,
  YEAR = 50,
}

export interface IConsumptionDataManager {
  getGraphData(
    timePeriod: ITimePeriod,
    timeStep: TimeStep,
    fluidTypes: FluidType[],
    compareTimePeriod?: ITimePeriod
  ): Promise<IChartData | null>

  fetchLastDateData(fluidType: FluidType[]): Promise<DateTime | null>

  getPerformanceIndicators(
    timePeriod: ITimePeriod,
    timeStep: TimeStep,
    fluidTypes: FluidType[],
    compareTimePeriod?: ITimePeriod
  ): Promise<IPerformanceIndicator[]>
}