package com.rjconsultores.ventaboletos.rest.service;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Service;

import com.rjconsultores.routing.ReadOnlyConnection;
import com.rjconsultores.ventaboletos.dao.DispositivoEmbarcadaDAO;
import com.rjconsultores.ventaboletos.dao.EmpresaDAO;
import com.rjconsultores.ventaboletos.dao.OperadorEmbarcadaDAO;
import com.rjconsultores.ventaboletos.dao.OperadorEmbarcadaLinhaDAO;
import com.rjconsultores.ventaboletos.dao.OperadorEmbarcadaServicoDAO;
import com.rjconsultores.ventaboletos.dao.PuntoVentaDAO;
import com.rjconsultores.ventaboletos.entidad.FormaPagoDet;
import com.rjconsultores.ventaboletos.entidad.OperadorEmbarcada;
import com.rjconsultores.ventaboletos.entidad.PtoVtaSeguro;
import com.rjconsultores.ventaboletos.entidad.PtovtaCatInd;
import com.rjconsultores.ventaboletos.entidad.PuntoVentaVO;
import com.rjconsultores.ventaboletos.rest.bean.ParamsSincronizarOperador;
import com.rjconsultores.ventaboletos.rest.service.exception.ServiceEmbarcadaException;
import com.rjconsultores.ventaboletos.vo.corrida.CorridaVO;
import com.rjconsultores.ventaboletos.vo.embarcada.FormaPagamentoVO;
import com.rjconsultores.ventaboletos.vo.embarcada.OperadorEmbarcadaVO;
import com.rjconsultores.ventaboletos.vo.embarcada.SeguroTaxaEmbarqueVO;
import com.rjconsultores.ventaboletos.vo.embarcada.TiposPassagensBloqueadasVO;
import com.rjconsultores.ventaboletos.vo.ruta.RutaVO;
import com.rjconsultores.ventaboletos.web.utilerias.spring.AppContext;

@Service("sincronizarOperadorService")
@SuppressWarnings("unchecked")
public class SincronizarOperadorService {
	private static Logger log = LogManager.getLogger(SincronizarOperadorService.class);
			
	@ReadOnlyConnection
	public OperadorEmbarcadaVO buscarDadosOperador(ParamsSincronizarOperador params) throws Exception {
		SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmm");
		
		Date dtIni = null;
		Date dtFim = null;
		
		try {
			dtIni = sdf.parse(params.getDataInicial());
			dtFim = sdf.parse(params.getDataFinal());
		} catch (ParseException e) {
			log.error(e.getMessage(), e);
		}
		
		EmpresaDAO empresaDAO = (EmpresaDAO)AppContext.getApplicationContext().getBean("empresaDAO");
		OperadorEmbarcadaDAO operadorEmbarcadaDAO = (OperadorEmbarcadaDAO)AppContext.getApplicationContext().getBean("operadorEmbarcadaDAO");
		DispositivoEmbarcadaDAO dispositivoEmbarcadaDAO = (DispositivoEmbarcadaDAO)AppContext.getApplicationContext().getBean("dispositivoEmbarcadaDAO");
		OperadorEmbarcadaLinhaDAO operadorEmbarcadaLinhaDAO = (OperadorEmbarcadaLinhaDAO)AppContext.getApplicationContext().getBean("operadorEmbarcadaLinhaDAO");
		OperadorEmbarcadaServicoDAO operadorEmbarcadaServicoDAO = (OperadorEmbarcadaServicoDAO)AppContext.getApplicationContext().getBean("operadorEmbarcadaServicoDAO");
		PuntoVentaDAO puntoventaDAO = (PuntoVentaDAO)AppContext.getApplicationContext().getBean("puntoVentaDAO");
		OperadorEmbarcada operadorEmbarcada;
		try{
			operadorEmbarcada = operadorEmbarcadaDAO.buscarOperadorEmbarcadaPorUsuario(params.getOperador());
		} catch (Exception e){
			throw new ServiceEmbarcadaException("Error: Buscar Operador Embarcada: "+e.getMessage());
		}
		
		PuntoVentaVO puntoVentaVO = operadorEmbarcadaDAO.getPuntoVentaVO(params.getOperador());	
		OperadorEmbarcadaVO vo = new OperadorEmbarcadaVO();
		vo.setIdOperador(operadorEmbarcada.getUsuarioId());
		vo.setOperador(operadorEmbarcada.getUsername());
		vo.setDescOperador(operadorEmbarcada.getName());
		vo.setIndcorteautomatico(operadorEmbarcada.getUsuario().getIndCorteAutomatico());
		
		if (puntoVentaVO != null) {
			vo.setIdAgencia(puntoVentaVO.getPuntoventaId());
			vo.setDescAgencia(puntoVentaVO.nombpuntoventa);			
		}

		if(params.getVersaoResumida()) {
			if (params.getRetornarTramos() ) {
				List<CorridaVO> lsCorridas = operadorEmbarcadaServicoDAO.getListaResumidaCorridaVO(params.getOperador(), empresaDAO.obtenerID(params.getEmpresa()), dtIni, dtFim, puntoventaDAO.obtenerID(puntoVentaVO.getPuntoventaId()), true);
				vo.setLsCorridas(lsCorridas);
			}else {
				List<String> lsCorridas = operadorEmbarcadaServicoDAO.getListaResumidaCorridaVO(params.getOperador(), empresaDAO.obtenerID(params.getEmpresa()), dtIni, dtFim, puntoventaDAO.obtenerID(puntoVentaVO.getPuntoventaId()), false );
				vo.setListCorridas(lsCorridas);
			}
		}else {
			List<RutaVO> lsRutaVO = operadorEmbarcadaLinhaDAO.getListaRutaVO(params.getOperador());
			List<CorridaVO> lsCorridaVO = operadorEmbarcadaServicoDAO.getListaCorridaVO(params.getOperador(), empresaDAO.obtenerID(params.getEmpresa()), dtIni, dtFim, puntoventaDAO.obtenerID(puntoVentaVO.getPuntoventaId()));
			
			vo.setLsRutas(lsRutaVO);
			vo.setLsCorridas(lsCorridaVO);
			
			if (puntoVentaVO != null) {
				vo.setLsFormasPagamento(new ArrayList<FormaPagamentoVO>());
				vo.setLsSeguroTaxaEmbarque(new ArrayList<SeguroTaxaEmbarqueVO>());
				vo.setLsTiposPassagensBloqueadas(new ArrayList<TiposPassagensBloqueadasVO>());
				
				List<FormaPagoDet> listFP = dispositivoEmbarcadaDAO.getListaFormaPago(puntoVentaVO.getPuntoventaId());
				for (FormaPagoDet dp : listFP) {					 
                    vo.getLsFormasPagamento().add(
                                    new FormaPagamentoVO(
                                                    dp.getEmpresa().getEmpresaId(),
                                                    dp.getEmpresa().getNombempresa(),
                                                    dp.getFormaPago().getFormapagoId().intValue(),
                                                    dp.getFormaPago().getDescpago(), dp.getFormaPago().getTipoFormapago().getDescricao()));
				}           

				List<PtoVtaSeguro> listSTx = dispositivoEmbarcadaDAO.getListaSeguroTaxaEmbarque(puntoVentaVO.getPuntoventaId());
				for (PtoVtaSeguro st : listSTx) {
                    vo.getLsSeguroTaxaEmbarque().add(
                                    new SeguroTaxaEmbarqueVO(
                                                    st.getEmpresa().getEmpresaId(),
                                                    st.getIndVendeSeguroOpcEmbarcada(),
                                                    st.getIndVendeSeguroTabelaEmbarcada(),
                                                    st.getIndTaxaEmbarqueEmbarcada()));
				}

				List<PtovtaCatInd> listTPB = dispositivoEmbarcadaDAO.getListaTiposPassagensBloqueadas(puntoVentaVO.getPuntoventaId());
				for (PtovtaCatInd tpb : listTPB) {
                    vo.getLsTiposPassagensBloqueadas().add(
                                    new TiposPassagensBloqueadasVO(
                                                    tpb.getCategoria().getCategoriaId(),
                                                    tpb.getUsuarioBloqueado().getUsuarioId(),
                                                    tpb.getEmpresa().getEmpresaId()));
                }
			}
		}

		return vo;
	}
}
