package com.rms.tfc.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.rms.tfc.entity.Producto;
import com.rms.tfc.util.LogUtil;

@Repository
@Transactional
public class ProductoDaoImpl implements ProductoDao {

	@Autowired
    private SessionFactory sessionFactory;

    private final String className = "com.rms.tfc.dao.ProductoDaoImpl";
    
	public synchronized Long createProducto(Producto producto){
		Session session = null;
		try{
			session = sessionFactory.openSession();
			Transaction tx = session.getTransaction();
			if (!tx.isActive()){
               		tx.begin();
           		}
			session.save(producto);
			tx.commit();
		} catch (Exception e){
			LogUtil.printLog(className, "Error al hacer el save del producto");
			e.printStackTrace();
			return null;
		} finally {
			if (session != null){
				session.close();
			}
		}
		return producto.getIdProducto();
	}
	
	public synchronized Producto updateProducto(Producto producto){
		Session session = null;
		try{
			session = sessionFactory.openSession();
			Transaction tx = session.getTransaction();
			if (!tx.isActive()){
               		tx.begin();
           		}
			session.update(producto);
			tx.commit();
		} catch (Exception e){
			LogUtil.printLog(className, "Error al hacer el update del producto");
			e.printStackTrace();
			return null;
		} finally {
			if (session != null){
				session.close();
			}
		}
		return producto;
	}
	
	public Producto getProductoById(Long idProducto){
		List<Producto> lista = null;
		Session session = null;
		try{
            String queryStr = "SELECT * FROM producto WHERE idProducto = " + idProducto;
            session = sessionFactory.openSession();
            lista = (List<Producto>) session.createSQLQuery(queryStr).addEntity(Producto.class).list();
        }catch (Exception e){
            LogUtil.printLog(className, "Error realizando la busqueda de producto");
            e.printStackTrace();
        } finally {
			if (session != null){
				session.close();
			}
		}
        if (lista != null && lista.size() > 0){
            return (Producto) lista.get(0);
        } else {
            return null;
        }
	}
	
	public List<Producto> getAllProductos(){
		List<Producto> lista = null;
		Session session = null;
		try{
            String queryStr = "SELECT * FROM producto ORDER BY descripcion";
            session = sessionFactory.openSession();
            lista = (List<Producto>) session.createSQLQuery(queryStr).addEntity(Producto.class).list();
        }catch (Exception e){
            LogUtil.printLog(className, "Error realizando la busqueda de productos");
            e.printStackTrace();
        } finally {
			if (session != null){
				session.close();
			}
		}
        return lista;
	}
}