# -*- coding: utf-8 -*-

from urllib.parse import quote_plus

from libmediathek4 import lm4


class libzdf(lm4):
	def __init__(self):
		lm4.__init__(self)

		self.defaultMode = 'libZdfListMain'

		self.modes.update({
			'libZdfListMain': self.libZdfListMain,
			'libZdfListShows': self.libZdfListShows,
			'libZdfListVideos': self.libZdfListVideos,
			'libZdfListChannel': self.libZdfListChannel,
			'libZdfListChannelDateVideos': self.libZdfListChannelDateVideos,
			'libZdfListPage': self.libZdfListPage,

			# Bastelpingu 5.0.4
			'libZdfListTrending': self.libZdfListTrending,
			'libZdfListFuturaDocument': self.libZdfListFuturaDocument,
		})

		self.searchModes = {
			'libZdfListSearch': self.libZdfListSearch,
		}

		self.playbackModes = {
			'libZdfPlay': self.libZdfPlay,
			'libZdfPlayById': self.libZdfPlayById,
		}

		if self.apiVersion == 1:
			import libzdfjsonparser as jsonParser
			self.parser = jsonParser.parser()
		elif self.apiVersion == 2:
			import libzdfjsonparser2 as jsonParser
			self.parser = jsonParser.parser2()

		self.parser.baseApi = self.baseApi
		self.parser.userAgent = self.userAgent
		self.parser.tokenUrl = self.tokenUrl
		self.parser.API_CLIENT_ID = self.API_CLIENT_ID
		self.parser.API_CLIENT_KEY = self.API_CLIENT_KEY


	def libZdfListMain(self):
		l = []

		# Seit 2026 kommt "Meistgesehen/Derzeit beliebt"
		# über die aktuelle ZDF-GraphQL-API.
		l.append({
			'metadata': {
				'name': self.translation(32031)
			},
			'params': {
				'mode': 'libZdfListTrending'
			},
			'type': 'dir'
		})

		l.append({
			'metadata': {
				'name': self.translation(32132)
			},
			'params': {
				'mode': 'libZdfListShows'
			},
			'type': 'dir'
		})

		l.append({
			'metadata': {
				'name': self.translation(32133)
			},
			'params': {
				'mode': 'libZdfListChannel'
			},
			'type': 'dir'
		})

		l.append({
			'metadata': {
				'name': self.translation(32134)
			},
			'params': {
				'mode': 'libZdfListPage',
				'url': (
					f'{self.baseApi}'
					'/search/documents'
					'?q=%2A'
					'&contentTypes=category'
				)
			},
			'type': 'dir'
		})

		l.append({
			'metadata': {
				'name': self.translation(32139)
			},
			'params': {
				'mode': 'libMediathekSearch',
				'searchMode': 'libZdfListSearch'
			},
			'type': 'dir'
		})

		return {
			'items': l,
			'name': 'root'
		}


	def libZdfListTrending(self):
		return self.parser.getTrending()


	def libZdfListFuturaDocument(self):
		return self.parser.getFuturaDocument(
			self.params['id']
		)


	def libZdfListShows(self):
		return self.parser.getAZ()


	def libZdfListPage(self):
		return self.parser.parsePage(
			self.params['url']
		)


	def libZdfListVideos(self):
		return self.parser.getVideos(
			self.params['url']
		)


	def libZdfPlay(self):
		return self.parser.getVideoUrl(
			self.params['url']
		)


	def libZdfPlayById(self):
		return self.parser.getVideoUrlById(
			self.params['id']
		)


	def libZdfListChannel(self):
		l = []

		for channel in self.channels:
			l.append({
				'metadata': {
					'name': channel
				},
				'params': {
					'mode': 'libMediathekListDate',
					'subParams': (
						'{"mode":"libZdfListChannelDateVideos",'
						f'"channel":"{channel}"'
						'}'
					)
				},
				'type': 'dir'
			})

		return {
			'items': l,
			'name': 'libZdfListChannel'
		}


	def libZdfListChannelDateVideos(self):
		self.params['url'] = (
			f"{self.baseApi}/cmdm/epg/broadcasts"
			f"?from={self.params['yyyymmdd']}T00%3A00%3A00%2B02%3A00"
			f"&to={self.params['yyyymmdd']}T23%3A59%3A59%2B02%3A00"
			"&limit=500"
			"&profile=teaser"
			f"&tvServices={self.params['channel']}"
		)

		return self.libZdfListPage()


	def libZdfListSearch(self, searchString):
		self.params['url'] = (
			f'{self.baseApi}/search/documents'
			f'?q={quote_plus(searchString)}'
		)

		return self.libZdfListPage()
