package com.ejie.ab39a.filter;

import java.io.IOException;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;

import com.ejie.ab39a.constantes.Constantes;
import com.ejie.ab39a.model.Entidades;
import com.ejie.ab39a.model.TecnicosEntidad;
import com.ejie.ab39a.seguridad.UsuarioConectado;
import com.ejie.ab39a.seguridad.UtilSeguridad;
import com.ejie.ab39a.service.EntidadesService;
import com.ejie.ab39a.service.TecnicosEntidadService;

/**
 * Filtro para validar si el nif existe o no
 * 
 *  
 *
 */
public class ValidacionNifFilter implements Filter {

	@Autowired
	private TecnicosEntidadService tecnicosEntidadService;

	@Autowired
	private EntidadesService entidadesService;

	/**
	 * Method 'destroy'
	 */
	@Override
	public void destroy() {
		/* No hacemos nada */
	}

	/**
	 * Method 'doFilter'
	 */
	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain)
			throws IOException, ServletException {

		HttpServletRequest request = (HttpServletRequest) arg0;
		HttpServletResponse response = (HttpServletResponse) arg1;
		/* Por hacer de momento */
		UsuarioConectado usuarioConectado;
		if (SecurityContextHolder.getContext().getAuthentication() != null) {
			usuarioConectado = UtilSeguridad.getUsuarioConectado();
			if (usuarioConectado.isTecnicoEntidad()) {
				TecnicosEntidad tecnicosEntidad = new TecnicosEntidad();
				tecnicosEntidad.setDocidentificacion(usuarioConectado.getNif());
				List<TecnicosEntidad> listaTecnicosEntidad = this.tecnicosEntidadService.findAll(tecnicosEntidad, null);
				if (listaTecnicosEntidad != null && !listaTecnicosEntidad.isEmpty()) {

					tecnicosEntidad = listaTecnicosEntidad.get(0);
					Entidades entidades = new Entidades();
					TecnicosEntidad tecnicosEntidadAux = new TecnicosEntidad();
					tecnicosEntidadAux.setCodtecnico(tecnicosEntidad.getCodtecnico());
					entidades.setTecnicosEntidad(tecnicosEntidadAux);
					tecnicosEntidad.setEntidadeses(this.entidadesService.findAll(entidades, null));

					List<Entidades> listaEntidadesDatosNoInformados = UtilSeguridad
							.listaEntidadesDatosNoInformados(tecnicosEntidad.getEntidadeses());

					if (!listaEntidadesDatosNoInformados.isEmpty()) {
						tecnicosEntidad.setEntidadeses(listaEntidadesDatosNoInformados);
						usuarioConectado.setRellenarDatosIncompletos(true);
					}

					// Si el usuarioConectado ya tenía entidadPrincipal
					// asociada, se la seteamos al objeto tecnicosEntidad, para
					// no perderla
					// if
					// (request.getSession().getAttribute(Constantes.SESSION_ENTIDAD_PRINCIPAL)
					// != null) {
					// tecnicosEntidad.setEntidadPrincipal(
					// (Entidades)
					// request.getSession().getAttribute(Constantes.SESSION_ENTIDAD_PRINCIPAL));
					// }

					usuarioConectado.setTecnicosEntidad(tecnicosEntidad);

					chain.doFilter(request, response);
					return;
				}
				response.sendRedirect(request.getContextPath().concat("/accessDenied"));
			}

		}
		chain.doFilter(request, response);

	}

	/**
	 * 
	 * @param listaEntidades
	 *            List<Entidades>
	 * @return
	 */

	private Entidades establecerEntidadPrincipal(List<Entidades> listaEntidades) {
		Entidades entidad = new Entidades();
		if (!listaEntidades.isEmpty()) {
			entidad = listaEntidades.get(0);
		}

		return entidad;
	}

	// CHECKSTYLE:ON

	/**
	 * Method 'init'
	 */
	@Override
	public void init(FilterConfig arg0) throws ServletException {
		/* No hacemos nada */
	}

}
