/**
 * 
 */
package es.dalocar.software;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import es.dalocar.software.daos.AmortizacionDAO;
import es.dalocar.software.daos.ClienteDAO;
import es.dalocar.software.daos.FacturaDAO;
import es.dalocar.software.daos.LineaAmortizacionDAO;
import es.dalocar.software.daos.LineaFacturaDAO;
import es.dalocar.software.delegates.ClienteDelegate;
import es.dalocar.software.services.AmortizacionService;
import es.dalocar.software.validator.ValidatorTool;

/**	
 * 
 * El gestor principal de la aplicacion
 * 
 * @author dlopez
 *
 */
public class ApplicationManager {

	private static final Logger logger = Logger.getLogger(ApplicationManager.class);
	private static final boolean DEBUG = logger.isDebugEnabled(); 
	
	private static final String SPRING_CONFIG_FILE = "applicationContext.xml";

	private static ApplicationContext appContext = new ClassPathXmlApplicationContext(SPRING_CONFIG_FILE);
	private static ApplicationManager instance;

	/**
	 * Public constructor
	 */
	public ApplicationManager() {
		//Do nothing
	}

	
	/**
	 * Devuelve la instancia al ApplicationManager
	 * @return ApplicationManager
	 */
	public static ApplicationManager getManager() {
		return (ApplicationManager) appContext.getBean("applicationManager");
	}
	
	/**
	 * @return
	 */
	public FacturaDAO getFacturaDAO() {
		return (FacturaDAO)appContext.getBean("facturaDAO");
	}
	
	/**
	 * @return
	 */
	public LineaFacturaDAO getLineaFacturaDAO() {
		return (LineaFacturaDAO)appContext.getBean("lineaFacturaDAO");
	}
	
	/**
	 * @return
	 */
	public AmortizacionDAO getAmortizacionDAO() {
		return (AmortizacionDAO)appContext.getBean("amortizacionDAO");
	}
	
	/**
	 * @return
	 */
	public LineaAmortizacionDAO getLineaAmortizacionDAO() {
		return (LineaAmortizacionDAO)appContext.getBean("lineaAmortizacionDAO");
	}
	
	
	/**
	 * @return
	 */
	public ClienteDAO getClienteDAO() {
		return (ClienteDAO)appContext.getBean("clienteDAO");
	}
	
	/**
	 * Devuelve el contexto
	 * @return the context
	 */
	public Context getContext() {
		return (Context) appContext.getBean("context");
	}
	
	public AmortizacionService getFacturaService() {
		return (AmortizacionService)appContext.getBean("facturaService");
	}
	
	/**
	 * Devuelve el ValidatorTool
	 * @return ValidatorTool
	 */
	public ValidatorTool getValidatorTool() {
		return (ValidatorTool) appContext.getBean("validator");
		//return validatorTool;
	}
	
	/**
	 * Crear ventana de mensajes
	 * @param bean
	 * @return Una lista de claves de mensajes, que estará vacia si no hay errores
	 */
	public List validate(Object bean) {
		List result = new ArrayList();
		ValidatorTool validatorTool = ApplicationManager.getManager().getValidatorTool();
		String[] msgs = validatorTool.perform(bean);
		if (msgs != null) {
			result.addAll(Arrays.asList(msgs));
		}
		return result;
	}
	
	/**
	 * @return
	 */
	public ClienteDelegate getClienteDelegate() { 
		return (ClienteDelegate) appContext.getBean("ClienteDelegate");
	}
	
	/**
	 * Construye la cadena de validacion
	 * @param list
	 * @return Cadena de validación
	 */
	public String constructValidationString(List list) {
		return Messages.getStrings(getValidatorTool().getHyphen(), list, "\n");
	}
}
