/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rjconsultores.ventaboletos.service.impl;

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

import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.rjconsultores.ventaboletos.constantes.Constantes;
import com.rjconsultores.ventaboletos.dao.ConstanteDAO;
import com.rjconsultores.ventaboletos.dao.TipoOcupacionDAO;
import com.rjconsultores.ventaboletos.entidad.Constante;
import com.rjconsultores.ventaboletos.entidad.TipoOcupacion;
import com.rjconsultores.ventaboletos.service.ConstanteService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;

/**
 *
 * @author Administrador
 */
@Service("constanteService")
public class ConstanteServiceImpl implements ConstanteService {
	
	private static final Logger log = LogManager.getLogger(ConstanteServiceImpl.class);
	
    @Autowired
    private ConstanteDAO constanteDAO;
    
    @Autowired
    private TipoOcupacionDAO tipoOcupacaoDAO;
    
    public static final String URL_PAINEL_BPE = "URL_PAINEL_BPE";
    public static final String URL_API = "URL_API";
    public static final String URL_API_EMB = "URL_API_EMB";

    public List<Constante> obtenerTodos() {
        return constanteDAO.obtenerTodos();
    }

    public Constante obtenerID(Integer id) {
        return constanteDAO.obtenerID(id);
    }

    @Transactional
    public Constante suscribir(Constante entidad) {
        entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
        entidad.setFecmodif(Calendar.getInstance().getTime());
        entidad.setActivo(Boolean.TRUE);

        return constanteDAO.suscribir(entidad);
    }

    @Transactional
    public Constante actualizacion(Constante entidad) {
        entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
        entidad.setFecmodif(Calendar.getInstance().getTime());
        entidad.setActivo(Boolean.TRUE);

        return constanteDAO.actualizacion(entidad);
    }

    @Transactional
    public void borrar(Constante entidad) {
        entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
        entidad.setFecmodif(Calendar.getInstance().getTime());
        entidad.setActivo(Boolean.FALSE);

        constanteDAO.actualizacion(entidad);
    }

    @Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
    public Constante buscarPorNomeConstante(String nomeConstante) {
        return constanteDAO.buscarPorNomeConstante(nomeConstante);
    }
    
    @Override
    public Integer buscarValorConstantePorNomeConstante(String nomeConstante){
    	Constante constante = buscarPorNomeConstante(nomeConstante);
    	try {
    		if(constante!=null && StringUtils.isNotEmpty(constante.getValorconstante()) ) {
    			return Integer.valueOf(constante.getValorconstante().trim());
    		}
    	}catch (Exception e) {
			return null;
		}
    	return null;
    }

    public List<Constante> buscar(String nombconstante) {
        return constanteDAO.buscar(nombconstante);
    }
    
    @Override
    public String buscarNombreAmbiente(){
    	Constante constante = constanteDAO.buscarPorNomeConstante("NOMBRE_AMBIENTE");
    	if (constante == null){
    		return "";
    	}
    	
    	return constante.getValorconstante();
    }
    
    

    @Override
    public String buscarNomeConstanteURLPainelBPe(){
    	return URL_PAINEL_BPE;
    }
    @Override
    public String buscarURLPainelBPe(){
    	Constante constante = constanteDAO.buscarPorNomeConstante(URL_PAINEL_BPE);
    	if (constante == null){
    		return "";
    	}
    	
    	return constante.getValorconstante();
    }
    
    @Override
    public boolean pafActivo(){
    	List<Constante> list = constanteDAO.buscar("HOMOLOGACAO_PAF");
    	if (list.isEmpty()){
    		return false;
    	}
    	
    	Constante constante = list.get(0);
    	
    	if (StringUtils.isBlank(constante.getValorconstante())){
    		return false;
    	}
    	
    	return constante.getValorconstante().equalsIgnoreCase("true");
    }
    
	@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
	public List<Constante> buscarPorNomeConstanteLike(String nombconstante) {
		return constanteDAO.buscarPorNomeConstanteLike(nombconstante);
	}

    @Override
    public String buscarURLAPI(){
    	Constante constante = constanteDAO.buscarPorNomeConstante(URL_API);
    	
    	if (constante == null) {
    		return "";
    	}
    	
    	return constante.getValorconstante();
    }
    @Override
    public String buscarURLAPIEmb(){
    	Constante constante = constanteDAO.buscarPorNomeConstante(URL_API_EMB);
    	
    	if (constante == null) {
    		return "";
    	}
    	
    	return constante.getValorconstante();
    }
    
    @Override
    public List<TipoOcupacion> BuscarTipoOcupacaoSemValidacao() {
    	Constante constante = constanteDAO.buscarPorNomeConstante(Constantes.TIPO_OCUPACAO_SEM_VALIDACAO);
    	
    	if (constante == null || StringUtils.isBlank(constante.getValorconstante())){
    		return null;
    	} 
    	
    	String[] tipos = constante.getValorconstante().split(",");
		
		List<TipoOcupacion> tiposOcupacaoSemValidacao = new ArrayList<TipoOcupacion>();
		
		for(String tipoOcupacaoId : tipos) {
			TipoOcupacion tipoOcupacao = tipoOcupacaoDAO.obtenerID(buscarValorShort(tipoOcupacaoId));
			
			if(tipoOcupacao != null) {
				tiposOcupacaoSemValidacao.add(tipoOcupacao);
			}
		}
    	
    	return tiposOcupacaoSemValidacao;
    }
    
    private Short buscarValorShort(String tipoOcupacaoId) {
		try {
			return Short.valueOf(tipoOcupacaoId);
		} catch (Exception e) {
			return null;
		}
	}

	@Override
	public Boolean buscarValorConstantePorNomeConstanteBoolean(String nomeConstante) {
		try {
			Constante constante = buscarPorNomeConstante(nomeConstante);
			if (constante != null) {
				return BooleanUtils.toBoolean(constante.getValorconstante());
			}
		} catch (Exception e) {
			log.error("", e);			
		}		
		return false;
	}
}
