const api = require('../core/api')
const _ = require('lodash')

module.exports = async function (streams = []) {
	await api.regions.load()
	let regions = await api.regions.all()
	regions = _.keyBy(regions, 'code')

	await api.countries.load()
	let countries = await api.countries.all()
	countries = _.keyBy(countries, 'code')

	streams = _.filter(streams, s => !s.channel || s.channel.is_nsfw === false)
	let items = []
	streams.forEach(stream => {
		if (!stream.channel) return items.push(stream)

		getBroadcastCountries(stream.channel, { countries, regions }).forEach(country => {
			const item = _.cloneDeep(stream)
			item.group_title = country.name
			items.push(item)
		})
	})
	items = _.sortBy(items, i => {
		if (i.group_title === 'Undefined') return '_'
		return i.group_title
	})

	return { filepath: 'index.country.m3u', items }
}

function getBroadcastCountries(channel, { countries, regions }) {
	let codes = channel.broadcast_area.reduce((acc, item) => {
		const [type, code] = item.split('/')
		switch (type) {
			case 'c':
				acc.push(code)
				break
			case 'r':
				if (regions[code]) {
					acc = acc.concat(regions[code].countries)
				}
				break
			case 's':
				const [c] = item.split('-')
				acc.push(c)
				break
		}
		return acc
	}, [])

	codes = _.uniq(codes)

	return codes.map(code => countries[code]).filter(c => c)
}