package com.rjconsultores.ventaboletos.utilerias;

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

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.context.ContextLoader;

import com.rjconsultores.ventaboletos.constantes.Constantes;
import com.rjconsultores.ventaboletos.dao.UsuarioDAO;
import com.rjconsultores.ventaboletos.entidad.PerfilFuncion;
import com.rjconsultores.ventaboletos.entidad.Usuario;
import com.rjconsultores.ventaboletos.entidad.UsuarioEmpresa;
import com.rjconsultores.ventaboletos.entidad.UsuarioPerfil;
import com.rjconsultores.ventaboletos.entidad.UsuarioUbicacion;

public class UsuarioLogado {
	
	private static final Logger log = LogManager.getLogger(UsuarioLogado.class);
	
	public static Usuario getUsuarioLogado() {

		Usuario usuario = null;
		SecurityContext sc = SecurityContextHolder.getContext();
		if (sc != null) {
			Authentication authentication = (Authentication) sc.getAuthentication();

			if ((authentication != null) && (authentication.getPrincipal() instanceof Usuario)) {
				usuario = (Usuario) authentication.getPrincipal();
				
				if(usuario.getListClavesPermisos() == null) {
					cargaPermisoClave(usuario);
				}
				
				try {
					usuario.getUsuarioEmpresaList();
				}catch (Exception e) {
					carregaUsuarioEmpresaList(usuario);
				}
				
				try {
					usuario.getUsuarioPerfilList();
				}catch (Exception e) {
					carregaUsuarioPerfilList(usuario);
				}
				
				try {
					usuario.getUsuarioUbicacionList();
				}catch (Exception e) {
					carregaUsuarioUbicacionList(usuario);
				}
			} else {
				usuario = null;
			}
		}
		
		return usuario;
	}
	
	private static void carregaUsuarioPerfilList(Usuario usuario) {
		try {			
			List<UsuarioPerfil> list = obtemUsuarioDao().buscarUsuarioPerfilList(usuario.getUsuarioId());
			usuario.setUsuarioPerfilList(list);
		}catch (Exception e) {
			log.error(e.getMessage(), e);
		}		
	}
	
	private static void carregaUsuarioUbicacionList(Usuario usuario) {
		try {			
			List<UsuarioUbicacion> list = obtemUsuarioDao().buscarUsuarioUbicacionList(usuario.getUsuarioId());
			usuario.setUsuarioUbicacionList(list);
		}catch (Exception e) {
			log.error(e.getMessage(), e);
		}		
	}
	
	private static void carregaUsuarioEmpresaList(Usuario usuario) {
		try {			
			List<UsuarioEmpresa> list = obtemUsuarioDao().buscarUsuarioEmpresaList(usuario.getUsuarioId());
			usuario.setUsuarioEmpresaList(list);
		}catch (Exception e) {
			log.error(e.getMessage(), e);
		}		
	}

	private static void cargaPermisoClave(Usuario usuario) {
		try {							
			usuario.setListClavesPermisos(new ArrayList<String>());
			List<UsuarioPerfil> listUsuarioPerfil = obtemUsuarioDao().buscarUsuarioPerfilList(usuario.getUsuarioId());
			for (UsuarioPerfil up : listUsuarioPerfil) {
				List<PerfilFuncion> listPerfilFuncion = up.getPerfil().getPerfilFuncionList();
				for (PerfilFuncion pf : listPerfilFuncion) {
					usuario.getListClavesPermisos().add(pf.getFuncionSistema().getDescruta());
				}
			}			
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
	}
	
	private static UsuarioDAO obtemUsuarioDao() {
		ApplicationContext context = ContextLoader.getCurrentWebApplicationContext();
		
		if(context != null) {
			UsuarioDAO usuarioDAO = context.getBean(UsuarioDAO.class);
			if(usuarioDAO != null) {
				return usuarioDAO;
			}
		}
		return null;
	}
	
	public static boolean isUsuarioAdmContrato() {
		if( getUsuarioLogado() == null) {
			return false;
		}
		
		for (UsuarioPerfil perf : getUsuarioLogado().getUsuarioPerfilList()){
			if(perf.getPerfil().getPerfilId().equals(Constantes.PERFIL_ADM_CONTRATO)) {
				return true;
			}
		}
		return false;
	}
	
	private UsuarioLogado() {
		
	}

}
