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

#	Copyright 2011-2013, Marten de Vries
#	Copyright 2011, Milan Boers
#
#	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 Saver:
	def __init__(self, module, dataType, lesson, path, *args, **kwargs):
		super().__init__(*args, **kwargs)

		self.module = module
		self.dataType = dataType
		self.lesson = lesson
		self.path = path

	def save(self):
		self.module.save(self.dataType, self.lesson, self.path)

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

		self.type = "saver"
		self.uses = (
			self._mm.mods(type="save"),
		)
		self.requires = (
			self._mm.mods(type="lessonTracker"),
		)

	@property
	def usableExtensions(self):
		dataType = self._lessonTracker.currentLesson.dataType

		#Collect exts the loader modules support, if there is a gui
		#module for the data type(s) they can provide
		result = []
		for module in self._modules.sort("active", type="save"):
			formats = module.saves.get(dataType, {}).items()
			for ext, name in sorted(formats, key=lambda extAndName: extAndName[1]):
				result.append((ext, name))
		return result

	@property
	def saveSupport(self):
		return self._lessonTracker.currentLesson is not None and self.usableExtensions

	def save(self, path):
		dataType = self._lessonTracker.currentLesson.dataType
		savers = [
			Saver(module, dataType, self._lessonTracker.currentLesson, path)
			for module in self._modules.sort("active", type="save")
			for ext in module.saves.get(dataType, [])
			if path.endswith(ext)
		]

		if not savers:
			raise NotImplementedError()

		saver = savers[0]
		#Save
		saver.save()

	def enable(self):
		self._modules = set(self._mm.mods(type="modules")).pop()
		self._lessonTracker = self._modules.default("active", type="lessonTracker")

		self.active = True

	def disable(self):
		self.active = False

		del self._modules
		del self._lessonTracker

def init(moduleManager):
	return SaverModule(moduleManager)
