package es.ejie.frmk.infraestructura.logs.navegacion;

import java.util.HashMap;

import es.ejie.frmk.infraestructura.logs.base.Q70ConstantesLogs;
import es.ejie.frmk.infraestructura.logs.base.Q70LogInterno;
import es.ejie.frmk.infraestructura.logs.base.Q70Mensaje;
import es.ejie.frmk.infraestructura.logs.base.interfaces.Q70Log;
import es.ejie.frmk.infraestructura.logs.base.interfaces.Q70LogFlushable;

/**
 * Log específico para guardar datos relativos a la Navegación.
 * <p>
 * Previamente ha de ser configurado por el <b>Q70GestorLogs</b>. 
 * Los datos de la configuración
 * se encuentran en un fichero de configuración XML.
 * 
 * @author Carlos Rodriguez
 * @version 1.0  fecha: 10-dic-03
 * 
 */
public class Q70LogNavegacion implements Q70LogNavegacionInterface,Q70LogFlushable
{

	//respuesta sobre la navegacion
	public final static String RESPUESTA_OK = "OK";
	public final static String RESPUESTA_ERROR = "ERROR";
	public final static String RESPUESTA_NAVEGACION_ANOMALA = "NAV. ANOMALA";

	//tipos de navegacion
	public final static String TIPO_NAVEGACION_ENTRADA = "ENTRADA";
	public final static String TIPO_NAVEGACION_SALIDA = "SALIDA";

	//Instancia unica del log de navegacion
	private static Q70LogNavegacion logNavegacion;

	private Q70Log log;

	private Q70LogNavegacion() {
	}

	/**
	  * Proporciona acceso al Q70Log de Incidencias
	  * @return Instancia única del Q70Log de Incidencias
	  */
	synchronized public static Q70LogNavegacion getSingleton()
	{
		if (logNavegacion == null)
			logNavegacion = new Q70LogNavegacion();
		return logNavegacion;
	}

	/**
	 * @see es.ejie.frmk.infraestructura.logs.navegacion.Q70LogNavegacionInterface#log(java.lang.String, java.lang.String)
	 */
	public void log(String codigoRespuesta, String tipoSalida)
	{
		if (log == null){
			Q70LogNavegacionServidor.getSingleton().log(codigoRespuesta, tipoSalida);
			return;
		}
		
		if (Q70LogNavegacionServidor.getSingleton().isEnabled()){
			Q70LogNavegacionServidor.getSingleton().log(codigoRespuesta, tipoSalida);
		}
		
		if (log.isEnabled()){
			HashMap hm = new Q70Mensaje();
			hm.put(Q70ConstantesLogs.COD_RESPUESTA, codigoRespuesta);
			hm.put(Q70ConstantesLogs.TIPO_SALIDA, tipoSalida);
			
			try {
				log.log(hm);
			} catch (NullPointerException ex) {
				Q70LogInterno.log(hm.toString());
			}
		}
	}
	
	/**
	 * @see es.ejie.frmk.infraestructura.logs.navegacion.Q70LogNavegacionInterface#isEnabled()
	 */
	public boolean isEnabled()
	{
		if (log == null)
			return Q70LogNavegacionServidor.getSingleton().isEnabled();
		return log.isEnabled() || Q70LogNavegacionServidor.getSingleton().isEnabled();
	}
	
	/**
	 * Establece el log de navegación
	 * @param log log
	 */
	public void setLog(Q70Log log)
	{
		this.log = log;
	}
	
	/**
	 * @see es.ejie.frmk.infraestructura.logs.base.interfaces.Q70LogFlushable#flush()
	 */
	public void flush(){
		log.flush();
	}
}
