package com.rjconsultores.ventaboletos.service.impl;

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

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.ConfRestricaoCanalVentaDAO;
import com.rjconsultores.ventaboletos.entidad.ConfRestricaoCanalVenta;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.ConfRestricaoCanalVentaService;
import com.rjconsultores.ventaboletos.service.LogAuditoriaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;

@Service("confRestricaoCanalVentaService")
public class ConfRestricaoCanalVentaServiceImpl implements ConfRestricaoCanalVentaService {
	
	@Autowired
	private ConfRestricaoCanalVentaDAO confRestricaoCanalVentaDAO;
	@Autowired
	private LogAuditoriaService logAuditoriaService;
	private static Logger log = LogManager.getLogger(ConfRestricaoCanalVentaServiceImpl.class);


	public ConfRestricaoCanalVenta obtenerID(Long id) {
		return confRestricaoCanalVentaDAO.obtenerID(id);
	}

	@Transactional
	@Override
	public ConfRestricaoCanalVenta suscribirActualizar(ConfRestricaoCanalVenta entidad) throws BusinessException {
		
		entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		entidad.setFecmodif(Calendar.getInstance().getTime());
		entidad.setActivo(Boolean.TRUE);
		
		ConfRestricaoCanalVenta originalClone = null;
		try {
			originalClone = entidad.getCloneObject();

		} catch (Exception e) {
			log.error("Erro ao clonar CategoriaCtrl:  ",e);
		}
		
		if (entidad.getConfRestricaoCanalVentaId() == null){
			confRestricaoCanalVentaDAO.suscribir(entidad);
			logAuditoriaService.auditar(null, entidad, entidad.getEmpresa() != null ? entidad.getEmpresa().getEmpresaId() : null);
			return entidad;
		}else{
			confRestricaoCanalVentaDAO.actualizacion(entidad);
			logAuditoriaService.auditar(originalClone, entidad, entidad.getEmpresa() != null ? entidad.getEmpresa().getEmpresaId() : null);
			return entidad;
		}
	}
	@Transactional
	public void borrar(ConfRestricaoCanalVenta entidad) {
		entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		entidad.setFecmodif(Calendar.getInstance().getTime());
		entidad.setActivo(Boolean.FALSE);

		confRestricaoCanalVentaDAO.actualizacion(entidad);
		logAuditoriaService.auditarExclusao(entidad, entidad.getEmpresa() != null ? entidad.getEmpresa().getEmpresaId() : null);	
	}
	
	
	@Override
	public void borrarList(Set<ConfRestricaoCanalVenta> confRestricaoCanalVentaSelecionadas) {
		List<Integer> listConfRestricaoCanalVentaIds =retornarListConfRestricaoCanalVentaIds(confRestricaoCanalVentaSelecionadas);
		confRestricaoCanalVentaDAO.inativarListConfRestricaoCanalVenta(listConfRestricaoCanalVentaIds, UsuarioLogado.getUsuarioLogado().getUsuarioId());
	}
	
	
	private List<Integer> retornarListConfRestricaoCanalVentaIds(Set<ConfRestricaoCanalVenta> ConfRestricaoCanalVentaSelecionadas) {
		List<Integer> listConfRestricaoCanalVentaIds = new ArrayList<Integer>();
		for (ConfRestricaoCanalVenta c : ConfRestricaoCanalVentaSelecionadas) {
			listConfRestricaoCanalVentaIds.add(c.getConfRestricaoCanalVentaId().intValue());
		}
		return listConfRestricaoCanalVentaIds;
	}
	
	@SuppressWarnings("unused")
	private boolean isBloqueoExistente(ConfRestricaoCanalVenta c , List<ConfRestricaoCanalVenta> confRestricaoCanalVentaList){
		
		List<ConfRestricaoCanalVenta> ls = new ArrayList<ConfRestricaoCanalVenta>() ;
		
		for (int i = 0;  i < confRestricaoCanalVentaList.size(); i++){
			ConfRestricaoCanalVenta elementList = (ConfRestricaoCanalVenta)confRestricaoCanalVentaList.get(i);
			if(c.getConfRestricaoCanalVentaId() == null){
				if(isConfRestricaoCanalVentasEquivalentes(c , elementList)){
					return true;
				}
			}else{
				if(!c.getConfRestricaoCanalVentaId().equals(elementList.getConfRestricaoCanalVentaId())){
					isConfRestricaoCanalVentasEquivalentes(c , elementList);
				}else{
					continue;
				}
			}
		}
		return false;
	}
	
	private boolean isConfRestricaoCanalVentasEquivalentes(ConfRestricaoCanalVenta a , ConfRestricaoCanalVenta b){
		if(isRutasTipoPvCorridaIdOrigemDestinoEquivalentes(a,b)
				&& (((a.getFecCorrida() != null) != (b.getFecCorrida() != null)) ? false : true)
				&& ((a.getFecCorrida() != null ) &&  (b.getFecCorrida() != null) ? true : false )
				&& ((((a.getFecCorrida().compareTo(b.getFecCorrida())) == 0)) ?  true   : false  )
				&& isIntercessaoDiasSemana(a,b)
				){
			return true;
		}else if(isRutasTipoPvCorridaIdOrigemDestinoEquivalentes(a,b)
				&& ((a.getFecCorrida() == null) ) &&  ( (b.getFecCorrida() == null) )
				&& isIntercessaoDiasSemana(a,b)
				){
			return true;
		}
		return false;
	}
	
	private boolean isRutasTipoPvCorridaIdOrigemDestinoEquivalentes(ConfRestricaoCanalVenta a , ConfRestricaoCanalVenta b){
		if(isRutasEquivalentes(a,b) 
				&& isTipoPVEquivalentes(a,b) 
				&& isCorridaIdEquivalentes(a,b) 
				&& isOrigemEquivalentes(a,b) 
				&& isDestinoEquivalentes(a,b)){
			return true;
		}else{
			return false;
		}
	}
	
	private boolean isRutasEquivalentes(ConfRestricaoCanalVenta a , ConfRestricaoCanalVenta b){
		if(a.getRuta() == null && b.getRuta() == null ){
			return true;
		}
		if(a.getRuta() == null && b.getRuta() != null ){
			return false;
		}
		if(a.getRuta() != null && b.getRuta() == null ){
			return false;
		}
		if(a.getRuta() != null && b.getRuta() != null ){
			return a.getRuta().equals(b.getRuta());
		}
		return false;
	}
	
	private boolean isTipoPVEquivalentes(ConfRestricaoCanalVenta a , ConfRestricaoCanalVenta b){
		if(a.getTipoPuntoVenta() == null && b.getTipoPuntoVenta() == null ){
			return true;
		}
		if(a.getTipoPuntoVenta() == null && b.getTipoPuntoVenta() != null ){
			return false;
		}
		if(a.getTipoPuntoVenta() != null && b.getTipoPuntoVenta() == null ){
			return false;
		}
		if(a.getTipoPuntoVenta() != null && b.getTipoPuntoVenta() != null ){
			return a.getTipoPuntoVenta().equals(b.getTipoPuntoVenta());
		}
		return false;
	}
	
	private boolean isCorridaIdEquivalentes(ConfRestricaoCanalVenta a , ConfRestricaoCanalVenta b){
		if(a.getCorridaId() == null && b.getCorridaId() == null ){
			return true;
		}
		if(a.getCorridaId() == null && b.getCorridaId() != null ){
			return false;
		}
		if(a.getCorridaId() != null && b.getCorridaId() == null ){
			return false;
		}
		if(a.getCorridaId() != null && b.getCorridaId() != null ){
			return a.getCorridaId().equals(b.getCorridaId());
		}
		return false;
	}
	
	private boolean isOrigemEquivalentes(ConfRestricaoCanalVenta a , ConfRestricaoCanalVenta b){
		if(a.getOrigem() == null && b.getOrigem() == null ){
			return true;
		}
		if(a.getOrigem() == null && b.getOrigem() != null ){
			return false;
		}
		if(a.getOrigem() != null && b.getOrigem() == null ){
			return false;
		}
		if(a.getOrigem() != null && b.getOrigem() != null ){
			return a.getOrigem().equals(b.getOrigem());
		}
		return false;
	}
	
	private boolean isDestinoEquivalentes(ConfRestricaoCanalVenta a , ConfRestricaoCanalVenta b){
		if(a.getDestino() == null && b.getDestino() == null ){
			return true;
		}
		if(a.getDestino() == null && b.getDestino() != null ){
			return false;
		}
		if(a.getDestino() != null && b.getDestino() == null ){
			return false;
		}
		if(a.getDestino() != null && b.getDestino() != null ){
			return a.getDestino().equals(b.getDestino());
		}
		return false;
	}
	
	private boolean isIntercessaoDiasSemana(ConfRestricaoCanalVenta a , ConfRestricaoCanalVenta b){
		if( ((a.getDomingo() != null ? a.getDomingo() : false) && (b.getDomingo() != null ? b.getDomingo() : false ))
				|| (a.getSegunda()!= null ? a.getSegunda() : false) && (b.getSegunda() != null ? b.getSegunda() : false) 
				|| (a.getTerca() != null ? a.getTerca() : false ) && (b.getTerca() != null ? b.getTerca() : false)
				|| (a.getQuarta()!= null ? a.getQuarta() : false ) && (b.getQuarta() != null ? b.getQuarta() : false)
				|| (a.getQuinta() != null ? a.getQuinta() : false) && (b.getQuinta() != null ? b.getQuinta() : false)
				|| (a.getSexta() != null ? a.getSexta() : false) && (b.getSexta() != null ? b.getSexta() : false )
				|| (a.getSabado() != null ? a.getSabado() : false ) && (b.getSabado() != null ? b.getSabado() : false) ){
			return true;
		}
		if(null == a.getSegunda()
			&&	null == b.getSegunda()
			&&	null == a.getTerca()
			&&	null == b.getTerca()
			&&	null == a.getQuarta()
			&&	null == b.getQuarta()
			&&	null == a.getQuinta()
			&&	null == b.getQuinta()
			&&	null == a.getSexta()
			&&	null == b.getSexta()
			&&	null == a.getSabado()
			&&	null == b.getSabado()
			&&	null == a.getDomingo()
			&&	null == b.getDomingo()){
			return true;
		}
		
		return false;
	}

}
