package common.controller;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.beans.propertyeditors.CustomNumberEditor;
import org.springframework.validation.BindException;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.multipart.support.ByteArrayMultipartFileEditor;

import common.bean.UserBean;
import common.bean.UserData;
import common.utility.formatter.CustomCalendarEditor;

public class BaseController {

	protected HttpServletRequest request;
	protected HttpServletResponse response;
	@SuppressWarnings("unused")
	private UserData userData;
	
	public BaseController() {
		this.userData = null;
	}
	
	protected UserBean createUserBean() {
		UserBean bean = new UserBean();
		UserData datiUtente = getUserData();
		
		bean.setUserId(datiUtente.getUserId());
		bean.setLogin(datiUtente.getLogin());
		bean.setLastname(datiUtente.getLastname());
		bean.setFirstname(datiUtente.getFirstname());
		bean.setLevel(datiUtente.getLevel());
		
		return bean;
	}	

	public BaseController(HttpServletRequest request, HttpServletResponse response) {
		this.request = request;
		this.response = response;
	}
	
	public BaseController(HttpServletRequest request, HttpServletResponse response, UserData userData) {
		this.request = request;
		this.response = response;
		this.userData = userData;
	}
	
	public void setRequest(HttpServletRequest request) {
		this.request = request;
	}
	
	public void setResponse(HttpServletResponse response) {
		this.response = response;
	}
	
	public HttpServletRequest getRequest() {
		return request;
	}
	
	public HttpServletResponse getResponse() {
		return response;
	}
	
	public void setUserData(UserData userData) {
		setSessionAttribute("userData",userData);
	}
	
	public UserData getUserData() {
		return (UserData)getSessionAttribute("userData");
	}
	
	public boolean isUserLogged() {
		return getUserData() != null && getUserData().getUserId()!=0;
	}

	public final String getCookie(String cookieName) {
		if (request!=null) {
			Cookie[] cookies = request.getCookies();
			for (int i=0;i<cookies.length;i++) {
				if (cookieName.equalsIgnoreCase(cookies[i].getName()))
					return cookies[i].getValue();
			}
		} 
		return null;
	}
	
	protected final Object getSessionAttribute(String name) {

		Object retVal = request.getSession().getAttribute(name);
		return retVal;
	}

	protected final void setSessionAttribute(String objectName, Object obj) {
	/**
	 * Setta in sessione un oggetto (<code>obj</code>) associandogli un nome (<code>objectName</code>)
	 * @param objectName
	 * @param obj
	 */
	                                        

		request.getSession().setAttribute(objectName, obj);

	}
	
	protected boolean isEmpty(String str) {
		return (str==null || "".equals(str.trim()));			
	}
	
	@InitBinder
	public void binder(WebDataBinder binder) {
		
		SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
		
		binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
		
		SimpleDateFormat calendarFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm");
		
		//binder.registerCustomEditor(Calendar.class,  new CustomDateEditor(calendarFormat, true, -1));
		
		binder.registerCustomEditor(Calendar.class,  new CustomCalendarEditor(calendarFormat, true, -1));
		
		/*
		binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
		    public void setAsText(String value) {
		        try {
		        	if (value==null || value == "")
		        		 setValue(null);
		        	else {
			        	Date data = new SimpleDateFormat("dd/MM/yyyy").parse(value); 
			            setValue(data);
		        	}
		        } catch(ParseException e) {
		            setValue(null);
		        }
		    }

		    public String getAsText() {
		    	if (getValue()==null)
		    		return "";
		    	else 
		    		return new SimpleDateFormat("dd/MM/yyyy").format((Date) getValue());
		    }        
		});

		binder.registerCustomEditor(Calendar.class, new PropertyEditorSupport() {
		    public void setAsText(String value) {
		        try {
		        	if (value==null || value == "")
		        		 setValue(null);
		        	else {
			        	Date data = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss").parse(value); 
			            setValue(data);
		        	}
		        } catch(ParseException e) {
		            setValue(null);
		        }
		    }

		    public String getAsText() {
		    	if (getValue()==null)
		    		return "";
		    	else 
		    		return new SimpleDateFormat("dd/MM/yyyy hh:mm:ss").format((Calendar) getValue());
		    }        
		});
	
		*/
		
		binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());
		
		binder.registerCustomEditor(Integer.class, new CustomNumberEditor(Integer.class, true));
	}

	
	
	/**
	 * Il metodo della classe madre (BaseController) chiama il metodo super
	 * della sua classe madre (BaseCommandController) che � vuoto. Viene poi
	 * invocato il metodo formBackingObject per mettere in request quei
	 * parametri che non vengono trattati direttamente nel bean. Nelle altre procedure
	 * era possibile che tali parametri venissero 'persi' quando a fronte
	 * di una errata validazione si tornava della form della jsp. Ora 
	 * i parametri vengono gestiti tutti nel bean della pagina e non abbiamo
	 * bisogno di invocare il metodo formBackingObject nel controller.
	 */
	protected void onBindAndValidate(HttpServletRequest request,
	                                 Object command,
	                                 BindException errors) throws Exception 
	                                 {
	                                 }
	protected void initBinder(HttpServletRequest request,
	                          ServletRequestDataBinder binder) throws Exception 
	{

		
		SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
		
		binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
		
		SimpleDateFormat calendarFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm");
		
		binder.registerCustomEditor(Calendar.class, new CustomDateEditor(calendarFormat, true));

	}
	
	
}
