/*
 * 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.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.rjconsultores.ventaboletos.dao.PerfilDAO;
import com.rjconsultores.ventaboletos.entidad.Perfil;
import com.rjconsultores.ventaboletos.entidad.PerfilFuncion;
import com.rjconsultores.ventaboletos.entidad.UsuarioPerfil;
import com.rjconsultores.ventaboletos.service.PerfilService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;

/**
 * 
 * @author rodrigo
 */
@Service("perfilService")
public class PerfilServiceImpl implements PerfilService {

	@Autowired
	private PerfilDAO perfilDAO;

	public List<Perfil> obtenerTodos() {
		return perfilDAO.obtenerTodos();
	}

	public Perfil obtenerID(Integer id) {
		return perfilDAO.obtenerID(id);
	}

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

		return perfilDAO.suscribir(entidad);
	}

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

		return perfilDAO.actualizacion(entidad);
	}

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

		perfilDAO.actualizacion(entidad);
	}

	public List<Perfil> buscar(String dscPerfil) {
		return perfilDAO.buscar(dscPerfil);
	}

	public List<Perfil> buscaPerfilJerarquia(Perfil perfilUsuario) {
		return perfilDAO.buscaPerfilJerarquia(perfilUsuario);
	}
	
	@Transactional
	public Boolean clonarPerfil(Integer perfilId, String nomePerfil) {

		Perfil perfil = this.obtenerID(perfilId);
		Perfil clonePerfil = new Perfil();

		clonePerfil.setDescperfil(nomePerfil);
		
//		clonePerfil.setActivo(perfil.getActivo()); o método actualizacion ja seta os campos activo usuario e fecmodif
		clonePerfil.setIndJerarquia(perfil.getIndJerarquia());
		clonePerfil.setPerfilFuncionList(new ArrayList<PerfilFuncion>());
		clonePerfil.setUsuarioPerfilList(new ArrayList<UsuarioPerfil>());
		
		
		clonePerfil = suscribir(clonePerfil);
		
		clonePerfil = percorrerPerfilAtivoParaClonar(perfil, clonePerfil);


		actualizacion(clonePerfil);

//		inativar(clonePricing);

		if (clonePerfil.getPerfilId() != null) {
			return true;
		} else {
			return false;
		}
	}
	
	private Perfil percorrerPerfilAtivoParaClonar(Perfil perfil, Perfil clonePerfil) {

		List<UsuarioPerfil> usuarioPerfilList = new ArrayList<UsuarioPerfil>();
		for(UsuarioPerfil usuarioPerfil : perfil.getUsuarioPerfilList()){
			UsuarioPerfil cloneUsuarioPerfil = new UsuarioPerfil();
			cloneUsuarioPerfil.setActivo(usuarioPerfil.getActivo());
			cloneUsuarioPerfil.setFecmodif(Calendar.getInstance().getTime());
			cloneUsuarioPerfil.setPerfil(clonePerfil);
			cloneUsuarioPerfil.setUsuario(usuarioPerfil.getUsuario());
			cloneUsuarioPerfil.setUsuariomodifId(usuarioPerfil.getUsuariomodifId());
			cloneUsuarioPerfil.setUsuarioperfilId(usuarioPerfil.getUsuarioperfilId());
			usuarioPerfilList.add(cloneUsuarioPerfil);
		}
		clonePerfil.setUsuarioPerfilList(usuarioPerfilList);
		
		List<PerfilFuncion> perfilFuncionList = new  ArrayList<PerfilFuncion>();
		for(PerfilFuncion perfilFuncion : perfil.getPerfilFuncionList()){
			PerfilFuncion clonePerfilFuncion = new PerfilFuncion();
			clonePerfilFuncion.setActivo(perfilFuncion.getActivo());
			clonePerfilFuncion.setFecmodif(Calendar.getInstance().getTime());
			clonePerfilFuncion.setFuncionSistema(perfilFuncion.getFuncionSistema());
			clonePerfilFuncion.setIndLectura(perfilFuncion.getIndLectura());
			clonePerfilFuncion.setPerfil(clonePerfil);
			clonePerfilFuncion.setUsuarioId(perfilFuncion.getUsuarioId());
			perfilFuncionList.add(clonePerfilFuncion);
		}
		clonePerfil.setPerfilFuncionList(perfilFuncionList);

		return clonePerfil;
	}
}
