const categories = require('./categories')
const parser = require('./parser')
const utils = require('./utils')

const db = {}

db.load = function () {
  const items = parser.parseIndex()
  for (const item of items) {
    const playlist = parser.parsePlaylist(item.url)
    for (const channel of playlist.channels) {
      db.channels.add(channel)

      for (const country of channel.countries) {
        if (!db.countries.has(country)) {
          db.countries.add(country)
        }
      }

      for (const language of channel.languages) {
        if (!db.languages.has(language)) {
          db.languages.add(language)
        }
      }
    }
  }
}

db.channels = {
  list: [],
  add(channel) {
    this.list.push(channel)
  },
  all() {
    return this.list
  },
  forCountry(country) {
    if (!country.code) return this.list.filter(channel => !channel.countries.length)

    return this.list.filter(channel => channel.countries.map(c => c.code).includes(country.code))
  },
  forLanguage(language) {
    if (!language.code) return this.list.filter(channel => !channel.languages.length)

    return this.list.filter(channel => channel.languages.map(c => c.code).includes(language.code))
  },
  forCategory(category) {
    if (!category.id) return this.list.filter(channel => !channel.category)

    return this.list.filter(channel => channel.category.toLowerCase() === category.id)
  },
  count() {
    return this.list.length
  },
  sortBy(fields) {
    this.list = utils.sortBy(this.list, fields)

    return this
  }
}

db.countries = {
  list: [],
  has(country) {
    return this.list.map(c => c.code).includes(country.code)
  },
  add(country) {
    this.list.push(country)
  },
  all() {
    return this.list
  },
  count() {
    return this.list.length
  },
  sortBy(fields) {
    this.list = utils.sortBy(this.list, fields)

    return this
  }
}

db.languages = {
  list: [],
  has(language) {
    return this.list.map(c => c.code).includes(language.code)
  },
  add(language) {
    this.list.push(language)
  },
  all() {
    return this.list
  },
  count() {
    return this.list.length
  },
  sortBy(fields) {
    this.list = utils.sortBy(this.list, fields)

    return this
  }
}

db.categories = {
  list: categories,
  all() {
    return this.list
  },
  count() {
    return this.list.length
  }
}

module.exports = db