package com.ejie.ab79.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;

public abstract class SeguridadAplicacion {

	// Instancias / roles de los usuarios
	 
	public static String ROLE_ADMINISTRADOR = "ROLE_AB79-IN-0001";
	public static String ROLE_RESPONSABLE_TURISMO = "ROLE_AB79-IN-0002";
	public static String ROLE_TECNICO_TURISMO = "ROLE_AB79-IN-0003";
	public static String ROLE_RESPONSABLE_COMERCIO = "ROLE_AB79-IN-0004";
	public static String ROLE_TECNICO_COMERCIO = "ROLE_AB79-IN-0005";
	public static String ROLE_RESPONSABLE_TURISMO_ARABA = "ROLE_AB79-IN-0006";
	public static String ROLE_RESPONSABLE_TURISMO_BIZKAIA = "ROLE_AB79-IN-0007";
	public static String ROLE_RESPONSABLE_TURISMO_GIPUZKOA = "ROLE_AB79-IN-0008";
	public static String ROLE_TECNICO_TURISMO_ARABA = "ROLE_AB79-IN-0009";
	public static String ROLE_TECNICO_TURISMO_BIZKAIA = "ROLE_AB79-IN-0010";
	public static String ROLE_TECNICO_TURISMO_GIPUZKOA = "ROLE_AB79-IN-0011";
	public static String ROLE_RESPONSABLE_COMERCIO_ARABA = "ROLE_AB79-IN-0012";
	public static String ROLE_RESPONSABLE_COMERCIO_BIZKAIA = "ROLE_AB79-IN-0013";
	public static String ROLE_RESPONSABLE_COMERCIO_GIPUZKOA = "ROLE_AB79-IN-0014";
	public static String ROLE_TECNICO_COMERCIO_ARABA = "ROLE_AB79-IN-0015";
	public static String ROLE_TECNICO_COMERCIO_BIZKAIA = "ROLE_AB79-IN-0016";
	public static String ROLE_TECNICO_COMERCIO_GIPUZKOA = "ROLE_AB79-IN-0017";

	// USUARIOS de la Aplicación
	
	// AB79U001: Administrador
	// AB79U002: Responsable de Turismo
	// AB79U003: Técnico de Turismo
	// AB79U004: Responsable de Comercio
	// AB79U005: Técnico de Comercio
	// AB79U006: Responsable de Turismo de Araba
	// AB79U007: Responsable de Turismo de Bizkaia
	// AB79U008: Responsable de Turismo de Gipuzkoa
	// AB79U009: Técnico de Turismo de Araba
	// AB79U010: Técnico de Turismo de Bizkaia
	// AB79U011: Técnico de Turismo de Gipuzkoa
	// AB79U012: Responsable de Comercio de Araba
	// AB79U013: Responsable de Comercio de Bizkaia
	// AB79U014: Responsable de Comercio de Gipuzkoa
	// AB79U015: Técnico de Comercio de Araba
	// AB79U016: Técnico de Comercio de Bizkaia
	// AB79U017: Técnico de Comercio de Gipuzkoa
	// AB79U018: Técnico de Turismo y Comercio de Araba
	// AB79U019: Técnico de Turismo y Comercio de Bizkaia
	// AB79U020: Técnico de Turismo y Comercio de Gipuzkoa

	
	public SeguridadAplicacion() {

	}

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

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

		return vecPermisos;
	}

	/**
	 * 
	 * @param authentication
	 *            org.springframework.security.core.Authentication
	 * @return String provincias para indicar que provincia se debe precargar en
	 *         la búsqueda de inspecciones
	 */
	public static String precargarProvincia() {

		String provincia = "";

		Vector<String> vecPermisos = SeguridadAplicacion
				.getRolesUsuario(SecurityContextHolder.getContext().getAuthentication());

		// Si solo pertenece a Araba
		if ((vecPermisos.contains(ROLE_RESPONSABLE_COMERCIO_ARABA)
				|| vecPermisos.contains(ROLE_RESPONSABLE_TURISMO_ARABA)
				|| vecPermisos.contains(ROLE_TECNICO_COMERCIO_ARABA)
				|| vecPermisos.contains(ROLE_TECNICO_TURISMO_ARABA))
				&& !vecPermisos.contains(ROLE_RESPONSABLE_COMERCIO_BIZKAIA)
				&& !vecPermisos.contains(ROLE_RESPONSABLE_COMERCIO_GIPUZKOA)
				&& !vecPermisos.contains(ROLE_RESPONSABLE_TURISMO_BIZKAIA)
				&& !vecPermisos.contains(ROLE_RESPONSABLE_TURISMO_GIPUZKOA)
				&& !vecPermisos.contains(ROLE_TECNICO_COMERCIO_BIZKAIA)
				&& !vecPermisos.contains(ROLE_TECNICO_COMERCIO_GIPUZKOA)
				&& !vecPermisos.contains(ROLE_TECNICO_TURISMO_BIZKAIA)
				&& !vecPermisos.contains(ROLE_TECNICO_TURISMO_GIPUZKOA)) {
			provincia = Constantes.COD_PROVINCIA_ARABA;

			// Si solo pretenece a Bizkaia
		} else if ((vecPermisos.contains(ROLE_RESPONSABLE_COMERCIO_BIZKAIA)
				|| vecPermisos.contains(ROLE_RESPONSABLE_TURISMO_BIZKAIA)
				|| vecPermisos.contains(ROLE_TECNICO_COMERCIO_BIZKAIA)
				|| vecPermisos.contains(ROLE_TECNICO_TURISMO_BIZKAIA))
				&& !vecPermisos.contains(ROLE_RESPONSABLE_COMERCIO_ARABA)
				&& !vecPermisos.contains(ROLE_RESPONSABLE_COMERCIO_GIPUZKOA)
				&& !vecPermisos.contains(ROLE_RESPONSABLE_TURISMO_ARABA)
				&& !vecPermisos.contains(ROLE_RESPONSABLE_TURISMO_GIPUZKOA)
				&& !vecPermisos.contains(ROLE_TECNICO_COMERCIO_ARABA)
				&& !vecPermisos.contains(ROLE_TECNICO_COMERCIO_GIPUZKOA)
				&& !vecPermisos.contains(ROLE_TECNICO_TURISMO_ARABA)
				&& !vecPermisos.contains(ROLE_TECNICO_TURISMO_GIPUZKOA)) {
			provincia = Constantes.COD_PROVINCIA_BIZKAIA;

			// Si solo pertenece a Gipuzkoa
		} else if ((vecPermisos.contains(ROLE_RESPONSABLE_COMERCIO_GIPUZKOA)
				|| vecPermisos.contains(ROLE_RESPONSABLE_TURISMO_GIPUZKOA)
				|| vecPermisos.contains(ROLE_TECNICO_COMERCIO_GIPUZKOA)
				|| vecPermisos.contains(ROLE_TECNICO_TURISMO_GIPUZKOA))
				&& !vecPermisos.contains(ROLE_RESPONSABLE_COMERCIO_ARABA)
				&& !vecPermisos.contains(ROLE_RESPONSABLE_COMERCIO_BIZKAIA)
				&& !vecPermisos.contains(ROLE_RESPONSABLE_TURISMO_ARABA)
				&& !vecPermisos.contains(ROLE_RESPONSABLE_TURISMO_BIZKAIA)
				&& !vecPermisos.contains(ROLE_TECNICO_COMERCIO_ARABA)
				&& !vecPermisos.contains(ROLE_TECNICO_COMERCIO_BIZKAIA)
				&& !vecPermisos.contains(ROLE_TECNICO_TURISMO_ARABA)
				&& !vecPermisos.contains(ROLE_TECNICO_TURISMO_BIZKAIA)) {
			provincia = Constantes.COD_PROVINCIA_GIPUZKOA;
		}

		return provincia;
	}

	public static String precargarDireccion() {

		String direccion = "";

		Vector<String> vecPermisos = SeguridadAplicacion
				.getRolesUsuario(SecurityContextHolder.getContext().getAuthentication());

		// Si solo pertenece a turismo
		if ((vecPermisos.contains(ROLE_RESPONSABLE_TURISMO) || vecPermisos.contains(ROLE_RESPONSABLE_TURISMO_ARABA)
				|| vecPermisos.contains(ROLE_RESPONSABLE_TURISMO_BIZKAIA)
				|| vecPermisos.contains(ROLE_RESPONSABLE_TURISMO_GIPUZKOA) || vecPermisos.contains(ROLE_TECNICO_TURISMO)
				|| vecPermisos.contains(ROLE_TECNICO_TURISMO_ARABA)
				|| vecPermisos.contains(ROLE_TECNICO_TURISMO_BIZKAIA)
				|| vecPermisos.contains(ROLE_TECNICO_TURISMO_GIPUZKOA))
				&& !vecPermisos.contains(ROLE_RESPONSABLE_COMERCIO)
				&& !vecPermisos.contains(ROLE_RESPONSABLE_COMERCIO_ARABA)
				&& !vecPermisos.contains(ROLE_RESPONSABLE_COMERCIO_BIZKAIA)
				&& !vecPermisos.contains(ROLE_RESPONSABLE_COMERCIO_GIPUZKOA)
				&& !vecPermisos.contains(ROLE_TECNICO_COMERCIO) && !vecPermisos.contains(ROLE_TECNICO_COMERCIO_ARABA)
				&& !vecPermisos.contains(ROLE_TECNICO_COMERCIO_BIZKAIA)
				&& !vecPermisos.contains(ROLE_TECNICO_COMERCIO_GIPUZKOA)) {
			direccion = String.valueOf(Constantes.ID_TURISMO_DIRECCION);

			// Si solo pretenece a Comercio
		} else if ((vecPermisos.contains(ROLE_RESPONSABLE_COMERCIO)
				|| vecPermisos.contains(ROLE_RESPONSABLE_COMERCIO_ARABA)
				|| vecPermisos.contains(ROLE_RESPONSABLE_COMERCIO_BIZKAIA)
				|| vecPermisos.contains(ROLE_RESPONSABLE_COMERCIO_GIPUZKOA)
				|| vecPermisos.contains(ROLE_TECNICO_COMERCIO) || vecPermisos.contains(ROLE_TECNICO_COMERCIO_ARABA)
				|| vecPermisos.contains(ROLE_TECNICO_COMERCIO_BIZKAIA)
				|| vecPermisos.contains(ROLE_TECNICO_COMERCIO_GIPUZKOA))
				&& !vecPermisos.contains(ROLE_RESPONSABLE_TURISMO)
				&& !vecPermisos.contains(ROLE_RESPONSABLE_TURISMO_ARABA)
				&& !vecPermisos.contains(ROLE_RESPONSABLE_TURISMO_BIZKAIA)
				&& !vecPermisos.contains(ROLE_RESPONSABLE_TURISMO_GIPUZKOA)
				&& !vecPermisos.contains(ROLE_TECNICO_TURISMO) && !vecPermisos.contains(ROLE_TECNICO_TURISMO_ARABA)
				&& !vecPermisos.contains(ROLE_TECNICO_TURISMO_BIZKAIA)
				&& !vecPermisos.contains(ROLE_TECNICO_TURISMO_GIPUZKOA)) {
			direccion = String.valueOf(Constantes.ID_COMERCIO_DIRECCION);
		}

		return direccion;
	}

	public static Boolean instanciaResponsableTurismo() {

		Boolean instancia;

		Vector<String> vecInstancia = SeguridadAplicacion
				.getRolesUsuario(SecurityContextHolder.getContext().getAuthentication());

		if (vecInstancia.contains(ROLE_RESPONSABLE_TURISMO)) {
			instancia = true;
		} else {
			instancia = false;
		}

		return instancia;
	}

	public static Boolean instanciaResponsableComercio() {

		Boolean instancia;

		Vector<String> vecInstancia = SeguridadAplicacion
				.getRolesUsuario(SecurityContextHolder.getContext().getAuthentication());

		if (vecInstancia.contains(ROLE_RESPONSABLE_COMERCIO)) {
			instancia = true;
		} else {
			instancia = false;
		}

		return instancia;
	}

	public static Boolean instanciaResponsable() {

		Boolean instancia;

		Vector<String> vecInstancia = SeguridadAplicacion
				.getRolesUsuario(SecurityContextHolder.getContext().getAuthentication());

		if (vecInstancia.contains(ROLE_ADMINISTRADOR) || vecInstancia.contains(ROLE_RESPONSABLE_COMERCIO)
				|| vecInstancia.contains(ROLE_RESPONSABLE_TURISMO)
				|| vecInstancia.contains(ROLE_RESPONSABLE_COMERCIO_ARABA)
				|| vecInstancia.contains(ROLE_RESPONSABLE_COMERCIO_BIZKAIA)
				|| vecInstancia.contains(ROLE_RESPONSABLE_COMERCIO_GIPUZKOA)
				|| vecInstancia.contains(ROLE_RESPONSABLE_TURISMO_ARABA)
				|| vecInstancia.contains(ROLE_RESPONSABLE_TURISMO_BIZKAIA)
				|| vecInstancia.contains(ROLE_RESPONSABLE_TURISMO_GIPUZKOA)) {
			instancia = true;
		} else {
			instancia = false;
		}

		return instancia;
	}

	public static Boolean instanciaTecnico() {

		Boolean instancia;

		Vector<String> vecInstancia = SeguridadAplicacion
				.getRolesUsuario(SecurityContextHolder.getContext().getAuthentication());

		if (vecInstancia.contains(ROLE_TECNICO_COMERCIO) || vecInstancia.contains(ROLE_TECNICO_TURISMO)
				|| vecInstancia.contains(ROLE_TECNICO_COMERCIO_ARABA)
				|| vecInstancia.contains(ROLE_TECNICO_COMERCIO_BIZKAIA)
				|| vecInstancia.contains(ROLE_TECNICO_COMERCIO_GIPUZKOA)
				|| vecInstancia.contains(ROLE_TECNICO_TURISMO_ARABA)
				|| vecInstancia.contains(ROLE_TECNICO_TURISMO_BIZKAIA)
				|| vecInstancia.contains(ROLE_TECNICO_TURISMO_GIPUZKOA)) {
			instancia = true;
		} else {
			instancia = false;
		}

		return instancia;
	}

}
