package jondo;

import anon.util.JAPMessages;
import logging.ILog;
import logging.LogHolder;
import logging.LogLevel;
import logging.LogType;

public class Logger 
{
	public static final int LOG_DETAIL_LEVEL_LOWEST = LogHolder.DETAIL_LEVEL_LOWEST;
	public static final int LOG_DETAIL_LEVEL_LOWER = LogHolder.DETAIL_LEVEL_LOWER;
	public static final int LOG_DETAIL_LEVEL_HIGH = LogHolder.DETAIL_LEVEL_HIGH;
	public static final int LOG_DETAIL_LEVEL_HIGHEST = LogHolder.DETAIL_LEVEL_HIGHEST;
	
	public final static int LOG_LEVEL_EMERG = LogLevel.EMERG;
	public final static int LOG_LEVEL_ALERT = LogLevel.ALERT;
	public final static int LOG_LEVEL_EXCEPTION = LogLevel.EXCEPTION;
	public final static int LOG_LEVEL_ERR = LogLevel.ERR;
	public final static int LOG_LEVEL_WARNING = LogLevel.WARNING;
	public final static int LOG_LEVEL_NOTICE = LogLevel.NOTICE;
	public final static int LOG_LEVEL_INFO = LogLevel.INFO;
	public final static int LOG_LEVEL_DEBUG = LogLevel.DEBUG;
	
	private ILog m_logger;
	private int m_iInitLogLevel = LogLevel.WARNING;
	private int m_iInitLogType = LogType.ALL;
	
	protected Logger()
	{
		
	}
	
	protected synchronized void setLogger(ILog a_logger)
	{
		m_logger = a_logger;
		
   		LogHolder.setLogInstance(m_logger);
   		m_logger.setLogType(m_iInitLogType);
   		m_logger.setLogLevel(m_iInitLogLevel);
	}
	
	/**
	 * Returns the number of log levels. Each log level is represented by an integer
	 * value from 0 to getLogLevelCount() - 1.
	 * @return
	 */
	public static int getLogLevelCount()
	{
		return LogLevel.getLevelCount();
	}
	
	public static String getLogLevelName(int a_level)
	{
		return LogLevel.getLevelName(a_level);
	}
	
	public static String getLogDetailName(int a_detail)
	{
		return JAPMessages.getString(LogHolder.class.getName() +  LogHolder.getDetailLevelName(a_detail));
	}
	
	public static int[] getAvailableLogTypes()
	{
		return LogType.getAvailableLogTypes();
	}
	
	public static String getLogTypeName(int a_logType)
	{
		return LogType.getLogTypeName(a_logType);
	}
	
	public static int getLogDetailCount()
	{
		return LogHolder.getDetailLevelCount();
	}
	
	public void log(int a_logLevel, String a_message)
	{
		LogHolder.log(a_logLevel, LogType.GUI, a_message, LogHolder.CALLING_METHOD_ONLY);
	}
	
	public void log(int a_logLevel, Throwable a_throwable)
	{
		LogHolder.log(a_logLevel, LogType.GUI, a_throwable, LogHolder.CALLING_METHOD_ONLY);
	}
	
	public void log(int a_logLevel, String a_message, Throwable a_throwable)
	{
		LogHolder.log(a_logLevel, LogType.GUI, a_message,
				a_throwable, LogHolder.CALLING_METHOD_ONLY);
	}
	
	
	public int getLogDetail()
	{
		return LogHolder.getDetailLevel();
	}
	
	public boolean setLogDetail(int a_logDetail)
	{
		return LogHolder.setDetailLevel(a_logDetail);
	}
	
	
	public synchronized boolean setLogTypes(int a_logTypes)
	{
		if (!LogType.isValidLogType(a_logTypes))
		{
			return false;
		}
		
		if (m_logger != null)
		{
			m_logger.setLogType(a_logTypes);
		}
		else
		{
			m_iInitLogType = a_logTypes;
		}
		
		return true;
	}
	
	public int getLogTypes()
	{
		if (m_logger != null)
		{
			return m_logger.getLogType();
		}
		else
		{
			return m_iInitLogType;
		}
	}
	
	public synchronized void setLogLevel(int a_level)
	{
		if (m_logger != null)
		{
			m_logger.setLogLevel(a_level);
		}
		else
		{
			m_iInitLogLevel = a_level;
		}
	}
	
	public int getLogLevel()
	{
		if (m_logger != null)
		{
			return m_logger.getLogLevel();
		}
		else
		{
			return m_iInitLogLevel;
		}
	}
	
}
