const emojiMap = (genre, artist) => {
  const DEFAULT = '🎧'
  if (artist === 'Autopsy') return '🧟'
  if (artist === 'Black Flag') return '🏴'
  if (artist === 'Bruce Springsteen') return 'πŸ‡ΊπŸ‡Έ'
  if (artist === 'Carcass') return 'πŸ₯Ό'
  if (artist === 'Counting Crows') return 'πŸ¦β€β¬›'
  if (artist === 'David Bowie') return 'πŸ‘¨πŸ»β€πŸŽ€'
  if (artist === 'Full of Hell & Nothing') return '🫨🎸'
  if (artist === 'Imperial Triumphant') return '🎭'
  if (artist === 'Mastodon') return 'πŸ‹'
  if (artist === 'Minor Threat') return 'πŸ‘¨πŸ»β€πŸ¦²'
  if (artist === 'Taylor Swift') return 'πŸ‘ΈπŸΌ'

  // early return for bad input
  if (!genre) return DEFAULT

  if (genre.includes('death metal')) return 'πŸ’€'
  if (genre.includes('black metal') || genre.includes('blackgaze')) return 'πŸͺ¦'
  if (genre.includes('metal')) return '🀘'
  if (genre.includes('emo') || genre.includes('blues')) return '😒'
  if (genre.includes('grind') || genre.includes('powerviolence')) return '🫨'
  if (
    genre.includes('country') ||
    genre.includes('americana') ||
    genre.includes('bluegrass') ||
    genre.includes('folk') ||
    genre.includes('songwriter')
  )
    return 'πŸͺ•'
  if (genre.includes('post-punk')) return 'πŸ˜”'
  if (genre.includes('dance-punk')) return 'πŸͺ©'
  if (genre.includes('punk') || genre.includes('hardcore')) return '✊'
  if (genre.includes('hip hop')) return '🎀'
  if (genre.includes('progressive') || genre.includes('experimental')) return 'πŸ€“'
  if (genre.includes('jazz')) return '🎺'
  if (genre.includes('psychedelic')) return 'πŸ’Š'
  if (genre.includes('dance') || genre.includes('electronic')) return 'πŸ’»'
  if (
    genre.includes('alternative') ||
    genre.includes('rock') ||
    genre.includes('shoegaze') ||
    genre.includes('screamo')
  )
    return '🎸'
  return DEFAULT
}

export default async () => {
  // eslint-disable-next-line no-undef
  const TV_KEY = Netlify.env.get('API_KEY_TRAKT')
  // eslint-disable-next-line no-undef
  const MUSIC_KEY = Netlify.env.get('API_KEY_LASTFM')
  const headers = {
    headers: {
      'Content-Type': 'application/json',
      'Cache-Control': 'public, max-age=0, must-revalidate',
      'Netlify-CDN-Cache-Control': 'public, max-age=0, stale-while-revalidate=210',
    },
  }

  const traktRes = await fetch('https://api.trakt.tv/users/cdransf/watching', {
    headers: {
      'Content-Type': 'application/json',
      'trakt-api-version': 2,
      'trakt-api-key': TV_KEY,
    },
  })
    .then((data) => {
      if (data.body) return data.json()
      return {}
    })
    .catch()

  if (Object.keys(traktRes).length) {
    if (traktRes['type'] === 'episode') {
      return Response.json(
        {
          content: `πŸ“Ί <a href="https://trakt.tv/shows/${traktRes['show']['ids']['slug']}">${traktRes['show']['title']}</a> β€’ <a href="https://trakt.tv/shows/${traktRes['show']['ids']['slug']}/seasons/${traktRes['episode']['season']}/episodes/${traktRes['episode']['number']}">${traktRes['episode']['title']}</a>`,
        },
        headers
      )
    }

    if (traktRes['type'] === 'movie') {
      return Response.json(
        {
          content: `πŸŽ₯ <a href="https://trakt.tv/movies/${traktRes['movie']['ids']['slug']}">${traktRes['movie']['title']}</a>`,
        },
        headers
      )
    }
  }

  const nbaRes = await fetch(
    'https://cdn.nba.com/static/json/liveData/scoreboard/todaysScoreboard_00.json'
  )
    .then((data) => data.json())
    .catch()
  const games = nbaRes?.scoreboard?.games

  if (games && games.length) {
    const isAmPm = (hours) => (hours >= 12 ? 'pm' : 'am')
    const game = games.find((game) => game.gameCode.includes('LAL'))
    if (game) {
      const startDate = new Date(game.gameTimeUTC)
      const startTime = startDate.toLocaleString('en-US', {
        timeZone: 'America/Los_Angeles',
      })
      const endDate = startDate.setHours(startDate.getHours() + 3)
      const endTime = new Date(endDate).toLocaleString('en-US', {
        timeZone: 'America/Los_Angeles',
      })
      const nowDate = new Date()
      const now = nowDate.toLocaleString('en-US', {
        timeZone: 'America/Los_Angeles',
      })
      const isCorrectDate =
        now.split(',')[0] === startTime.split(',')[0] &&
        now.split(',')[0] === endTime.split(',')[0] &&
        isAmPm(startDate.getHours()) === isAmPm(nowDate.getHours())
      const nowHour = parseInt(now.split(',')[1].split(':')[0].trim())
      const startHour = parseInt(startTime.split(',')[1].split(':')[0].trim())
      const endHour = parseInt(endTime.split(',')[1].split(':')[0].trim())
      const nowMinutes = parseInt(now.split(',')[1].split(':')[1].trim())
      const startMinutes = parseInt(startTime.split(',')[1].split(':')[1].trim())
      const endMinutes = parseInt(endTime.split(',')[1].split(':')[1].trim())
      const res = {
        content: `πŸ€ ${game['awayTeam']['teamName']} (${game['awayTeam']['wins']}-${game['awayTeam']['losses']}) @ ${game['homeTeam']['teamName']} (${game['homeTeam']['wins']}-${game['homeTeam']['losses']})`,
      }

      if (isCorrectDate) {
        if (nowHour === startHour && nowMinutes >= startMinutes && nowHour < endHour)
          return Response.json(res, headers)
        if (nowHour > startHour && nowHour < endHour) return Response.json(res)
        if (nowHour > startHour && nowMinutes <= endMinutes && nowHour == endHour)
          return Response.json(res, headers)
      }
    }
  }

  const trackRes = await fetch(
    `https://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=coryd_&api_key=${MUSIC_KEY}&limit=1&format=json`,
    {
      type: 'json',
    }
  ).catch()
  const trackData = await trackRes.json()
  const mbidRes = await fetch('https://coryd.dev/api/mbids', {
    type: 'json',
  }).catch()
  const mbidData = await mbidRes.json()
  const track = trackData['recenttracks']['track'][0]
  const artist = track['artist']['#text']
  let mbid = track['artist']['mbid']
  let genre = ''

  const mbidMap = (artist) => {
    return mbidData[artist.toLowerCase()] || ''
  }

  // mbid mismatches
  if (mbidMap(artist) !== '') mbid = mbidMap(artist)

  const artistUrl = mbid
    ? `https://musicbrainz.org/artist/${mbid}`
    : `https://musicbrainz.org/search?query=${track['artist']['#text'].replace(
        /\s+/g,
        '+'
      )}&type=artist`
  const trackUrl = track['mbid'] ? `https://musicbrainz.org/track/${track['mbid']}` : track['url']

  if (mbid && mbid !== '') {
    const genreUrl = `https://musicbrainz.org/ws/2/artist/${mbid}?inc=aliases+genres&fmt=json`
    const genreRes = await fetch(genreUrl, {
      type: 'json',
    }).catch()
    const genreData = await genreRes.json()
    genre = genreData.genres.sort((a, b) => b.count - a.count)[0]?.['name'] || ''
  }

  return Response.json(
    {
      content: `${emojiMap(genre, track['artist']['#text'])} <a href="${trackUrl}">${
        track['name']
      }</a> by <a href="${artistUrl}">${track['artist']['#text']}</a>`,
    },
    headers
  )
}

export const config = { path: '/api/now-playing' }