# -*- coding: utf-8 -*-

# Copyright (C) 2003-2006 by Igor E. Novikov
# Copyright (C) 1998, 1999, 2001 by Bernhard Herzog
#
# This library is covered by GNU Library General Public License.
# For more info see COPYRIGHTS file in sK1 root directory.


import sys, string
from types import StringType, DictionaryType
import traceback

# import config
from app import _, main


INTERNAL = 'INTERNAL'
USER = 'USER'

#TEMPORAL CONSTANTS TO DO REFACTORING
WARN_METHOD = 'dialog'
PRINT_INTERNAL_WARNINGS =1
PRINT_DEBUG_MESSAGES = 1

def write_error(message):
	sys.stderr.write(message)
	if message and message[-1] != '\n':
		sys.stderr.write('\n')

def flexible_format(format, args, kw):
	try:
		if args:
			text = format % args
		elif kw:
			text = format % kw
		else:
			text = format
	except TypeError:
		if args:
			text = string.join([format] + map(str, args))
		elif kw:
			text = string.join([format] + map(str, kw.items()))
		else:
			text = format
	
	return text
	

def warn(_level, _message, *args, **kw):
	_message = flexible_format(_message, args, kw)

	if _level == INTERNAL:
		#TODO: reverse to preferences after refactoring
		if PRINT_INTERNAL_WARNINGS: 
# 		if config.preferences.print_internal_warnings:
			write_error(_message)
	else:
		app = main.application
		#TODO: reverse to preferences after refactoring
		if app and WARN_METHOD == 'dialog': #config.preferences.warn_method == 'dialog':
			app.MessageBox(title = _("Warning"), message = _message,
							icon = 'warning')
		else:
			write_error(_message)
	return _message

def warn_tb(_level, _message = '', *args, **kw):
	_message = flexible_format(_message, args, kw)

	if _level == INTERNAL:
		#TODO: reverse to preferences after refactoring
		if PRINT_INTERNAL_WARNINGS:
# 		if config.preferences.print_internal_warnings:
			write_error(_message)
			traceback.print_exc()
	else:
		app = main.application
		if app:
			tb = _("Print Traceback")
			result = app.MessageBox(title = _("Warning"), message = _message,
									icon = 'warning', buttons = (_("OK"), tb))
			if result == tb:
				from cStringIO import StringIO
				file = StringIO()
				traceback.print_exc(file = file)
				_message = file.getvalue()
				app.MessageBox(title = _("Traceback"), message = _message,
								icon = 'warning')
		else:
			write_error(_message)
			traceback.print_exc()
	return _message
		



def Dict(**kw):
	return kw

_levels = Dict(default = 1,
				__del__ = 0,
				Graphics = 1,
				properties = 0,
				DND = 1,
				context_menu = 0,
				Load = Dict(default = 1,
				PSK = 1,
				AI = 1,
				echo_messages = 1),
				PS = 1,
				bezier = 1,
				styles = 1,
				tkext = 0,
				handles = 0,
				timing = 0)

def pdebug(level, message, *args, **kw):
	#TODO: reverse to preferences after refactoring
# 	if not config.preferences.print_debug_messages:
	if not PRINT_DEBUG_MESSAGES:
		return
	if level:
		if type(level) == StringType:
			level = (level,)
		enabled = _levels
		for item in level:
			try:
				enabled = enabled[item]
			except:
				break
		if type(enabled) == DictionaryType:
			enabled = enabled['default']
		if not enabled:
			return
	message = flexible_format(message, args, kw)
	write_error(message)



