package dao;

import java.util.Date;
import java.util.List;

import org.hibernate.SQLQuery;
import org.hibernate.transform.AliasToBeanResultTransformer;
import org.springframework.stereotype.Repository;

import bean.AppVariables;
import bean.filters.ContiFilterBean;
import common.dao.GenericDAO;
import common.dao.IDAO;
import sicura.entities.Banche;
import sicura.entities.BancheId;

@Repository
public class ContiDAO extends GenericDAO<BancheId, Integer> implements IDAO<BancheId, Integer> {

	public List<BancheId> list(ContiFilterBean filterBean, AppVariables appVariables) {
		int sceltaID = 0;
		String sql = "";
		
		List<BancheId> res = null;
		
		if (!filterBean.getInEstrattoreDistinteBanca()) {
			sceltaID = 0;
			if (!filterBean.getInBancaAllineamento()) {
				if (!"TUTTICONTI".equalsIgnoreCase(filterBean.getInFunzioneOrdinante())) {
					sql = "Select banche.* FROM Banche INNER JOIN FunzioniOrdinantiConti ON "+
			                  "Banche.ID = FunzioniOrdinantiConti.IDConto " +
			                  "WHERE FunzioniOrdinantiConti.FunzioneOrdinante='" + filterBean.getInFunzioneOrdinante()+"' " +
			                  (filterBean.getInOnlyContiCassa()? " AND ContoPerCassa=1 ": "") +
			                  (filterBean.getInOnlyContiBancoPosta()? " AND ABI='07601' ": "") +
			                  " ORDER BY ABI,CAB";
				} else {
					sql = "Select banche.* FROM Banche WHERE [CodiceSocietà]='" + appVariables.getCodiceSocieta()+"'" +
			                  (filterBean.getInOnlyContiCassa() ?" AND ContoPerCassa=1 ": "") +
			                  (filterBean.getInOnlyContiBancoPosta()? " AND ABI='07601' ": "");
				}
				
				res = getBanche(sql);
				
				if (res.size()==0) {
					if (!"TUTTICONTI".equalsIgnoreCase(filterBean.getInFunzioneOrdinante())) {
						sql =  "Select banche.* from Banche INNER JOIN FunzioniOrdinantiConti ON " +
			                      "Banche.ID = FunzioniOrdinantiConti.IDConto " +
			                      "WHERE FunzioniOrdinantiConti.FunzioneOrdinante='" + filterBean.getInFunzioneOrdinante() + "' "+
			                      (filterBean.getInOnlyContiCassa()? " AND ContoPerCassa=1 ": "") +
			                      (filterBean.getInOnlyContiBancoPosta()? " AND ABI='07601' ": "") +
			                      " ORDER BY ABI,CAB";
					} else {
						sql= "Select banche.* FROM Banche WHERE "+
			                      "CodiceSocietà='" + appVariables.getCodiceSocieta()+"' " + 
			                      (filterBean.getInOnlyContiCassa()? " AND ContoPerCassa=1 ": "") +
			                      (filterBean.getInOnlyContiBancoPosta()? " AND ABI='07601' ": "");
					}
					
					res = getBanche(sql);
				}
			} else {
				if (!"TUTTICONTI".equalsIgnoreCase(filterBean.getInFunzioneOrdinante())) {
					sql = String.format(
							"Select banche.* FROM Banche INNER JOIN FunzioniOrdinantiConti ON Banche.ID = FunzioniOrdinantiConti.IDConto WHERE FunzioniOrdinantiConti.FunzioneOrdinante='%s' AND ContoAllineamento=1 ORDER BY ABI,CAB",
							filterBean.getInFunzioneOrdinante());
				} else {
					sql = String.format("Select banche.* FROM Banche WHERE [CodiceSocietà]='%s'", appVariables.getCodiceSocieta());
				}
				
				res = getBanche(sql);
				
				if (res.size()==0) {
					if (!"TUTTICONTI".equalsIgnoreCase(filterBean.getInFunzioneOrdinante())) {
						sql = String.format(
								"Select banche.* from Banche INNER JOIN FunzioniOrdinantiConti ON "+
			                      "Banche.ID = FunzioniOrdinantiConti.IDConto " +
			                      "WHERE FunzioniOrdinantiConti.FunzioneOrdinante='%s' "+
			                      "AND ContoAllineamento=1 ORDER BY ABI,CAB",
		                      filterBean.getInFunzioneOrdinante()  
						);
					} else {
						sql= String.format(
							"Select * FROM Banche WHERE [CodiceSocietà]='%s'",
							appVariables.getCodiceSocieta()							
						);
					}
					
					res = getBanche(sql);
					
				}
			}
		} else { //filterBean.getInEstrattoreDistinteBanca()
				sql = String.format(
						"Select * FROM Banche WHERE [CodiceSocietà]='%s'",
						appVariables.getCodiceSocieta()
				);
				
				res = getBanche(sql);
		}		
		
		return res;
	}
	
	private List<BancheId> getBanche(String sql) {
		boolean tx = startTransaction();
		
		try {
			SQLQuery q = currentSession().createSQLQuery(sql);
			q.setResultTransformer(new AliasToBeanResultTransformer(BancheId.class));
			
			q.addScalar("id");
			q.addScalar("codiceSocietà");
			q.addScalar("funzioneOrdinante");
			q.addScalar("abi");
			q.addScalar("cab");
			q.addScalar("conto");
			q.addScalar("contoFormatoContabilizzazione");
			q.addScalar("divisa");
			q.addScalar("descrizioneConto");
			q.addScalar("coordinateIban");
			q.addScalar("saldoContabile");
			q.addScalar("segnoSaldoContabile");
			q.addScalar("dataSaldoContabile");
			q.addScalar("saldoLiquido");
			q.addScalar("segnoSaldoLiquido");
			q.addScalar("dbgridSelect");
			q.addScalar("contoDefault");
			q.addScalar("codiceSia");
			q.addScalar("saldoValutazioneCapienza");
			q.addScalar("segnoValutazioneCapienza");
			q.addScalar("lastSaved");
			q.addScalar("flagStampa");
			q.addScalar("circuitoFlussoOut");
			q.addScalar("contoPerCassa");
			q.addScalar("flagContabilizzazione");
			q.addScalar("flagExportPrometeo");
			
			List<BancheId> banche = q.list();		
			
			return banche;
		} finally {
			if (tx)
				commit();
		}
	}
}
