package com.rjconsultores.ventaboletos.service.impl;

import java.util.Calendar;
import java.util.Collections;
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.AliasServicoDAO;
import com.rjconsultores.ventaboletos.entidad.AliasServico;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.AliasServicoService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;

@Service("aliasServicoService")
public class AliasServicoServiceImpl implements AliasServicoService {

	@Autowired
	private AliasServicoDAO aliasServicoDAO;

	public List<AliasServico> obtenerTodos() {
		return aliasServicoDAO.obtenerTodos();
	}

	public AliasServico obtenerID(Integer id) {
		return aliasServicoDAO.obtenerID(id);
	}

	@Transactional
	public AliasServico suscribirActualizar(AliasServico entidad) throws BusinessException {
		
		if ( (entidad.getOrigen() == null) || (entidad.getDestino() == null) || (entidad.getAliasDestino()== null) || (entidad.getAliasOrigen()== null)  || (entidad.getRuta()== null)){
			throw new BusinessException("editarAliasServicoController.MSG.camposObrigatorios");
		}
		
		List<AliasServico> lsBusca  = Collections.emptyList();
		
		if (entidad.getCorridaId() != null){		
			lsBusca = aliasServicoDAO.buscar(entidad.getOrigen().getParadaId(), entidad.getDestino().getParadaId(), entidad.getRuta().getRutaId(), entidad.getCorridaId());
		}else{
			lsBusca = aliasServicoDAO.buscarAliasSemCorrida(entidad.getOrigen().getParadaId(), entidad.getDestino().getParadaId(), entidad.getRuta().getRutaId());
		}
		
		if (!lsBusca.isEmpty()){
			boolean existe = false;
			
			for(AliasServico as : lsBusca){
				if (as.equals(entidad)){
					existe = true;		
				}
			}
			
			if (!existe){
				throw new BusinessException("editarAliasServicoController.MSG.registroYaExiste");
			}
		}
		
		entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		entidad.setFecmodif(Calendar.getInstance().getTime());
		entidad.setActivo(Boolean.TRUE);

		if (entidad.getAliasServicoId() == null){
			return aliasServicoDAO.suscribir(entidad);
		}else{
			return aliasServicoDAO.actualizacion(entidad);
		}
	}

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

		aliasServicoDAO.actualizacion(entidad);
	}
	
	@Override
	public List<AliasServico> buscarPorRuta(Integer rutaId) {
		return aliasServicoDAO.buscarPorRuta(rutaId);
	}

	@Override
	public List<AliasServico> buscarPorLinhaEmpresa(List<Ruta> linhas, List<Empresa> empresas, List<ClaseServicio> tiposClasses, List<OrgaoConcedente> orgaos, String prefixo) {
		return aliasServicoDAO.buscarPorLinhaEmpresa(linhas, empresas, tiposClasses, orgaos, prefixo);
	}

	@Override
	public AliasServico existe(Parada origem, Parada destino, Ruta linha, Integer idCorrida) {
		return aliasServicoDAO.existe(origem, destino, linha, idCorrida);
	}
}
