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

import java.math.BigDecimal;
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.CategoriaCtrlDAO;
import com.rjconsultores.ventaboletos.dao.CategoriaDAO;
import com.rjconsultores.ventaboletos.dao.ConstanteDAO;
import com.rjconsultores.ventaboletos.entidad.Categoria;
import com.rjconsultores.ventaboletos.entidad.CategoriaClase;
import com.rjconsultores.ventaboletos.entidad.CategoriaCorrida;
import com.rjconsultores.ventaboletos.entidad.CategoriaCtrl;
import com.rjconsultores.ventaboletos.entidad.CategoriaDescuento;
import com.rjconsultores.ventaboletos.entidad.CategoriaMarca;
import com.rjconsultores.ventaboletos.entidad.CategoriaMercado;
import com.rjconsultores.ventaboletos.entidad.CategoriaPeriodo;
import com.rjconsultores.ventaboletos.entidad.Constante;
import com.rjconsultores.ventaboletos.service.CategoriaCtrlService;
import com.rjconsultores.ventaboletos.service.LogAuditoriaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;

/**
 *
 * @author Administrador
 */
@Service("categoriaCtrlService")
public class CategoriaCtrlServiceImpl implements CategoriaCtrlService {

	public static final int CATEGORIA_ADULTO = 1;
	private static final String CVE_SISTEMA_CATEGORIA_FIDELIDADE = "FIDELIDADE";
	private static final String CONSTANTE_URL_WS_FIDELIDADE = "URL_WS_FIDELIDADE";
	private static final String CONSTANTE_SENHA_WS_FIDELIDADE = "SENHA_WS_FIDELIDADE";
	private static final String CONSTANTE_USUARIO_WS_FIDELIDADE = "USUARIO_WS_FIDELIDADE";	
	private static final int CANT_MAX_CATEGORIA_ADULTO = 200;
	@Autowired
	private CategoriaCtrlDAO categoriaCtrlDAO;
	@Autowired
	private CategoriaDAO categoriaDAO;
	
	@Autowired
	private ConstanteDAO constanteDAO;
	@Autowired
	private LogAuditoriaService logAuditoriaService;
	private static Logger log = LogManager.getLogger(CategoriaCtrlServiceImpl.class);

	@Override
	public CategoriaCtrl obtenerID(Integer id) {
		
		return categoriaCtrlDAO.obtenerID(id);

	}

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

		entidad =  categoriaCtrlDAO.suscribir(entidad);
		logAuditoriaService.auditar(null, entidad, entidad.getEmpresa() != null ? entidad.getEmpresa().getEmpresaId() : null);
		
		return entidad;
	}

	/**
	 * Verifica se existe la categoria adulto. Sino existe, la adicciona.
	 *
	 * @param categoriaCtrl
	 */
	@Override
	public CategoriaCtrl checarCategoriaAdulto(CategoriaCtrl categoriaCtrl, Boolean rdVendeAbertoSim, Boolean chkCancelaEmAberto, Boolean chkDevolveEmAberto, Boolean chkCancelaEmergencialEmAberto, Boolean chkTrocaTiturlidadeEmAberto, Boolean chkTrocaEmAberto) {
		boolean existeAdulto = false;
		List<CategoriaDescuento> lsCategorias = new ArrayList<CategoriaDescuento>();
		lsCategorias.addAll(categoriaCtrl.getCategoriaDescuentoList());

		for (CategoriaDescuento cd : categoriaCtrl.getCategoriaDescuentoList()) {
			if (cd.getCategoria().getCategoriaId().equals(CATEGORIA_ADULTO)) {
				existeAdulto = true;
			}
		}
		if (!existeAdulto) {
			CategoriaDescuento categoriaDescuentoAdulto = this.getCategoriaDescuentoAdulto(categoriaCtrl);
			
			categoriaDescuentoAdulto.setIndVentaAbierto(rdVendeAbertoSim);
			
			if(rdVendeAbertoSim) {
				//Aberto Vendido
				categoriaDescuentoAdulto.setIndCancelaEmAberto(chkCancelaEmAberto);
				categoriaDescuentoAdulto.setIndDevolveEmAberto(chkDevolveEmAberto);
				categoriaDescuentoAdulto.setIndCancelaEmergencialEmAberto(chkCancelaEmergencialEmAberto);
				categoriaDescuentoAdulto.setIndTrocaTitularidadeEmAberto(chkTrocaTiturlidadeEmAberto);
				categoriaDescuentoAdulto.setIndTrocaEmAberto(chkTrocaEmAberto);
			} else {
				categoriaDescuentoAdulto.setIndCancelaEmAberto(false);
				categoriaDescuentoAdulto.setIndDevolveEmAberto(false);
				categoriaDescuentoAdulto.setIndCancelaEmergencialEmAberto(false);
				categoriaDescuentoAdulto.setIndTrocaTitularidadeEmAberto(false);
				categoriaDescuentoAdulto.setIndTrocaEmAberto(false);
			}
			
			lsCategorias.add(categoriaDescuentoAdulto);
		}
		categoriaCtrl.setCategoriaDescuentoList(lsCategorias);
		return categoriaCtrl;
	}

	@Override
	@Transactional
	public CategoriaCtrl actualizacion(CategoriaCtrl entidad) {
		
		CategoriaCtrl originalClone = null;
		try {
			originalClone = entidad.getCloneObject();

		} catch (Exception e) {
			log.error("Erro ao clonar CategoriaCtrl:  ",e);
		}
		
		entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		entidad.setFecmodif(Calendar.getInstance().getTime());
		entidad.setActivo(Boolean.TRUE);
		entidad = categoriaCtrlDAO.actualizacion(entidad);	
		logAuditoriaService.auditar(originalClone, entidad, entidad.getEmpresa() != null ? entidad.getEmpresa().getEmpresaId() : null);
		
		return entidad;
		
	}

	@Override
	@Transactional
	public void borrar(CategoriaCtrl entidad) {

		for (CategoriaClase cc : entidad.getCategoriaClaseList()) {
			cc.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			cc.setFecmodif(Calendar.getInstance().getTime());
			cc.setActivo(Boolean.FALSE);
		}
		for (CategoriaCorrida cc : entidad.getCategoriaCorridaList()) {
			cc.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			cc.setFecmodif(Calendar.getInstance().getTime());
			cc.setActivo(Boolean.FALSE);
		}
		for (CategoriaDescuento cc : entidad.getCategoriaDescuentoList()) {
			cc.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			cc.setFecmodif(Calendar.getInstance().getTime());
			cc.setActivo(Boolean.FALSE);
		}
		for (CategoriaMarca cc : entidad.getCategoriaMarcaList()) {
			cc.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			cc.setFecmodif(Calendar.getInstance().getTime());
			cc.setActivo(Boolean.FALSE);
		}
		for (CategoriaMercado cc : entidad.getCategoriaMercadoList()) {
			cc.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			cc.setFecmodif(Calendar.getInstance().getTime());
			cc.setActivo(Boolean.FALSE);
		}

		entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		entidad.setFecmodif(Calendar.getInstance().getTime());
		entidad.setActivo(Boolean.FALSE);

		categoriaCtrlDAO.actualizacion(entidad);
		logAuditoriaService.auditarExclusao(entidad, entidad.getEmpresa() != null ? entidad.getEmpresa().getEmpresaId() : null);		

	}

	private CategoriaDescuento getCategoriaDescuentoAdulto(CategoriaCtrl categoriaCtrl) {
		CategoriaDescuento cd = new CategoriaDescuento();
		cd.setActivo(Boolean.TRUE);
		cd.setCantautorizada(CANT_MAX_CATEGORIA_ADULTO);
		cd.setCategoria(categoriaDAO.obtenerID(CATEGORIA_ADULTO));
		cd.setDescuentoimporte(BigDecimal.ZERO);
		cd.setDescuentoporc(BigDecimal.ZERO);

		CategoriaPeriodo cp = new CategoriaPeriodo();
		cp.setActivo(Boolean.TRUE);
		cp.setCategoriaDescuento(cd);

		Calendar datFin = Calendar.getInstance();
		datFin.set(2300, 11, 31);

		Calendar datInicio = Calendar.getInstance();
		datInicio.set(2000, 11, 31);

		cp.setFecfin(datFin.getTime());
		cp.setFecinicio(datInicio.getTime());

		cp.setFecmodif(new java.util.Date());
		cp.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

		List<CategoriaPeriodo> lsCatPeriodo = new ArrayList<CategoriaPeriodo>();
		lsCatPeriodo.add(cp);

		cd.setCategoriaPeriodoList(lsCatPeriodo);
		cd.setCategoriaCtrl(categoriaCtrl);
		cd.setFecmodif(new java.util.Date());
		cd.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

		cd.setIndAplicaFeriado(CategoriaDescuento.DisponibilidadeFeriado.GERARSEMPRE.valor());
		cd.setIndImporteOutros(true);
		cd.setIndImportePedagio(true);
		cd.setIndImporteSeguro(true);
		cd.setIndImporteTxEmbarque(true);

		return cd;
	}
	
	@Override
	public boolean validaCategoriaProgramaFidelidade(Categoria categoria){
		
		if(categoria.getCvesistema() != null && categoria.getCvesistema().equals(CVE_SISTEMA_CATEGORIA_FIDELIDADE)){
			Constante url = constanteDAO.buscarPorNomeConstante(CONSTANTE_URL_WS_FIDELIDADE);
			Constante usuario = constanteDAO.buscarPorNomeConstante(CONSTANTE_USUARIO_WS_FIDELIDADE);
			Constante senha = constanteDAO.buscarPorNomeConstante(CONSTANTE_SENHA_WS_FIDELIDADE);
			
			if(url == null || url.getValorconstante() == null || url.getValorconstante().isEmpty() ||
					usuario == null || usuario.getValorconstante() == null || usuario.getValorconstante().isEmpty() ||
							senha == null || senha.getValorconstante() == null || senha.getValorconstante().isEmpty()){
				
				return Boolean.FALSE;
			}
		}
		
		return Boolean.TRUE;
	}
}
