#! /usr/bin/env python
# -*- coding: utf-8 -*-

#	Copyright 2017, Marten de Vries
#
#	This file is part of OpenTeacher.
#
#	OpenTeacher is free software: you can redistribute it and/or modify
#	it under the terms of the GNU General Public License as published by
#	the Free Software Foundation, either version 3 of the License, or
#	(at your option) any later version.
#
#	OpenTeacher is distributed in the hope that it will be useful,
#	but WITHOUT ANY WARRANTY; without even the implied warranty of
#	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#	GNU General Public License for more details.
#
#	You should have received a copy of the GNU General Public License
#	along with OpenTeacher.  If not, see <http://www.gnu.org/licenses/>.

import tempfile
import os
import atexit

class View:
	def __init__(self, Event):
		self.widget = QtWebEngineWidgets.QWebEngineView()
		self.widget.page().profile().setHttpCacheType(QtWebEngineWidgets.QWebEngineProfile.MemoryHttpCache)

		self.onFinished = Event()
		self.urlChanged = Event()
		self.widget.loadFinished.connect(self.onFinished.send)
		self.widget.urlChanged.connect(lambda url: self.urlChanged.send(url.toString()))

	def forward(self):
		self.widget.forward()

	def back(self):
		self.widget.back()

	def reload(self):
		self.widget.reload()

	def enablePlugins(self):
		s = QtWebEngineWidgets.QWebEngineSettings.defaultSettings()
		s.setAttribute(QtWebEngineWidgets.QWebEngineSettings.PluginsEnabled, True)

	def request(self, url, headers=None):
		profile = self.widget.page().profile()
		for header, value in (headers or {}).items():
			# add headers as required
			{
				b'Accept-Language': profile.setHttpAcceptLanguage,
				b'User-Agent': profile.setHttpUserAgent,
			}[header](value.decode('ascii'))
		self.widget.load(QtCore.QUrl(url))

	def print_(self, printer, donePrinting):
		# TODO: The result of this is atrocious. Perhaps re-implement printing
		# so as to not need a web engine?
		self.widget.page().print(printer, lambda ok: donePrinting())

	def setHtml(self, html):
		fd, name = tempfile.mkstemp(suffix='.html')
		with open(name, 'w', encoding='UTF-8') as f:
			f.write(html)
		self.request('file://' + name)
		def remove(*args):
			self.widget.loadFinished.disconnect(remove)
			atexit.unregister(remove)
			os.remove(name)
		self.widget.loadFinished.connect(remove)
		atexit.register(remove)

class QtWebEngineWebEngineModule:
	def __init__(self, moduleManager, *args, **kwargs):
		super().__init__(*args, **kwargs)
		self._mm = moduleManager

		self.type = 'webEngine'

		self.requires = (
			self._mm.mods(type='event'),
		)

	def createView(self):
		""""See the qtwebkit web engine for documentation"""

		return View(self._modules.default('active', type='event').createEvent)

	def enable(self):
		global QtWebEngineWidgets, QtWidgets, QtGui, QtCore
		try:
			from PyQt5 import QtWebEngineWidgets, QtWidgets, QtGui, QtCore
		except ImportError as e:
			# remain inactive
			return
		self._modules = next(iter(self._mm.mods(type='modules')))
		self.active = True

	def disable(self):
		self.active = False
		del self._modules

def init(moduleManager):
	return QtWebEngineWebEngineModule(moduleManager)
