package com.ejie.ad74a.security;

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

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;

import com.ejie.ad74a.model.Ayuntamientos;
import com.ejie.ad74a.model.Usuarios;
import com.ejie.ad74a.model.UsuariosAyuntamiento;
import com.ejie.ad74a.service.AyuntamientosService;
import com.ejie.ad74a.util.comun.UtilSeguridad;
import com.ejie.ad74a.util.comun.Utilidades;
import com.ejie.ad74a.util.constantes.Constantes;

public class PerfilAuthenticationFilter extends AbstractAuthenticationProcessingFilter {

	@Autowired
	private AyuntamientosService ayuntamientosService;

	public PerfilAuthenticationFilter() {
		super("/**");
	}

	@Override
	protected boolean requiresAuthentication(HttpServletRequest request, HttpServletResponse response) {

		HttpSession sesion = request.getSession();
		Long ayuntamientoSeleccionado = (Long) sesion.getAttribute(Constantes.VARCONTEXTO_AYUNTAMIENTO_SELECCIONADO);

		String[] perfilTecnicoDSS = { UtilSeguridad.Props.PERFIL_SEGURIDAD_TECNICO_DSS.getValue() };
		String[] perfilSSB = { UtilSeguridad.Props.PERFIL_SEGURIDAD_SSB.getValue() };

		// String[] perfilSeguridad = {
		// UtilSeguridad.Props.PERFIL_SEGURIDAD_ADMINISTRADOR.getValue() };
		Boolean isSSB = UtilSeguridad.tienePerfilSeguridad(request, perfilSSB);

		String urlDestino = null;
		if (!(request.getContextPath() + request.getServletPath())
				.contains(Constantes.URL_SELECCIONAYUNTAMIENTO_CONTROLLER)) {
			urlDestino = request.getContextPath() + request.getServletPath();
		}

		if (Boolean.TRUE.equals(isSSB)) {
			// Se buscan los ayuntamientos que tenga y si se tiene 1, se selecciona
			// directamente
			Usuarios usuarios = new Usuarios();
			usuarios.setUsuXlnets80(UtilSeguridad.getUsuarioConectado().getUserName());
			UsuariosAyuntamiento usuariosAyuntamiento = new UsuariosAyuntamiento();
			usuariosAyuntamiento.setUsuarios(usuarios);

			List<Ayuntamientos> listaAyuntamientos = this.ayuntamientosService
					.findComboByUsuarioConectado(usuariosAyuntamiento);

			if (!listaAyuntamientos.isEmpty() && listaAyuntamientos.size() == 1) {
				ayuntamientoSeleccionado = listaAyuntamientos.get(0).getIdAyuntamiento31();
				sesion.setAttribute(Constantes.VARCONTEXTO_AYUNTAMIENTO_SELECCIONADO, ayuntamientoSeleccionado);
			}

			if (ayuntamientoSeleccionado == null && !Utilidades.esBlancoNulo(urlDestino)
					&& !urlDestino.contains(Constantes.URL_SELECCIONAYUNTAMIENTO_CONTROLLER)) {
				return true;
			}
		}

		return false;
	}

	@Override
	public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
			throws AuthenticationException {
		// Devolvemos la autenticación recuperada por XLNETS
		return SecurityContextHolder.getContext().getAuthentication();
	}

	@Override
	protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain,
			Authentication authResult) throws IOException, ServletException {
		super.successfulAuthentication(request, response, chain, authResult);
		// As this authentication is in HTTP header, after success we need to continue
		// the request normally
		// and return the response as if the resource was not secured at all

	}
}
