#! /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/>.

class View:
	def __init__(self, Event):
		self.widget = QtWebKitWidgets.QWebView()

		self.onFinished = Event() # parameter: ok (bool)
		self.urlChanged = Event() # parameter: url (string)
		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):
		self.widget.settings().setAttribute(QtWebKit.QWebSettings.PluginsEnabled, True)

	def request(self, url, headers=None):
		request = QtNetwork.QNetworkRequest(QtCore.QUrl(url))
		for header, value in (headers or {}).items():
			request.setRawHeader(header, value)
		self.widget.load(request)

	def setHtml(self, html):
		self.widget.setHtml(html)

	def print_(self, printer, cb):
		self.widget.print_(printer)
		cb()

class QtWebKitWebEngineModule:
	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):
		""""Returns a View object, which has the following fields:
		- widget: a Qt widget that displays a web page.
		- onFinished: an Event; handlers get a single boolean value as argument
		  that tells you if a previous request succeeded.
		- request(url, headers); headers is optional, but if supplied should be
		  a dict. Use this to set a User Agent, also.
		- setHtml(html); for if you don't want to specify a web address
		- enablePlugins(); does what it says

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

	def enable(self):
		global QtWebKit, QtWebKitWidgets, QtCore, QtNetwork
		try:
			from PyQt5 import QtWebKit, QtWebKitWidgets, QtCore, QtNetwork
		except ImportError:
			# 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 QtWebKitWebEngineModule(moduleManager)
