/*
 * Create dummy data files for each fluid.
 * Hourly data is not generated
 */
const fs = require('fs')
const { DateTime } = require('luxon')
const config = require('./config')

function getRandomNumber(min, max) {
  // Generate a random float between min and max
  let randomFloat = Math.random() * (max - min) + min
  // Round to two decimal places
  randomFloat = Math.round(randomFloat * 100) / 100
  return randomFloat
}

const generateHalfAnHourData = (startingDate, endingDate, min, max) => {
  let parsingDate = DateTime.local(
    startingDate.year,
    startingDate.month,
    startingDate.day,
    0,
    0
  )
  const halfAnHourDumpArray = []
  while (parsingDate <= endingDate) {
    const load = getRandomNumber(min, max)
    halfAnHourDumpArray.push({
      load: load,
      year: parsingDate.year,
      month: parsingDate.month,
      day: parsingDate.day,
      hour: parsingDate.hour,
      minute: parsingDate.minute,
    })
    parsingDate = parsingDate.plus({ minute: 30 })
  }
  return halfAnHourDumpArray
}

const generateData = (startingDate, endingDate, min, max) => {
  let parsingDate = DateTime.local(
    startingDate.year,
    startingDate.month,
    startingDate.day
  )
  const dayDumpArray = []
  while (parsingDate <= endingDate) {
    const load = getRandomNumber(min, max)
    dayDumpArray.push({
      load: load,
      year: parsingDate.year,
      month: parsingDate.month,
      day: parsingDate.day,
      hour: 0,
      minute: 0,
    })
    parsingDate = parsingDate.plus({ days: 1 })
  }
  return dayDumpArray
}

// Function to aggregate load data for a specific period
function aggregateLoadData(data, period) {
  const aggregatedData = {}
  data.forEach(entry => {
    let key
    const entryCopy = { ...entry }
    switch (period) {
      case 'day':
        key = `${entryCopy.year}-${entryCopy.month}-${entryCopy.day}`
        entryCopy.hour = 0
        entryCopy.minute = 0
        break
      case 'month':
        key = `${entryCopy.year}-${entryCopy.month}`
        entryCopy.day = 0
        entryCopy.minute = 0
        break
      case 'year':
        key = `${entryCopy.year}`
        entryCopy.month = 0
        entryCopy.day = 0
        entryCopy.minute = 0
        break
      default:
        break
    }
    if (!aggregatedData[key]) {
      aggregatedData[key] = {
        load: entryCopy.load,
        year: entryCopy.year,
        month: entryCopy.month,
        day: entryCopy.day,
        hour: entryCopy.hour,
        minute: entryCopy.minute,
      }
    } else {
      aggregatedData[key].load += entryCopy.load
    }
  })
  return Object.values(aggregatedData)
}

// Create data folder
const dir = './data'
if (!fs.existsSync(dir)) {
  console.log('Create data folder...')
  fs.mkdirSync(dir)
}

const startingDate = config.startingDate
const endingDate = config.endingDate
const halfHourStartingDate = config.halfHourStartingDate

const elecHalfHourData = generateHalfAnHourData(
  halfHourStartingDate,
  endingDate.endOf('day'),
  0.12,
  0.36
)
// Aggregate all half-hour data available and generate more daily data between startingDate and halfHourStartingDate
const elecAggregatedDayData = aggregateLoadData(elecHalfHourData, 'day')
const elecGeneratedDayData = generateData(
  startingDate,
  halfHourStartingDate.minus({ days: 1 }),
  4,
  8
)
const elecDayData = [...elecAggregatedDayData, ...elecGeneratedDayData]
const elecMonthData = aggregateLoadData(elecDayData, 'month')
const elecYearData = aggregateLoadData(elecMonthData, 'year')

const gasDayData = generateData(startingDate, endingDate, 16, 68)
const gasMonthData = aggregateLoadData(gasDayData, 'month')
const gasYearData = aggregateLoadData(gasMonthData, 'year')

const waterDayData = generateData(startingDate, endingDate, 200, 300)
const waterMonthData = aggregateLoadData(waterDayData, 'month')
const waterYearData = aggregateLoadData(waterMonthData, 'year')

const dump = {
  'com.grandlyon.enedis.minute': elecHalfHourData,
  'com.grandlyon.enedis.day': elecDayData,
  'com.grandlyon.enedis.month': elecMonthData,
  'com.grandlyon.enedis.year': elecYearData,

  'com.grandlyon.grdf.day': gasDayData,
  'com.grandlyon.grdf.month': gasMonthData,
  'com.grandlyon.grdf.year': gasYearData,

  'com.grandlyon.egl.day': waterDayData,
  'com.grandlyon.egl.month': waterMonthData,
  'com.grandlyon.egl.year': waterYearData,
}

const dumpString = JSON.stringify(dump)

fs.writeFile('data/loads.json', dumpString, function (err) {
  if (err) console.log('error', err)
})