const dayjs = require('dayjs')
const timezone = require('dayjs/plugin/timezone')
const utc = require('dayjs/plugin/utc')

dayjs.extend(timezone)
dayjs.extend(utc)

module.exports = {
  site: 'firstmedia.com',
  days: 2,
  url({ channel, date }) {
    return `https://api.firstmedia.com/api/content/tv-guide/list?date=${date.format(
      'DD/MM/YYYY'
    )}&channel=${channel.site_id}&startTime=1&endTime=24`
  },
  parser({ content, channel, date }) {
    if (!content || !channel || !date) return []

    const programs = []
    const items = parseItems(content, channel.site_id)
      .map(item => {
        item.start = toDelta(item.date, item.startTime)
        item.stop = toDelta(item.date, item.endTime)
        return item
      })
      .sort((a, b) => a.start - b.start)

    const dt = date.tz('Asia/Jakarta').startOf('d')
    let lastStop
    items.forEach(item => {
      if (lastStop === undefined || item.start >= lastStop) {
        lastStop = item.stop
        programs.push({
          title: parseTitle(item),
          description: parseDescription(item),
          start: asDate(parseStart({ item, date: dt })),
          stop: asDate(parseStop({ item, date: dt }))
        })
      }
    })

    return programs
  },
  async channels() {
    const axios = require('axios')
    const result = await axios
      .get(
        `https://api.firstmedia.com/api/content/tv-guide/list?date=${dayjs().format(
          'DD/MM/YYYY'
        )}&channel=&startTime=0&endTime=24`
      )
      .then(response => response.data)
      .catch(console.error)

    const channels = []
    if (result.data && result.data.entries) {
      Object.values(result.data.entries).forEach(schedules => {
        if (schedules.length) {
          channels.push({
            lang: 'en',
            site_id: schedules[0].channel.no,
            name: schedules[0].channel.name
          })
        }
      })
    }

    return channels
  }
}

function parseItems(content, channel) {
  return JSON.parse(content.trim()).data.entries[channel] || []
}

function parseTitle(item) {
  return item.title
}

function parseDescription(item) {
  return item.long_description
}

function parseStart({ item, date }) {
  return date.add(item.start, 'ms')
}

function parseStop({ item, date }) {
  return date.add(item.stop, 'ms')
}

function toDelta(from, to) {
  return toDate(to).diff(toDate(from), 'milliseconds')
}

function toDate(date) {
  return dayjs(date, 'YYYY-MM-DD HH:mm:ss')
}

function asDate(date) {
  return date.toISOString()
}
