package com.jasamedika.medifirst2000.dao.custom.impl;

import java.util.List;
import java.util.Map;

import javax.persistence.Query;

import org.springframework.stereotype.Repository;

import com.jasamedika.medifirst2000.dao.custom.IpsrsPemakaianMesinDaoCustom;
import com.jasamedika.medifirst2000.dao.custom.base.impl.CoreDaoImpl;
import com.jasamedika.medifirst2000.entities.IpsrsPemakaianMesin;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.DateUtil;

/**
 * Repository Custom class
 * 
 * @author Roberto
 */
@Repository
public class IpsrsPemakaianMesinDaoCustomImpl extends CoreDaoImpl<IpsrsPemakaianMesin> implements
		IpsrsPemakaianMesinDaoCustom {

	public IpsrsPemakaianMesinDaoCustomImpl() {
		super(IpsrsPemakaianMesin.class);
	}

	@Override
	public List<Map<String, Object>> findListBoiler(int rowStart, int rowEnd, String sort, String dir,String tanggalAwal, String tanggalAhir) {
		StringBuffer buffer = new StringBuffer();
		buffer.append("select NEW Map ( ");
		buffer.append("b.noRec as noRec, ");
		buffer.append("a.tanggal as tanggal, ");
		buffer.append("b.literPemakaianAwal as literPemakaianAwal, ");
		buffer.append("b.literPemakaianAhir as literPemakaianAhir, ");
		buffer.append("c.namaLengkap as petugas, ");
		buffer.append("d.namaProduk as namaMesin, ");
		buffer.append("e.typeProduk as jenisMesin, ");
		buffer.append("f.kapasitas as kapasitas) ");
		buffer.append("from IpsrsPemakaianMesin a ");
		buffer.append("left join a.ipsrsMesinBoiler b ");
		buffer.append("left join a.pegawai c ");
		buffer.append("left join b.mesin d ");
		buffer.append("left join d.typeProduk e, ");
		buffer.append("Mesin f where f.mesinId=b.mesinId and ");
		buffer.append("upper(e.typeProduk) like '%BOILER%' ");
		if(CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)){
			buffer.append("and date(a.tanggal) between  :tanggalAwal and :tanggalAhir ");
		}
		
		
		if (sort != "") {
			buffer.append("order by a." + sort + " " + dir);
		} else {
			buffer.append("order by a.noRec desc ");
		}
		Query query = em.createQuery(buffer.toString());
		if(CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)){
			query.setParameter("tanggalAwal",DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		
		query.setFirstResult(rowStart);
		query.setMaxResults(rowEnd);
		List<Map<String,Object>> list = query.getResultList();

		return list;
	}

	@Override
	public Integer findCountBoiler(String tanggalAwal, String tanggalAhir) {
		StringBuffer buffer = new StringBuffer();
		buffer.append("select count(a) ");
		buffer.append("from IpsrsPemakaianMesin a ");
		buffer.append("left join a.ipsrsMesinBoiler b ");
		buffer.append("left join a.pegawai c ");
		buffer.append("left join b.mesin d ");
		buffer.append("left join d.typeProduk e, ");
		buffer.append("Mesin f where f.mesinId=b.mesinId and ");
		buffer.append("upper(e.typeProduk) like '%BOILER%' ");
		if(CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)){
			buffer.append("and date(a.tanggal) between  :tanggalAwal and :tanggalAhir ");
		}
		
		
		Query query = em.createQuery(buffer.toString());
		if(CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)){
			query.setParameter("tanggalAwal",DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		

		return ((Long) query.getSingleResult()).intValue();
	}

	@Override
	public List<Map<String, Object>> findListGenset(int rowStart, int rowEnd, String sort, String dir,String tanggalAwal, String tanggalAhir) {
		StringBuffer buffer = new StringBuffer();
		buffer.append("select NEW Map (");
				buffer.append("b.noRec as noRec, ");
				buffer.append("a.tanggal as tanggal, ");
				buffer.append("b.pemakaianAwal as pemakaianAwal, ");
				buffer.append("b.pemakaianAhir as pemakaianAhir, ");
				buffer.append("c.namaLengkap as petugas, ");
				buffer.append("d.namaProduk as namaMesin, ");
				buffer.append("e.typeProduk as jenisMesin, ");
				buffer.append("f.kapasitas as kapasitas) ");
				buffer.append("from IpsrsPemakaianMesin a ");
				buffer.append("left join a.ipsrsMesinGenset b ");
				buffer.append("left join a.pegawai c ");
				buffer.append("left join b.mesin d ");
				buffer.append("left join d.typeProduk e, ");
				buffer.append("Mesin f where f.mesinId=b.mesinId and ");
				buffer.append("upper(e.typeProduk) like '%GENSET%' ");
		if(CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)){
			buffer.append("and date(a.tanggal) between  :tanggalAwal and :tanggalAhir ");
		}
		
		
		if (sort != "") {
			buffer.append("order by a." + sort + " " + dir);
		} else {
			buffer.append("order by a.noRec desc ");
		}
		Query query = em.createQuery(buffer.toString());
		if(CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)){
			query.setParameter("tanggalAwal",DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		
		query.setFirstResult(rowStart);
		query.setMaxResults(rowEnd);
		List<Map<String,Object>> list = query.getResultList();

		return list;
	}

	@Override
	public Integer findCountGenset(String tanggalAwal, String tanggalAhir) {
		StringBuffer buffer = new StringBuffer();
		buffer.append("select count(a) ");
		buffer.append("from IpsrsPemakaianMesin a ");
		buffer.append("left join a.ipsrsMesinGenset b ");
		buffer.append("left join a.pegawai c ");
		buffer.append("left join b.mesin d ");
		buffer.append("left join d.typeProduk e, ");
		buffer.append("Mesin f where f.mesinId=b.mesinId and ");
		buffer.append("upper(e.typeProduk) like '%GENSET%' ");
		if(CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)){
			buffer.append("and date(a.tanggal) between  :tanggalAwal and :tanggalAhir ");
		}
		
		
		Query query = em.createQuery(buffer.toString());
		if(CommonUtil.isNotNullOrEmpty(tanggalAwal) && CommonUtil.isNotNullOrEmpty(tanggalAhir)){
			query.setParameter("tanggalAwal",DateUtil.toDate(tanggalAwal));
			query.setParameter("tanggalAhir", DateUtil.toDate(tanggalAhir));
		}
		

		return ((Long) query.getSingleResult()).intValue();
	}





}
