import { getStore, setEnvironmentContext } from '@netlify/blobs'
import { DateTime } from 'luxon'
import fs from 'fs'

const getKeys = (months = 1) => {
  const currentDate = DateTime.now()
  const weeks = Math.floor((currentDate.daysInMonth * months) / 7)
  let count = 0
  const keys = [`${currentDate.year}-${currentDate.weekNumber}`]

  while (count < weeks) {
    const weeks = 1 * (count + 1)
    const date = DateTime.now().minus({ weeks })
    keys.push(`${date.year}-${date.weekNumber}`)
    count++;
  }

  return keys
}

const filterOldScrobbles = (scrobbles, months = 1) => {
  const currentDate = DateTime.now()
  const weeks = Math.floor((currentDate.daysInMonth * months) / 7)
  const windowEnd = DateTime.now().minus({ weeks });
  return scrobbles.filter(scrobble => {
    const timestamp = DateTime.fromISO(scrobble.timestamp);
    return timestamp >= windowEnd;
  });
}

export const onPreBuild = async ({ constants }) => {
  setEnvironmentContext({
    siteID: constants.SITE_ID,
    token: constants.NETLIFY_API_TOKEN,
  })

  const currentDate = DateTime.now()
  const lastWeek = currentDate.minus({ weeks: 1 })
  const monthKeys = getKeys()
  const monthChartData = { data: [] }
  const threeMonthKeys = getKeys(3)
  const threeMonthChartData = { data: [] }
  const yearKeys = getKeys(12)
  const yearChartData = { data: [] }
  const scrobbles = getStore('scrobbles')
  const artists = getStore('artists')
  const albums = getStore('albums')
  const weeklyChartData = await scrobbles.get(`${lastWeek.year}-${lastWeek.weekNumber}`, { type: 'json'})
  const windowData = await scrobbles.get('window', { type: 'json'})
  const artistsMap = await artists.get('artists-map', { type: 'json' })
  const albumsMap = await albums.get('albums-map', { type: 'json' })
  const nowPlaying = await scrobbles.get('now-playing', { type: 'json'})

  for (const key of monthKeys) {
    let scrobbleData
    try {
      scrobbleData = await scrobbles.get(key, { type: 'json'})
    } catch (err) {
      console.log('Error fetching scrobble data using monthKeys')
      break
    }
    if (scrobbleData) monthChartData?.['data']?.push(...scrobbleData?.['data'])
  }

  for (const key of threeMonthKeys) {
    let scrobbleData
    try {
      scrobbleData = await scrobbles.get(key, { type: 'json'})
    } catch (err) {
      console.log('Error fetching scrobble data using threeMonthKeys')
      break
    } 
    if (scrobbleData) threeMonthChartData?.['data']?.push(...scrobbleData?.['data'])
  }

  for (const key of yearKeys) {
    let scrobbleData
    try {
      scrobbleData = await scrobbles?.get(key, { type: 'json'})
    } catch (err) {
      console.log('Error fetching scrobble data using yearKeys')
      break
    }
    if (scrobbleData) yearChartData?.['data']?.push(...scrobbleData?.['data'])
  }

  fs.writeFileSync('./src/_data/json/weekly-top-artists-chart.json', JSON.stringify({...weeklyChartData, timestamp: `${lastWeek.set({ hour: 8, minute: 0, second: 0, millisecond: 0 }).toMillis()}` }))
  fs.writeFileSync('./src/_data/json/scrobbles-window.json', JSON.stringify(windowData))
  fs.writeFileSync('./src/_data/json/artists-map.json', JSON.stringify(artistsMap))
  fs.writeFileSync('./src/_data/json/albums-map.json', JSON.stringify(albumsMap))
  fs.writeFileSync('./src/_data/json/now-playing.json', JSON.stringify(nowPlaying))
  fs.writeFileSync('./src/_data/json/scrobbles-month-chart.json', JSON.stringify({ data: filterOldScrobbles(monthChartData.data) }))
  fs.writeFileSync('./src/_data/json/scrobbles-three-month-chart.json', JSON.stringify({ data: filterOldScrobbles(threeMonthChartData.data, 3) }))
  fs.writeFileSync('./src/_data/json/scrobbles-year-chart.json', JSON.stringify({ data: filterOldScrobbles(yearChartData.data, 12) }))
}