package com.rjconsultores.ventaboletos.service.impl;

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.ConexionCtrlDAO;
import com.rjconsultores.ventaboletos.dao.ConexionRutaCtrlDAO;
import com.rjconsultores.ventaboletos.dao.ConexionRutaTramoCtrlDAO;
import com.rjconsultores.ventaboletos.entidad.Conexion;
import com.rjconsultores.ventaboletos.entidad.ConexionConf;
import com.rjconsultores.ventaboletos.entidad.ConexionCtrl;
import com.rjconsultores.ventaboletos.entidad.ConexionDescuento;
import com.rjconsultores.ventaboletos.entidad.ConexionRutaCtrl;
import com.rjconsultores.ventaboletos.entidad.ConexionRutaTramoCtrl;
import com.rjconsultores.ventaboletos.entidad.PricingConexao;
import com.rjconsultores.ventaboletos.service.ConexionConfService;
import com.rjconsultores.ventaboletos.service.ConexionCtrlService;
import com.rjconsultores.ventaboletos.service.ConexionService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.vo.parada.ParadaVOConexionRuta;

@Service("conexionCtrlService")
public class ConexionCtrlServiceImpl implements ConexionCtrlService {
	@Autowired
	private ConexionCtrlDAO conexionCtrlDAO;
	@Autowired
	private ConexionService conexionService;
	@Autowired
	private ConexionConfService conexionConfDAO;
	@Autowired
	private ConexionRutaTramoCtrlDAO conexionRutaTramoCtrlDAO;
	@Autowired
	private ConexionRutaCtrlDAO conexionRutaCtrlDAO;


	public List<ConexionCtrl> obtenerTodos() {
		return conexionCtrlDAO.obtenerTodos();
	}

	public ConexionCtrl obtenerID(Long id) {
		return conexionCtrlDAO.obtenerID(id);
	}

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

		return conexionCtrlDAO.suscribir(entidad);
	}

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

		return conexionCtrlDAO.actualizacion(entidad);
	}

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

		List<Conexion> lsConexion = conexionService.buscarPorConexionCtrl(entidad.getConexionctrlId());
		for (Conexion conexion : lsConexion) {
			conexionService.borrar(conexion);
			
			if(conexion.getRutaId() != null) {
				borrarConexionRuta(conexion);					
			}
		}

		List<ConexionConf> lsConexionConf = conexionConfDAO.buscarPorConexionCtrl(entidad);
		for (ConexionConf conexionConf : lsConexionConf) {
			conexionConfDAO.borrar(conexionConf);
		}

		conexionCtrlDAO.actualizacion(entidad);
	}

	@Transactional
	private void borrarConexionRuta(Conexion conexion) {
		
		ConexionRutaCtrl conexionRutaCtrl = null;
		
		if(conexion.getConexionRutaTramoId() != null) {
			ConexionRutaTramoCtrl conexionRutaTramoCtrl = conexionRutaTramoCtrlDAO.obtenerID(conexion.getConexionRutaTramoId());
			conexionRutaTramoCtrl.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			conexionRutaTramoCtrl.setFecmodif(Calendar.getInstance().getTime());
			conexionRutaTramoCtrl.setActivo(Boolean.FALSE);
			conexionRutaTramoCtrlDAO.actualizacion(conexionRutaTramoCtrl); 	
			
			conexionRutaCtrl = conexionRutaTramoCtrl.getConexionRutaCtrl();
			conexionRutaCtrl.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			conexionRutaCtrl.setFecmodif(Calendar.getInstance().getTime());
			conexionRutaCtrl.setActivo(Boolean.FALSE);				
			conexionRutaCtrlDAO.actualizacion(conexionRutaCtrl);
		}
		
	}

	@Override
	public List<ConexionCtrl> buscarConexionesCtrl(Integer origenId, Integer destinoId) {
		return conexionCtrlDAO.buscarConexionesCtrl(origenId, destinoId);
	}
	
	@Override
	@Transactional
	public void suscribirTodos(List<ConexionCtrl> conexionCtrlList) {
		for (ConexionCtrl conexionCtrl : conexionCtrlList) {
			conexionCtrl.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			conexionCtrl.setFecmodif(Calendar.getInstance().getTime());
			conexionCtrl.setActivo(true);
		}
		conexionCtrlDAO.suscribirTodos(conexionCtrlList);
	}
	
	@Override
	public List<ConexionCtrl> buscarTodasConexionesCtrlPricing() {
		return conexionCtrlDAO.buscarTodasConexionesCtrlPricing();
	}
	
	@Override
	public List<ParadaVOConexionRuta> carregarConexoesCadastradas(Long conexionctrlId) {
		return conexionCtrlDAO.carregarConexoesCadastradas(conexionctrlId);
	}
	
	@Override
	public List<ParadaVOConexionRuta> carregarConexoesCadastradas(Integer origenId, Integer destinoId, Long conexionctrlId) {
		return conexionCtrlDAO.carregarConexoesCadastradas(origenId, destinoId, conexionctrlId);
	}
	
	public void limparPesquisaPricingConexao(Integer pricingId) {
		conexionCtrlDAO.limparPesquisaPricingConexao(pricingId);
	}
}
