package com.rjconsultores.ventaboletos.service.impl;

import java.math.BigDecimal;
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.PricingOcupaAntecipaDAO;
import com.rjconsultores.ventaboletos.entidad.Pricing;
import com.rjconsultores.ventaboletos.entidad.PricingOcupaAntecipa;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.PricingOcupaAntecipaService;
import com.rjconsultores.ventaboletos.utilerias.TraslaparUtil;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;

@Service("pricingOcupacionService")
public class PricingOcupaAntecipaServiceImpl implements PricingOcupaAntecipaService {

	private static final Logger log = LogManager.getLogger(PricingOcupaAntecipaServiceImpl.class);

	@Autowired
	private PricingOcupaAntecipaDAO pricingOcupacionDAO;

	@Transactional
	public PricingOcupaAntecipa suscribir(PricingOcupaAntecipa entidad) throws BusinessException {
		if (traslapa(entidad)) {
			throw new BusinessException("pricingOcupaAntecipaServiceImpl.msg.traslapa");
		}
		entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		entidad.setFecmodif(Calendar.getInstance().getTime());
		entidad.setActivo(Pricing.ATIVO);

		return pricingOcupacionDAO.suscribir(entidad);
	}

	@Transactional(rollbackFor = BusinessException.class)
	public PricingOcupaAntecipa actualizacion(PricingOcupaAntecipa entidad) throws BusinessException {
		if (traslapa(entidad)) {
			throw new BusinessException("pricingOcupaAntecipaServiceImpl.msg.traslapa");
		}
		entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		entidad.setFecmodif(Calendar.getInstance().getTime());
		entidad.setActivo(Pricing.ATIVO);

		return pricingOcupacionDAO.actualizacion(entidad);
	}

	@Transactional
	public void borrar(PricingOcupaAntecipa entidad) {
		entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		entidad.setFecmodif(Calendar.getInstance().getTime());
		entidad.setActivo(Pricing.EXCLUIDO);

		pricingOcupacionDAO.actualizacion(entidad);
	}
	
	public List<PricingOcupaAntecipa> updateList(PricingOcupaAntecipa pricingOcupaAntecipa) {
		List<PricingOcupaAntecipa> lsSalvos = pricingOcupacionDAO.buscarOcupaAntecipaPricing(pricingOcupaAntecipa.getPricing().getPricingId());
		return lsSalvos;
	}

	private boolean traslapa(PricingOcupaAntecipa pricingOcupaAntecipa) {
				
		boolean traslapa = false;
		List<PricingOcupaAntecipa> lsSalvos = pricingOcupacionDAO.buscarOcupaAntecipaPricing(pricingOcupaAntecipa.getPricing().getPricingId());

		// removo o pricing que eu estou validando
		lsSalvos.remove(pricingOcupaAntecipa);
		
		BigDecimal cantocupaini = pricingOcupaAntecipa.getOcupacioninicial();
		BigDecimal cantocupafin = pricingOcupaAntecipa.getOcupacionfinal();
		
		boolean validaCantPorcentaje = ((cantocupaini != null) && (cantocupafin != null));

		Integer cantasientosmin = pricingOcupaAntecipa.getCantasientosmin();
		Integer cantasientosmax = pricingOcupaAntecipa.getCantasientosmax();

		boolean validaCantAsientos = ((cantasientosmin != null) && (cantasientosmax != null));

		Integer cantdiasmin = pricingOcupaAntecipa.getCantdiasmin();
		Integer cantdiasmax = pricingOcupaAntecipa.getCantdiasmax();

		boolean validaCantDias = ((cantdiasmin != null) && (cantdiasmax != null));

		for (PricingOcupaAntecipa poa : lsSalvos) {
			boolean traslapaCantPorcentaje = false;
			if (validaCantPorcentaje) {
				if ((poa.getOcupacioninicial() != null) && (poa.getOcupacionfinal() != null)) {
					traslapaCantPorcentaje = TraslaparUtil.intersectNum(poa.getOcupacioninicial(), poa.getOcupacionfinal(), cantocupaini, cantocupafin);
				}
			}
			
			boolean traslapaCantAsiento = false;
			if (validaCantAsientos) {
				if ((poa.getCantasientosmin() != null) && (poa.getCantasientosmax() != null)) {
					traslapaCantAsiento = TraslaparUtil.intersectNum(poa.getCantasientosmin(), poa.getCantasientosmax(), cantasientosmin, cantasientosmax);
				}
			}

			boolean traslapaCantDias = false;
			if (validaCantDias) {
				if ((poa.getCantdiasmin() != null) && (poa.getCantdiasmax() != null)) {
					traslapaCantDias = TraslaparUtil.intersectNum(poa.getCantdiasmin(), poa.getCantdiasmax(), cantdiasmin, cantdiasmax);
				}
			}			

			if ((traslapaCantPorcentaje || traslapaCantAsiento ) && traslapaCantDias  ){
				log.info("registro que traslapa PricingOcupaAntecipa id =" + poa.getPricingocupaantecipaId());

				traslapa = true;

				break;
			}
			
		}

		return traslapa;
	}

	@Override
	@Transactional
	public void borrar(List<PricingOcupaAntecipa> pricingOcupaAntecipas) {
		if(pricingOcupaAntecipas != null && !pricingOcupaAntecipas.isEmpty()) {
			for (PricingOcupaAntecipa pricingOcupaAntecipa : pricingOcupaAntecipas) {
				borrar(pricingOcupaAntecipa);
			}
		}
	}
}
