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

#	Copyright 2012, 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 os
import glob
import subprocess

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

		self.type = "translation-updater"

		self.priorities = {
			"update-translations": 0,
			"default": -1,
		}
		self.requires = (
			self._mm.mods(type="metadata"),
			self._mm.mods(type="execute"),
		)

	def _run(self):
		#save the cwd for later use
		startdir = os.getcwd()

		for m in self._mm.mods:
			#generate some handy vars
			path = os.path.dirname(m.__class__.__file__)
			tpath = os.path.join(path, "translations")

			#check if all the requirements for automatic translation
			#updates are there, and read the values of these
			#requirements (filename & var value). Otherwise continue.
			hasTranslations = os.path.isdir(tpath)
			if not hasTranslations:
				continue
			try:
				potpath = glob.glob(os.path.join(tpath, "*.pot")).pop()
			except IndexError:
				continue
			try:
				files = m.filesWithTranslations
			except AttributeError:
				print("WARNING: %s doesn't specify files to translate. Passing over." % path)
				continue
			#adjust potpath to be relative to 'path'
			potname = os.path.basename(potpath)
			newpotpath = os.path.join("translations", potname)
			#change cwd to path
			os.chdir(path)
			#generate the xgettext comment, that extracts strings from
			#source code.
			cmd = "xgettext --keyword=tr --force-po --add-comments=TRANSLATORS --from-code=UTF-8 --language=Python --package-name=%s --package-version=%s --msgid-bugs-address=%s --output=%s %s" % (
				self._metadata["name"],
				self._metadata["version"],
				self._metadata["email"],
				newpotpath,
				" ".join(files)
			)
			subprocess.check_call(cmd.split(" "))

			nulldevice = open(os.devnull, "wb")
			for pofile in glob.glob(os.path.join("translations", "*.po")):
				#Update all .po files
				cmd = "msgmerge --update %s %s" % (pofile, newpotpath)
				subprocess.check_call(cmd.split(" "), stderr=nulldevice)
				mofile = os.path.splitext(pofile)[0] + ".mo"
				#Update all .mo files
				cmd = "msgfmt --output %s %s" % (mofile, pofile)
				subprocess.check_call(cmd.split(" "))
			#reset for the next round/last time, since the module
			#manager and this module depend on the startdir as
			#reference location.
			os.chdir(startdir)

			print("Updated translations of: %s" % path)

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

		self._execute = self._modules.default(type="execute")
		self._execute.startRunning.handle(self._run)

		self.active = True

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

def init(moduleManager):
	return TranslationUpdaterModule(moduleManager)
