package com.ejie.ab63.comun;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;

import com.ejie.ab63.model.procedimientos.Procedimientos;

public abstract class SeguridadAplicacion {

	/**
	 * 
	 */
	private static String ROLE_ADMINISTRADOR = "ROLE_AB63-IN-0001";
	private static String ROLE_RESPONSABLE_TURISMO = "ROLE_AB63-IN-0002";
	private static String ROLE_TECNICO_TURISMO = "ROLE_AB63-IN-0003";
	private static String ROLE_RESPONSABLE_COMERCIO = "ROLE_AB63-IN-0004";
	private static String ROLE_TECNICO_COMERCIO = "ROLE_AB63-IN-0005";

	/**
	 * 
	 */
	private static final long serialVersionUID = 7601398309596598460L;

	public SeguridadAplicacion() {

	}

	/**
	 * 
	 * @param authentication
	 *            org.springframework.security.core.Authentication
	 * @return Vector<String> con los roles del usuario
	 */
	public static Vector<String> getRolesUsuario(Authentication authentication) {
		List<GrantedAuthority> list = new ArrayList<GrantedAuthority>(authentication.getAuthorities());
		Vector<String> vecPermisos = new Vector<String>();

		for (GrantedAuthority grantedAuthority : list) {
			vecPermisos.add(grantedAuthority.getAuthority());
		}

		return vecPermisos;
	}

	/**
	 * 
	 * @param authentication
	 *            org.springframework.security.core.Authentication
	 * @param procedimientos
	 *            Procedimientos
	 * @return boolean para indicar si tiene acceso o no al procedimiento
	 */
	public static boolean validarAccesoProcedimiento(Authentication authentication, Procedimientos procedimientos) {
		Vector<String> vecPermisos = SeguridadAplicacion
				.getRolesUsuario(SecurityContextHolder.getContext().getAuthentication());

		// TODO JOSEBA
		vecPermisos.add(SeguridadAplicacion.ROLE_RESPONSABLE_TURISMO);

		boolean bolAcceso = false;

		if (procedimientos != null && procedimientos.getDirecciones() != null) {
			// Si el procedimiento tiene codigo de direccion 1 es visible
			// para perfil administrador y responsable de turismo
			if (procedimientos.getDirecciones().getIdDireccion() == Constantes.COD_DIRECCION_TURISMO
					&& (vecPermisos.contains(SeguridadAplicacion.ROLE_ADMINISTRADOR)
							|| vecPermisos.contains(SeguridadAplicacion.ROLE_RESPONSABLE_TURISMO)))
				bolAcceso = true;
			// Si el procedimiento tiene codigo de direccion 1 es visible
			// para perfil administrador y responsable de comercio
			else if (procedimientos.getDirecciones()
					.getIdDireccion() == Constantes.ID_TIPO_DIRECCION_ESTABLECIMIENTO_EXPEDIENTE
					&& (vecPermisos.contains(SeguridadAplicacion.ROLE_ADMINISTRADOR)
							|| vecPermisos.contains(SeguridadAplicacion.ROLE_RESPONSABLE_COMERCIO)))
				bolAcceso = true;
		}

		return bolAcceso;
	}
}
