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

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

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.rjconsultores.ventaboletos.dao.ParadaDAO;
import com.rjconsultores.ventaboletos.dao.TramoDAO;
import com.rjconsultores.ventaboletos.entidad.AgrupamentoParada;
import com.rjconsultores.ventaboletos.entidad.Ciudad;
import com.rjconsultores.ventaboletos.entidad.Nodo;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.RegionMetropolitana;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.TipoParada;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.ParadaService;
import com.rjconsultores.ventaboletos.utilerias.RegistroConDependenciaException;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.vo.parada.ParadaVO;

/**
 * 
 * @author Administrador
 */
@Service("paradaService")
public class ParadaServiceImpl implements ParadaService {

	private static final int MAX_ANTT = 99999;

	@Autowired
	private ParadaDAO paradaDAO;
	
	@Autowired
	private TramoDAO tramoDAO;

	public Parada obtenerID(Integer id) {
		return paradaDAO.obtenerID(id);
	}

	@Transactional
	public Parada suscribirActualizar(Parada entidad) throws BusinessException {

		Integer antt = entidad.getCodantt() != null ? entidad.getCodantt() : null;
		if (antt != null) {
			if (antt.equals(MAX_ANTT)) {
				throw new BusinessException("editarCatalogoDeParadaController.MSG.maxAntt");
			}
		}

		List<Parada> lsParadas = paradaDAO.buscar(entidad.getCodantt());

		if (!lsParadas.isEmpty()) {
			if (entidad.getParadaId() == null) {
				throw new BusinessException("busquedaCatalogoDeParadaController.msg.codAnttJaExiste");
			} else {
				if (!lsParadas.contains(entidad)) {
					throw new BusinessException("busquedaCatalogoDeParadaController.msg.codAnttJaExiste");
				}
			}
		}

		lsParadas = paradaDAO.buscar(entidad.getDescparada(), entidad.getCveparada(), entidad.getCiudad(), entidad.getTipoParada(), entidad.getNodo());

		if (!lsParadas.isEmpty()) {
			if (entidad.getParadaId() == null) {
				throw new BusinessException("MSG.Registro.Existe");
			} else {
				if (!lsParadas.contains(entidad)) {
					throw new BusinessException("MSG.Registro.Existe");
				}
			}
		}

		lsParadas = buscarCVE(entidad.getCveparada());

		if (!lsParadas.isEmpty()) {
			if (entidad.getParadaId() == null) {
				throw new BusinessException("editarCatalogoDeParadaController.registroIATAExiste");
			} else {
				if (!lsParadas.contains(entidad)) {
					throw new BusinessException("editarCatalogoDeParadaController.registroIATAExiste");
				}
			}
		}

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

		if (entidad.getParadaId() == null) {
			return paradaDAO.suscribir(entidad);
		}

		return paradaDAO.actualizacion(entidad);

	}

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

		return paradaDAO.suscribir(entidad);
	}

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

		return paradaDAO.actualizacion(entidad);
	}

	@Transactional
	public void borrar(Parada entidad) throws RegistroConDependenciaException {
		if ((tramoDAO.count("origem", entidad) > 0l)
				|| (tramoDAO.count("destino", entidad) > 0l)) {
			throw new RegistroConDependenciaException();
		}
		entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		entidad.setFecmodif(Calendar.getInstance().getTime());
		entidad.setActivo(Boolean.FALSE);

		paradaDAO.actualizacion(entidad);
	}

	public List<Parada> buscar(String descparada, String cveparada, Ciudad ciudad,
			TipoParada tipoParada, Nodo nodo) {
		return paradaDAO.buscar(descparada, cveparada, ciudad, tipoParada, nodo);
	}

	public List<Parada> buscar(String descparada) {
		return paradaDAO.buscar(descparada);
	}

	public List<Parada> buscarCVE(String cveparada) {
		return paradaDAO.buscarCVE(StringUtils.trim(cveparada));
	}

	public List<Parada> buscaLike(String descparada) {
		return paradaDAO.buscaLike(descparada);
	}

	public List<Parada> obtenerOrigenPorRuta(Ruta ruta) {
		return paradaDAO.obtenerOrigenPorRuta(ruta);
	}

	@Override
	public List<Parada> obtenerTodos() {
		return paradaDAO.obtenerTodos();
	}

	@Override
	public List<Parada> obterPossiveisDestinos(Parada origem) {
		List<Parada> paradas;
		paradas = paradaDAO.obterPossiveisDestinos(origem);

		if (paradas != null) {
			return paradas;
		}
		return new ArrayList<Parada>();
	}

	@Override
	public List<Parada> buscaParadaRegionMetropolitana(RegionMetropolitana regionMetropolitana){
		return paradaDAO.buscaParadaRegionMetropolitana(regionMetropolitana);
	}
	
	public List<Parada> buscarPorAgrupamentoParadaId(AgrupamentoParada agrupamentoParada){
		return paradaDAO.buscarPorAgrupamentoParadaId(agrupamentoParada);
	}

	@Override
	public List<Parada> buscarDestinosPorOrigem(Integer origemId) {
		return paradaDAO.buscarDestinosPorOrigem(origemId);
	}
	
	@Override
	 public List<Parada> obtenerOrigenPorListRutaIds(Integer orgaoConcendenteId, Integer empresaId, Integer[] listRuta){
		return paradaDAO.obtenerOrigenPorListRutaIds(orgaoConcendenteId,empresaId,listRuta);
	}
	
	@Override
	public List<String> buscarDescOrigemDestino(Integer origemId, Integer destinoId) {
		return paradaDAO.buscarDescOrigemDestino(origemId, destinoId);
	}
}
