package com.rms.tfc.service;

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

import javax.annotation.Resource;

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.types.AlmacenWSSOAPStub;
import com.rms.tfc.types.AlmacenWS_ServiceLocator;
import com.rms.tfc.types.ExpedicionPedido;
import com.rms.tfc.types.LineaRecepcionType;
import com.rms.tfc.types.LineaType;
import com.rms.tfc.types.RecibeProducto;
import com.rms.tfc.util.DateUtil;
import com.rms.tfc.util.LogUtil;

public class TiendaService {

	@Resource
    private PropertiesService propertiesService;
	
	@Resource
	ProductoDao productoDAO;
	@Resource
	PedidoDao pedidoDAO;
	@Resource
	LineaDao lineaDAO;
	
	private final String className = "com.rms.tfc.service.AlmacenService";
	
	public String creaActualizaProducto(RecibeProducto recibeProducto){
		if (propertiesService.isDebugEnabled()){
			LogUtil.printLog(className, "Recibido RecibeProducto");
			LogUtil.printLog(className, "idProducto: " + recibeProducto.getIdProducto());
			LogUtil.printLog(className, "descripcion: " + recibeProducto.getDescripcion());
		} else {
			LogUtil.printLog(className, "Recibido RecibeProducto (idProducto: " + recibeProducto.getIdProducto() + ")");
		}
		boolean creadoActualizado = false;
		Producto producto = productoDAO.getProductoById(new Long(recibeProducto.getIdProducto()));
		if (producto != null){
			producto.setDescripcion(recibeProducto.getDescripcion());
			producto = productoDAO.updateProducto(producto);
			if (producto != null){
				creadoActualizado = true;
			}
		} else {
			producto = new Producto();
			producto.setIdProducto(new Long(recibeProducto.getIdProducto()));
			producto.setDescripcion(recibeProducto.getDescripcion());
			Long idCreado = productoDAO.createProducto(producto);
			if (idCreado != null){
				creadoActualizado = true;
			}
		}
		if (creadoActualizado){
			return "OK";
		} else {
			return "ERROR";
		}
	}
	
	public String procesaExpedicion(ExpedicionPedido expedicionPedido){
		if (propertiesService.isDebugEnabled()){
			LogUtil.printLog(className, "Recibido ExpedicionPedido");
			LogUtil.printLog(className, "idPedido: " + expedicionPedido.getIdPedido());
			LogUtil.printLog(className, "estado: " + expedicionPedido.getEstado());
		} else {
			LogUtil.printLog(className, "Recibido ExpedicionPedido (idPedido: " + expedicionPedido.getIdPedido() + ")");
		}
		Pedido pedido = pedidoDAO.getPedidoById(new Long(expedicionPedido.getIdPedido()));
		if (pedido != null){
			pedido.setEstado(expedicionPedido.getEstado());
			pedido.setFechaExpedicion(DateUtil.getNow());
			pedido = pedidoDAO.updatePedido(pedido);
		}
		return "OK";
	}
	
	public String enviaNewPedido(Pedido pedido, List<Linea> lineas){
		try {
			URL url = new URL(propertiesService.getUrlAlmacen());
			AlmacenWS_ServiceLocator almacenWS_ServiceLocator = new AlmacenWS_ServiceLocator();
    		AlmacenWSSOAPStub almacenWSSOAPStub = new AlmacenWSSOAPStub(url, almacenWS_ServiceLocator);
    		LineaType lineaType = null;
    		List<LineaType> lineasEnvio = new ArrayList<LineaType>();
    		Iterator<Linea> itLineas = lineas.iterator();
    		Linea linea = null;
    		while(itLineas.hasNext()){
    			linea = itLineas.next();
    			lineaType = new LineaType();
    			lineaType.setIdProducto(linea.getIdProducto().toString());
    			lineaType.setCantidadPedida(linea.getCantidadPedida().toString());
    			lineaType.setIdLineaExterno(linea.getIdLinea().toString());
    			lineasEnvio.add(lineaType);
    		}
    		String response = almacenWSSOAPStub.newPedido("" + propertiesService.getIdTienda(), 
    								pedido.getDescripcion(), pedido.getIdPedido().toString(), lineasEnvio.toArray(new LineaType[0]));
    		return response;
		} catch(Exception e){
    		LogUtil.printLog(className, "Ocurrio un error no controlado: " + e.getMessage());
    		e.printStackTrace();
    		return null;
    	}
	}
	
	public void procesaEnviaRecepcion(Long idPedido, List<LineaBean> lineas){
		Pedido pedido = pedidoDAO.getPedidoById(idPedido);
		try {
			URL url = new URL(propertiesService.getUrlAlmacen());
			AlmacenWS_ServiceLocator almacenWS_ServiceLocator = new AlmacenWS_ServiceLocator();
    		AlmacenWSSOAPStub almacenWSSOAPStub = new AlmacenWSSOAPStub(url, almacenWS_ServiceLocator);
    		LineaRecepcionType lineaRecepcionType = null;
    		List<LineaRecepcionType> lineasEnvio = new ArrayList<LineaRecepcionType>();
    		Iterator<LineaBean> itLineas = lineas.iterator();
    		LineaBean lineaBean = null;
    		Linea linea = null;
    		while(itLineas.hasNext()){
    			lineaBean = itLineas.next();
    			linea = lineaDAO.getLineaById(lineaBean.getIdLinea());
    			linea.setCantidadRecibida(lineaBean.getCantidadRecibida());
    			linea.setCantidadDevuelta(lineaBean.getCantidadDevuelta());
    			lineaDAO.updateLinea(linea);
    			lineaRecepcionType = new LineaRecepcionType();
    			lineaRecepcionType.setIdLineaExterno(lineaBean.getIdLinea().toString());
    			lineaRecepcionType.setCantidadRecibida(lineaBean.getCantidadRecibida().toString());
    			lineaRecepcionType.setCantidadDevuelta(lineaBean.getCantidadDevuelta().toString());
    			lineasEnvio.add(lineaRecepcionType);
    		}
    		String response = almacenWSSOAPStub.recepcionPedido("" + propertiesService.getIdTienda(), 
    								pedido.getIdPedido().toString(), lineasEnvio.toArray(new LineaRecepcionType[0]));
    		pedido.setFechaRecepcion(DateUtil.getNow());
			pedido.setEstado(MapperBBDD.estadoRecibido);
    		if (response != null && "OK".equals(response)){
    			pedido.setEnviadaRecepcion(new Long(1));
    			if (propertiesService.isDebugEnabled()){
    				LogUtil.printLog(className, "Pedido creado y enviado correctamente. IdPedido: " + pedido.getIdPedido());
    			}
    		} else {
    			pedido.setEnviadaRecepcion(new Long(0));
    			LogUtil.printLog(className, "La recepcion del pedido no se ha enviado al almacen. IdPedido: " + pedido.getIdPedido());
    		}
    		pedidoDAO.updatePedido(pedido);
		} catch(Exception e){
    		LogUtil.printLog(className, "Ocurrio un error no controlado: " + e.getMessage());
    		e.printStackTrace();
    	}
	}
}