package com.jasamedika.medifirst2000.dao.custom;

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

import javax.persistence.Query;

import org.springframework.stereotype.Repository;

import com.jasamedika.medifirst2000.dao.custom.base.impl.CoreDaoImpl;
import com.jasamedika.medifirst2000.entities.DetailSpekAnggaran;
import com.jasamedika.medifirst2000.util.CommonUtil;

@Repository
public class DaftarRKAKLTahunanDaoCustomImpl extends CoreDaoImpl<DetailSpekAnggaran>
		implements DaftarRKAKLTahunanDaoCustom {

	public DaftarRKAKLTahunanDaoCustomImpl() {
		super(DetailSpekAnggaran.class);
	}

	@Override
	public int findCount(Integer tahun, String isVerifikasi) {

		StringBuffer buffer = new StringBuffer();
		buffer.append("select count(dsa.noRec) ");
		buffer.append(
				"from DetailSpekAnggaran dsa join dsa.detailAnggaran da join da.kegiatanAnggaran ka join ka.headAnggaran ha ");
		buffer.append("where dsa.detailAnggaran is not null and dsa.isActive=true ");

		if (CommonUtil.isNotNullOrEmpty(tahun)) {
			buffer.append("and ha.tahun =:tahun ");
		}

		if (CommonUtil.isNotNullOrEmpty(isVerifikasi)) {
			if (isVerifikasi.equals("PENGAJUAN")) {
				buffer.append("and dsa.isVerifikasi=:isVerifikasi ");
			} else {
				buffer.append("and upper(dsa.isVerifikasi) like :isVerifikasi ");
			}
		}

		Query query = em.createQuery(buffer.toString());

		if (CommonUtil.isNotNullOrEmpty(tahun)) {
			query.setParameter("tahun", tahun);
		}

		if (CommonUtil.isNotNullOrEmpty(isVerifikasi)) {
			if (isVerifikasi.equals("PENGAJUAN")) {
				query.setParameter("isVerifikasi", isVerifikasi);
			} else {
				query.setParameter("isVerifikasi", "%" + isVerifikasi + "%");
			}
		}

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

	@SuppressWarnings("unchecked")
	@Override
	public List<Map<String, Object>> findRiwayat(String sort, String dir, Integer tahun) {

		StringBuffer buffer = new StringBuffer();
		buffer.append(
				"select distinct new map(ha.tahun as tahun,(CASE WHEN (dsa.isVerifikasi = 'PENGAJUAN') THEN 'INDIKATIF' ELSE 'DEFINITIF' END) as status) "
						+ "from DetailSpekAnggaran dsa " + "join dsa.detailAnggaran da "
						+ "join da.kegiatanAnggaran ka "
						+ "join ka.headAnggaran ha where dsa.detailAnggaran is not null and dsa.isActive=true ");

		if (CommonUtil.isNotNullOrEmpty(tahun)) {
			buffer.append("and ha.tahun =:tahun ");
		}

		Query query = em.createQuery(buffer.toString());

		if (CommonUtil.isNotNullOrEmpty(tahun)) {
			query.setParameter("tahun", tahun);
		}

		List<Map<String, Object>> list = query.getResultList();

		return list;
	}

	@Override
	public double getGrandTotal(Integer tahun, String isVerifikasi) {

		StringBuffer buffer = new StringBuffer();
		buffer.append("select SUM(dsa.totalHargaBarang) as grandTotal from DetailSpekAnggaran dsa "
				+ "join dsa.detailAnggaran da " + "join da.kegiatanAnggaran ka " + "join ka.headAnggaran ha "
				+ "where dsa.detailAnggaran is not null and dsa.isActive=true and dsa.totalHargaBarang is not null ");

		if (CommonUtil.isNotNullOrEmpty(tahun)) {
			buffer.append("and ha.tahun =:tahun ");
		}

		if (CommonUtil.isNotNullOrEmpty(isVerifikasi)) {
			if (isVerifikasi.equals("PENGAJUAN")) {
				buffer.append("and dsa.isVerifikasi=:isVerifikasi ");
			} else {
				buffer.append("and upper(dsa.isVerifikasi) like :isVerifikasi ");
			}
		}

		Query query = em.createQuery(buffer.toString());

		if (CommonUtil.isNotNullOrEmpty(tahun)) {
			query.setParameter("tahun", tahun);
		}

		if (CommonUtil.isNotNullOrEmpty(isVerifikasi)) {
			if (isVerifikasi.equals("PENGAJUAN")) {
				query.setParameter("isVerifikasi", isVerifikasi);
			} else {
				query.setParameter("isVerifikasi", "%" + isVerifikasi + "%");
			}
		}

		return ((Double) query.getSingleResult()).doubleValue();

	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Map<String, Object>> getDaftarHeadAnggaran(Integer tahun) {

		StringBuffer buffer = new StringBuffer();
		buffer.append("select distinct new map(ha.tahun as tahun) from HeadAnggaran ha where ");

		if (CommonUtil.isNotNullOrEmpty(tahun)) {
			buffer.append("ha.tahun =:tahun ");
		}
		Query query = em.createQuery(buffer.toString());

		if (CommonUtil.isNotNullOrEmpty(tahun)) {
			query.setParameter("tahun", tahun);
		}

		List<Map<String, Object>> list = query.getResultList();

		return list;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Map<String, Object>> getDetailKegiatanRKAKL() {

		StringBuffer buffer = new StringBuffer();
		buffer.append(
				"select distinct new map(kd.kodeKegiatanDetail as kodeKegiatanDetail,kd.namaKegiatanDetail as namaKegiatanDetail,"
						+ "ka.headAnggaran.tahun as tahunHeadAnggaran,kd.id as kegiatanId) "
						+ "from KegiatanAnggaran ka join ka.kegiatanDetail kd");

		Query query = em.createQuery(buffer.toString());

		List<Map<String, Object>> list = query.getResultList();

		return list;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Map<String, Object>> getMataAnggaran(Integer tahun) {

		StringBuffer buffer = new StringBuffer();
		buffer.append(
				"select distinct new map(ha.tahun as tahun,akun.id as akunId,akun.kodeMataAnggaran as kodeMataAnggaran,"
						+ "akun.namaMataAnggaran as namaMataAnggaran,ka.kegiatanDetail.id as kegiatanId) from DetailAnggaran da "
						+ "join da.kegiatanAnggaran ka join ka.headAnggaran ha join da.akun akun ");

		if (CommonUtil.isNotNullOrEmpty(tahun)) {
			buffer.append("where ha.tahun=:tahun ");
		}

		Query query = em.createQuery(buffer.toString());

		if (CommonUtil.isNotNullOrEmpty(tahun)) {
			query.setParameter("tahun", tahun);
		}

		List<Map<String, Object>> list = query.getResultList();

		return list;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Map<String, Object>> getPaketUsulan() {

		StringBuffer buffer = new StringBuffer();
		buffer.append(
				"select new map(ha.tahun as tahun,kd.id as kegiatanId,akun.id as akunId,coalesce(paket.spesifikasi,'-') as paketUsulan) "
						+ "from DetailSpekAnggaran dsa join dsa.detailAnggaran da join da.kegiatanAnggaran ka join ka.kegiatanDetail kd join da.akun akun "
						+ "join ka.headAnggaran ha left join dsa.detailSpekAnggaran paket "
						+ "group by ha.tahun,kd.id,akun.id,paket.spesifikasi order by paket.spesifikasi");

		Query query = em.createQuery(buffer.toString());

		List<Map<String, Object>> list = query.getResultList();

		return list;
	}

}
