package com.rjconsultores.ventaboletos.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.rjconsultores.ventaboletos.dao.AbastoBoletoDAO;
import com.rjconsultores.ventaboletos.dao.AbastoCentralDAO;
import com.rjconsultores.ventaboletos.dao.AbastoHistoDAO;
import com.rjconsultores.ventaboletos.dao.AidfDAO;
import com.rjconsultores.ventaboletos.dao.DetAbastoBoletoDAO;
import com.rjconsultores.ventaboletos.dao.PuntoVentaDAO;
import com.rjconsultores.ventaboletos.dao.TipoMovimentacionDAO;
import com.rjconsultores.ventaboletos.entidad.AbastoBoleto;
import com.rjconsultores.ventaboletos.entidad.AbastoCentral;
import com.rjconsultores.ventaboletos.entidad.Aidf;
import com.rjconsultores.ventaboletos.entidad.DetAbastoBoleto;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.entidad.TipoMovimentacion;
import com.rjconsultores.ventaboletos.service.MigracaoControleEstoqueService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;

@Service("migracaoControleEstoqueService")
public class MigracaoControleEstoqueServiceImpl implements MigracaoControleEstoqueService {

	
	@Autowired
	private AbastoBoletoDAO abastoBoletoDAO;
	
	@Autowired
	private DetAbastoBoletoDAO detAbastoBoletoDAO;
	
	@Autowired
	private AidfDAO aidfDAO;

	@Autowired
	private AbastoCentralDAO abastoCentralDAO;
	
	@Autowired
	private AbastoHistoDAO abastoHistoDAO;
	
	@Autowired
	private TipoMovimentacionDAO tipoMovimentacionDAO;
	
	@Autowired
	private PuntoVentaDAO puntoVentaDAO;
	
	public MigracaoControleEstoqueServiceImpl() {
	}

	@Transactional
	public void migraDadosBoletosPuntoVenta(PuntoVenta puntoVenta){		
		puntoVentaDAO.actualizacion(puntoVenta);
	}
	
	@Transactional
	public void migraDadosBoletosPuntoVentaAutomatico(PuntoVenta puntoVenta){
		
		List<AbastoBoleto> abastoBoletos = abastoBoletoDAO.buscaAbastoBoletoPorPuntoVenta(puntoVenta);		
				
		List<Empresa> empresas = new ArrayList<Empresa>();
		empresas.add(puntoVenta.getEmpresa());
		
		List<Aidf> aidfs = aidfDAO.buscaAidfsPorEmpresas(empresas);
		
		Map<Aidf, List<DetAbastoBoleto>> abastoBoletosPorAidf = new HashMap<Aidf, List<DetAbastoBoleto>>();
		
		for(AbastoBoleto abastoBoleto: abastoBoletos){			
			
			List<DetAbastoBoleto> detAbastoBoletos = detAbastoBoletoDAO.buscaDetAbastoBoletos(abastoBoleto);
			
			for(Aidf aidf : aidfs){
				
				if(!abastoBoletosPorAidf.containsKey(aidf))
					abastoBoletosPorAidf.put(aidf, new ArrayList<DetAbastoBoleto>());
				
				for(DetAbastoBoleto detAbastoBoleto : detAbastoBoletos){
					
					String serieDetAbastoBoleto = detAbastoBoleto.getNumseriepreimpresa(); 
					Long numFolioInicialDetAbastoBoleto = Long.valueOf(detAbastoBoleto.getNumfolioinicial());
					Long numFolioFinalDetAbastoBoleto = Long.valueOf(detAbastoBoleto.getNumfoliofinal());
					
					Long numFolioInicialAidf = Long.valueOf(aidf.getForminicial());
					Long numFolioFinalAidf = Long.valueOf(aidf.getFormfinal());
					
					if(serieDetAbastoBoleto.equals(aidf.getSerie()) 
						&& numFolioInicialDetAbastoBoleto >= numFolioInicialAidf
						&& numFolioFinalDetAbastoBoleto <= numFolioFinalAidf){
						
						abastoBoletosPorAidf.get(aidf).add(detAbastoBoleto);
					}
				}
			}			
		}
		
		Iterator<Entry<Aidf,List<DetAbastoBoleto>>> boletosIt = abastoBoletosPorAidf.entrySet().iterator();
		
		List<AbastoCentral> boletosAMigrar = new ArrayList<AbastoCentral>();
		
		Integer usuarioId = UsuarioLogado.getUsuarioLogado().getUsuarioId();
		Date fecmodif = new Date();
		
		while(boletosIt.hasNext()){
			
			Entry<Aidf,List<DetAbastoBoleto>> boletosPorAidf = boletosIt.next();
			
			Aidf aidf = boletosPorAidf.getKey();
			List<DetAbastoBoleto> detAbastoBoletos = boletosPorAidf.getValue();
			
			for(DetAbastoBoleto detAbastoBoleto : detAbastoBoletos){
				
				String serieDetAbastoBoleto = detAbastoBoleto.getNumseriepreimpresa(); 
				Long numFolioInicialDetAbastoBoleto = Long.valueOf(detAbastoBoleto.getNumfolioinicial());
				Long numFolioFinalDetAbastoBoleto = Long.valueOf(detAbastoBoleto.getNumfoliofinal());
				
				int numBoletos = (int)(numFolioFinalDetAbastoBoleto - numFolioInicialDetAbastoBoleto);
				
				Boolean activo = detAbastoBoleto.getActivo();
				String numsubseriepreimpreso = "";
								
				for(int contBoletos = 0 ; contBoletos < numBoletos; contBoletos++ ){
					
					String numfoliopreimpreso = (numFolioInicialDetAbastoBoleto + contBoletos)+"";
					
					AbastoCentral boletoAMigrar = new AbastoCentral(
							aidf, serieDetAbastoBoleto, numfoliopreimpreso, numsubseriepreimpreso, 
							puntoVenta, activo, fecmodif, usuarioId);
					
					boletosAMigrar.add(boletoAMigrar);
				}				
			}
		}
		
		abastoCentralDAO.suscribirBilhetes(boletosAMigrar);
		
		TipoMovimentacion tipoMovMigracao = tipoMovimentacionDAO.buscarTipoMovimentacio(TipoMovimentacion.TIPO_MIGRACAO);
		abastoHistoDAO.grabaHistoricoBilhetes(boletosAMigrar, tipoMovMigracao);
		
		
		abastoCentralDAO.gravaControleEstoqueMigracao(puntoVenta, fecmodif, usuarioId);
	}
	
}
