/*
 * 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.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.Transactional;

import com.rjconsultores.ventaboletos.dao.CategoriaDAO;
import com.rjconsultores.ventaboletos.entidad.Categoria;
import com.rjconsultores.ventaboletos.entidad.CategoriaCtrl;
import com.rjconsultores.ventaboletos.service.CategoriaService;
import com.rjconsultores.ventaboletos.service.LogAuditoriaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;

/**
 *
 * @author Administrador
 */
@Service("categoriaService")
public class CategoriaServiceImpl implements CategoriaService {

    @Autowired
    private CategoriaDAO categoriaDAO;
	private static Logger log = LogManager.getLogger(CategoriaServiceImpl.class);
	@Autowired
	private LogAuditoriaService logAuditoriaService;


    public List<Categoria> obtenerTodos() {
        return categoriaDAO.obtenerTodos();
    }

    public Categoria obtenerID(Integer id) {
    	
    	Categoria categoria = categoriaDAO.obtenerID(id);
		try {
			categoria.clonar();
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		return categoria;


    }

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

        entidad = categoriaDAO.suscribir(entidad);
		logAuditoriaService.auditar(null, entidad, null);
		
		logAuditoriaService.auditar(null, entidad, null);
		return entidad;

    }

    @Transactional
    public Categoria actualizacion(Categoria entidad) {
    	
    	Categoria originalClone = null;
		try {
			originalClone = entidad.getCloneObject();
		} catch (Exception e) {
			log.error("Erro ao clonar TitularId",e);
		}
        entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
        entidad.setFecmodif(Calendar.getInstance().getTime());
        entidad.setActivo(Boolean.TRUE);

		entidad = categoriaDAO.actualizacion(entidad);	
		logAuditoriaService.auditar(originalClone, entidad, null);
		return entidad;
    }

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

        categoriaDAO.actualizacion(entidad);
    }

    public List<Categoria> buscar(String desccategoria) {
        return categoriaDAO.buscar(desccategoria);
    }

	@Override
	public List<Categoria> buscarCategoriaPesquisada(String desccategoria) {
		return categoriaDAO.buscarCategoriaPesquisada(desccategoria);
	}

    public List<Categoria> obtenerTodasCategoriasVisibles() {
        List<Categoria> listCategoriasVisibles = new ArrayList<Categoria>();
        List<Categoria> lsCategorias = obtenerTodos();

        for (Categoria c : lsCategorias) {
            boolean esVisible = true;
            for (Integer id : CategoriaCtrl.idsCategoriasNoVisible) {
                if (id.equals(c.getCategoriaId())) {
                    esVisible = false;
                }
            }
            if (esVisible) {
                listCategoriasVisibles.add(c);
            }

        }
        return listCategoriasVisibles;
    }

	@Override
	public Categoria buscarUmaCategoria(String desccategoria) {
		List<Categoria> categoriaList = buscar(desccategoria);
		if (categoriaList.isEmpty()) {
			return null;
		}
		return categoriaList.get(0);
	}

	@Override
	public List<Categoria> buscarCategoriaOrgaoConcedente(String orgaoConcedente) {
		List<Categoria> listCategorias = new ArrayList<Categoria>();
		List<String> categoriaList = categoriaDAO.buscarCategoriaOrgaoConcedente(orgaoConcedente);
		int listSize = categoriaList.size();
		
		  for (int c =0; c<listSize ; c++  ) {
			  Categoria categoriaTemp = buscarUmaCategoria(categoriaList.get(c));
			  listCategorias.add(categoriaTemp);
		  }
		
		return listCategorias;
	}		
}
