# This external method helps you to generate templates for translation,
# using Archetypes schema python files
# 
# Copyright (C) 2007 Martin Preisler <martin.preisler@czenet.com>
# 
# This program 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 2
# of the License, or (at your option) any later version.
# 
# This program 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 this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

from Products.Archetypes.public import *
from Products.CMFCore.utils import getToolByName
from StringIO import StringIO

class MessageEntry:
	def __init__( self, msgid, msgstr, default, comment = None ):
		self.msgid = msgid
		self.msgstr = msgstr
		self.default = default
		self.comment = comment
		self.references = []

	def addReference( self, reference ):
		self.references.append( reference )

class POTGenerator:
	def __init__( self, portal, product, i18n_domain ):
		self.portal = portal
		self.product = product
		self.i18n_domain = i18n_domain
		self.message_map = {}
		self.warnings = []
	
	def addMessage( self, message ):
		if self.message_map.has_key( message.msgid ):
			if self.message_map[ message.msgid ].default != message.default:
				self.warnings.append( "Two messages have the same msgid but their default msgstr doesn't match! (msgid: %(msgid)s, '%(msgstr1)s != %(msgstr2)s" % { "msgid" : message.msgid, "msgstr1" : self.message_map[ message.msgid ].default, "msgstr2" : message.default } )
			
			for reference in message.references:
				self.message_map[ message.msgid ].addReference( reference )
		else:
			self.message_map[ message.msgid ] = message
	
	def extract( self ):
		archetype_tool = getToolByName( self.portal, "archetype_tool" )
	
		for type in archetype_tool.listTypes( package = self.product ):
			self.extractFromContentType( type )

	def extractFromContentType( self, content_type ):
		for field in content_type.schema.fields():
			widget = field.widget
			domain = getattr( widget, "i18n_domain", None )
			
			if domain:
				if domain == self.i18n_domain:
					label = getattr( widget, "label", None )
					label_msgid = getattr( widget, "label_msgid", None )
					description = getattr( widget, "description", None )
					description_msgid = getattr( widget, "description_msgid", None )
					
					if label:
						if label_msgid:
							entry = MessageEntry( label_msgid, "", label )
							entry.addReference( "Content Type: %(type)s, Field: %(field)s" % { "type" : content_type.portal_type, "field" : field.getName() } )
							self.addMessage( entry )
						else:
							self.warnings.append( "Widget inside field \"%(field)s\" of content type \"%(type)s\" does have label but not label_msgid specified" % { "field" : field.getName(), "type" : content_type.portal_type } )
						
					if description:
						if description_msgid:
							entry = MessageEntry( description_msgid, "", description )
							entry.addReference( "Content Type: %(type)s, Field: %(field)s" % { "type" : content_type.portal_type, "field" : field.getName() } )
							self.addMessage( entry )
						else:
							self.warnings.append( "Widget inside field \"%(field)s\" of content type \"%(type)s\" does have description but not description_msgid specified" % { "field" : field.getName(), "type" : content_type.portal_type } )
			else:
				self.warnings.append( "Widget inside field \"%(field)s\" of content type \"%(type)s\" doesn't have i18n_domain specified" % { "field" : field.getName(), "type" : content_type.portal_type } )
	
	def generate( self ):
		io = StringIO()
		
		for key in self.message_map.keys():
			message = self.message_map[ key ]
			
			print >>io, "#. Default: \"%s\"" % message.default
			for reference in message.references:
				print >>io, "#: %s" % reference
			if message.comment:
				print >>io, "# %s" % message.comment
			
			print >>io, "msgid \"%s\"" % message.msgid
			print >>io, "msgstr \"%s\"" % message.msgstr
			print >>io

		print >>io, "Warnings:"
		print >>io, "****************************************************************"
		
		for warning in self.warnings:
			print >>io, warning

		if len( self.warnings ) == 0:
			print >>io, "No warnings, congratulations!"

		return io.getvalue()

	def process( self ):
		self.extract()
		return self.generate()

def generatePOT( self ):
	# 2nd parameter - product name
	# 3rd parameter - i18n_domain
	generator = POTGenerator( self, "ProductName", "i18n_domain" )
	return generator.process()
