package dao;

import java.sql.Clob;
import java.sql.SQLException;
import java.util.List;

import javax.sql.rowset.serial.SerialClob;
import javax.sql.rowset.serial.SerialException;

import org.hibernate.Criteria;
import org.hibernate.SQLQuery;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import bean.LogModificheBean;
import bean.LogVariazioniBean;
import common.dao.GenericDAO;
import common.dao.IDAO;
import sicura.entities.LogModificheDisposizioni;

@Repository
public class LogVariazioniDAO extends GenericDAO<LogModificheDisposizioni, Integer> implements IDAO<LogModificheDisposizioni, Integer> {

	public List<LogModificheDisposizioni> listVariazioni(Integer idDisposizione) {
		
		boolean tx = startTransaction();
		try {
			Criteria crit = currentSession().createCriteria(LogModificheDisposizioni.class);
			crit
				.add(Restrictions.eq("iddisposizione",idDisposizione))
				.addOrder(Order.asc("data"));
		    	
			
			List<LogModificheDisposizioni> res = crit.list();
		    
		    return res;
		} finally {
			if (tx)
				tx = commit();
		}
	}
	
	
	public LogModificheDisposizioni save (LogModificheDisposizioni logModificheDisposizioni) throws Exception {
		return saveOrUpdate(logModificheDisposizioni);
	}


	public List<LogModificheDisposizioni> saveAll(List<LogModificheDisposizioni> logModificheDisposizioni) throws Exception {
		boolean tx = startTransaction();
		try {
			for(LogModificheDisposizioni log: logModificheDisposizioni) {
				try {
					log = saveOrUpdateNoTransaction(log);
				} catch (Exception ex) {
					tx = rollback();
					throw ex;
				}
			}
			return logModificheDisposizioni;
		} finally {
			if (tx)
				tx = commit();
		}
	}


	private Clob clobFromString(String string) throws SerialException, SQLException {
		Clob clob;
		clob = new SerialClob(string.toCharArray());
		return clob;
	}
	
	public void saveAll(String userId, String denominazioneUtente, Integer idDisposizione,List<LogVariazioniBean> logModificheDisposizioni) throws Exception {
		boolean tx = startTransaction();
		try {
		
			SQLQuery q = currentSession().createSQLQuery("insert into LogModificheDisposizioni(iddisposizione, userid, data, ora, Utente, NomeCampo, CampoPreModifica, CampoPostModifica)" +
			" values (:iddisposizione, :userid, :data, :ora, :Utente, :NomeCampo, :CampoPreModifica, :CampoPostModifica)");
			
			for(LogVariazioniBean log: logModificheDisposizioni) {
				try {
					
					q
						.setParameter("iddisposizione", idDisposizione)
						.setParameter("userid", userId)
						.setParameter("data", log.getTimestamp())
						.setParameter("ora", log.getTimestamp())
						.setParameter("Utente", denominazioneUtente)
						.setParameter("NomeCampo", log.getFieldName())
						.setParameter("CampoPreModifica", (log.getOldValue()==null?"":log.getOldValue()))
						.setParameter("CampoPostModifica", (log.getNewValue()==null?"":log.getNewValue()));
					
					q.executeUpdate();
					
				} catch (Exception ex) {
					tx = rollback();
					throw ex;
				}
			}
			
		} finally {
			if (tx)
				tx = commit();
		}
	}

}
