package com.rms.tfc.service;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.annotation.Resource;

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

import com.rms.tfc.dao.LineaDao;
import com.rms.tfc.dao.PedidoDao;
import com.rms.tfc.dao.ProductoDao;
import com.rms.tfc.entity.Linea;
import com.rms.tfc.entity.Pedido;
import com.rms.tfc.entity.Producto;
import com.rms.tfc.mapper.MapperBBDD;
import com.rms.tfc.util.LogUtil;

@Service("pedidoServiceTarget")
public class PedidoServiceImpl implements PedidoService {

	@Autowired
	TiendaService tiendaService;
	
	@Resource
	PedidoDao pedidoDAO;
	
	@Resource
	LineaDao lineaDAO;
	
	@Resource
	ProductoDao productoDAO;
	
	@Resource
    private PropertiesService propertiesService;
	
	private final String className = "com.rms.tfc.service.PedidoServiceImpl";
	
	public List<Pedido> getAllPedidosPendientes(){
		return pedidoDAO.getAllPedidosNotInEstado(MapperBBDD.estadoRecibido);
	}
	
	public DetallePedidoBean getDetallePedido(Long idPedido){
		Pedido pedido = pedidoDAO.getPedidoById(idPedido);
		DetallePedidoBean detallePedidoBean = new DetallePedidoBean(pedido);
		List<Linea> listaLineas = lineaDAO.getAllLineasByPedido(idPedido);
		Iterator<Linea> itLineas = listaLineas.iterator();
		Linea linea = null;
		Producto producto = null;
		while (itLineas.hasNext()){
			linea = itLineas.next();
			producto = productoDAO.getProductoById(linea.getIdProducto());
			detallePedidoBean.addLinea(new LineaPantallaBean(linea, producto.getDescripcion()));
		}
		return detallePedidoBean;
	}
	
	public List<Pedido> getAllPedidosHistorico(String descripcion, String fechaDesde, String fechaHasta){
		return pedidoDAO.getAllPedidosHistorico(descripcion, fechaDesde, fechaHasta);
	}
	
	public List<Producto> getAllProductos(){
		return productoDAO.getAllProductos();
	}
	
	public void creaNewPedido(String descripcion, List<LineaBean> lineas){
		Pedido pedido = MapperBBDD.getPedido(descripcion);
		pedido.setIdPedido(pedidoDAO.getNextId());
		Long idCreado = pedidoDAO.createPedido(pedido);
		List<Linea> listaLineas = MapperBBDD.getLineas(lineas);
		List<Linea> listaLineasEnvio = new ArrayList<Linea>();
		Linea linea = null;
		Iterator<Linea> itLineas = listaLineas.iterator();
		while (itLineas.hasNext()){
			linea = itLineas.next();
			linea.setIdLinea(lineaDAO.getNextId());
			linea.setIdPedido(idCreado);
			lineaDAO.createLinea(linea);
			listaLineasEnvio.add(linea);
		}
		String enviado = tiendaService.enviaNewPedido(pedido, listaLineasEnvio);
		if (enviado != null && "OK".equals(enviado)){
			pedido.setEnviadoAlmacen(new Long(1));
			pedidoDAO.updatePedido(pedido);
			if (propertiesService.isDebugEnabled()){
				LogUtil.printLog(className, "Pedido creado y enviado correctamente. IdPedido: " + pedido.getIdPedido());
			}
		} else {
			LogUtil.printLog(className, "El pedido no se ha enviado al almacen. IdPedido: " + pedido.getIdPedido());
		}
	}
	
	public RecibirPedidoBean getRecibirPedidoBean(Long idPedido){
		RecibirPedidoBean recibirPedidoBean = new RecibirPedidoBean();
		Pedido pedido = pedidoDAO.getPedidoById(idPedido);
		recibirPedidoBean.setPedido(pedido);
		List<LineaBean> listaLineas = new ArrayList<LineaBean>();
		List<Linea> lineas = lineaDAO.getAllLineasByPedido(idPedido);
		Iterator<Linea> itLineas = lineas.iterator();
		Linea linea = null;
		LineaBean lineaBean = null;
		while (itLineas.hasNext()){
			linea = itLineas.next();
			lineaBean = new LineaBean();
			lineaBean.setIdLinea(linea.getIdLinea());
			lineaBean.setIdProducto(linea.getIdProducto());
			lineaBean.setCantidadPedida(linea.getCantidadPedida());
			lineaBean.setCantidadRecibida(linea.getCantidadRecibida());
			lineaBean.setCantidadDevuelta(linea.getCantidadDevuelta());
			listaLineas.add(lineaBean);
		}
		recibirPedidoBean.setListaLineas(listaLineas);
		List<Producto> listaProductos = productoDAO.getAllProductos();
		Iterator<Producto> itProductos = listaProductos.iterator();
		Producto producto = null;
		while (itProductos.hasNext()){
			producto = itProductos.next();
			recibirPedidoBean.addProducto(producto.getIdProducto(), producto.getDescripcion());
		}
		return recibirPedidoBean;
	}
	
	public void recibePedido(Long idPedido, List<LineaBean> lineas){
		tiendaService.procesaEnviaRecepcion(idPedido, lineas);
	}
}