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.MappingKirimDokumenPasien;
import com.jasamedika.medifirst2000.util.CommonUtil;

@Repository
public class KirimDokumenPasienDaoCustomImpl extends CoreDaoImpl<MappingKirimDokumenPasien>
		implements KirimDokumenPasienDaoCustom {

	public KirimDokumenPasienDaoCustomImpl() {
		super(MappingKirimDokumenPasien.class);
	}

	@Override
	public int findCount(String dateStart, String dateEnd, String ruanganPelayanan, String ruanganAsal,
			String kdRuangan, String namaPasien, String noCm) {

		StringBuffer buffer = new StringBuffer();
		buffer.append("select count(pd.noRec) " + "from AntrianPasienDiPeriksa apd " + "left join apd.pasienDaftar pd "
				+ "left join pd.pasien pasien " + "left join pasien.jenisKelamin jk "
				+ "left join apd.ruangan ruangan where apd.tglRegistrasi is not null ");

		if (CommonUtil.isNotNullOrEmpty(dateStart) && CommonUtil.isNotNullOrEmpty(dateEnd)) {
			buffer.append("and date(apd.tglRegistrasi) between date(:dateStart) and date(:dateEnd) ");
		}

		if (CommonUtil.isNotNullOrEmpty(dateStart) && CommonUtil.isNotNullOrEmpty(dateEnd)) {
			buffer.append("and date(pd.tglPulang) between date(:dateStart) and date(:dateEnd) ");
		}

		if (CommonUtil.isNotNullOrEmpty(ruanganPelayanan)) {
			buffer.append("and ruangan.namaRuangan like :ruanganPelayanan ");
		}

		if (CommonUtil.isNotNullOrEmpty(kdRuangan)) {
			buffer.append("and ruangan.kdRuangan=:kdRuangan ");
		}

		if (CommonUtil.isNotNullOrEmpty(namaPasien)) {
			buffer.append("and pasien.namaPasien like :namaPasien ");
		}

		if (CommonUtil.isNotNullOrEmpty(noCm)) {
			buffer.append("and pasien.noCm=:noCm ");
		}

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

		if (CommonUtil.isNotNullOrEmpty(dateStart) && CommonUtil.isNotNullOrEmpty(dateEnd)) {
			query.setParameter("dateStart", dateStart);
			query.setParameter("dateEnd", dateEnd);
		}

		if (CommonUtil.isNotNullOrEmpty(ruanganPelayanan)) {
			query.setParameter("ruanganPelayanan", '%' + ruanganPelayanan + '%');
		}

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

		if (CommonUtil.isNotNullOrEmpty(namaPasien)) {
			query.setParameter("namaPasien", '%' + namaPasien + '%');
		}

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

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

	@SuppressWarnings("unchecked")
	@Override
	public List<Map<String, Object>> getDaftarDokumenRekamMedisPasien(String sort, String dir, String dateStartMasuk,
			String dateEndMasuk, String dateStartPulang, String dateEndPulang, String ruanganPelayanan,
			Integer idRuangan, Integer idPasien, String namaPasien, String noCm, String ruanganPasien) {

		StringBuffer buffer = new StringBuffer();
		buffer.append(
				"select distinct new map(pd.noRec as noRec,pd.noRegistrasi as noRegistrasi,dokumen.id as idDokumen,"
						+ "dokumen.namaJudulDokumen as namaJudulDokumen,pasien.id as idPasien,pasien.noCm as noCm,pasien.namaPasien as namaPasien,"
						+ "ruanganPasien.id as idRuangan,ruanganPasien.namaRuangan as ruanganPasien,jk.jenisKelamin as jenisKelamin,"
						+ "pd.tglPulang as tglPulang,pd.tglRegistrasi as tglMasuk) "
						+ "from PasienDaftar pd left join pd.pasien pasien "
						+ "left join pasien.jenisKelamin jk left join pasien.dokumenRekamMedis dokumen "
						+ "left join pd.ruangan ruanganPasien where pd.tglRegistrasi is not null and dokumen.id is not null ");

		if (CommonUtil.isNotNullOrEmpty(dateStartMasuk) && CommonUtil.isNotNullOrEmpty(dateEndMasuk)) {
			buffer.append("and date(pd.tglRegistrasi) between date(:dateStartMasuk) and date(:dateEndMasuk) ");
		}

		if (CommonUtil.isNotNullOrEmpty(dateStartPulang) && CommonUtil.isNotNullOrEmpty(dateEndPulang)) {
			buffer.append("and date(pd.tglPulang) between date(:dateStartPulang) and date(:dateEndPulang) ");
		}

		if (CommonUtil.isNotNullOrEmpty(idRuangan)) {
			buffer.append("and ruanganPasien.id=:idRuangan ");
		}

		if (CommonUtil.isNotNullOrEmpty(namaPasien)) {
			buffer.append("and lower(pasien.namaPasien) like lower(:namaPasien) ");
		}

		if (CommonUtil.isNotNullOrEmpty(noCm)) {
			buffer.append("and lower(pasien.noCm) like lower(:noCm) ");
		}

		if (CommonUtil.isNotNullOrEmpty(idPasien)) {
			buffer.append("and pasien.id=:idPasien ");
		}

		if (CommonUtil.isNotNullOrEmpty(ruanganPasien)) {
			buffer.append("and lower(ruanganPasien.namaRuangan) like lower(:ruanganPasien) ");
		}

		buffer.append("order by pd.noRegistrasi asc ");

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

		if (CommonUtil.isNotNullOrEmpty(dateStartMasuk) && CommonUtil.isNotNullOrEmpty(dateEndMasuk)) {
			query.setParameter("dateStartMasuk", dateStartMasuk);
			query.setParameter("dateEndMasuk", dateEndMasuk);
		}

		if (CommonUtil.isNotNullOrEmpty(dateStartPulang) && CommonUtil.isNotNullOrEmpty(dateEndPulang)) {
			query.setParameter("dateStartPulang", dateStartPulang);
			query.setParameter("dateEndPulang", dateEndPulang);
		}

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

		if (CommonUtil.isNotNullOrEmpty(namaPasien)) {
			query.setParameter("namaPasien", '%' + namaPasien + '%');
		}

		if (CommonUtil.isNotNullOrEmpty(noCm)) {
			query.setParameter("noCm", '%' + noCm + '%');
		}

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

		if (CommonUtil.isNotNullOrEmpty(ruanganPasien)) {
			query.setParameter("ruanganPasien", '%' + ruanganPasien + '%');
		}

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

		return list;
	}

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

		StringBuffer buffer = new StringBuffer();
		buffer.append(
				"select distinct new map(pd.noRec as noRec,pd.noRegistrasi as noRegistrasi,pasien.id as pasienId,pasien.noCm as noCm,"
						+ "pasien.namaPasien as namaPasien,jk.jenisKelamin as jenisKelamin,ruangan.id as ruanganId,"
						+ "ruangan.namaRuangan as namaRuangan,"
						+ "dokumen.id as dokumenId,dokumen.namaJudulDokumen as judulDokumen,"
						+ "apd.tglRegistrasi as tglRegistrasi,pd.tglPulang as tglPulang) "
						+ "from AntrianPasienDiPeriksa apd left join apd.pasienDaftar pd "
						+ "left join pd.pasien pasien "
						+ "left join pasien.jenisKelamin jk left join apd.ruangan ruangan left join pasien.dokumenRekamMedis dokumen "
						+ "where apd.tglRegistrasi is not null order by pasien.namaPasien asc ");

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

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

		return list;
	}

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

		StringBuffer buffer = new StringBuffer();
		buffer.append(
				"select new map(drm.noRec as noRec,dokumen.id as idDokumen,dokumen.namaJudulDokumen as judulDokumen,"
						+ "pasien.id as idPasien,pasien.namaPasien as namaPasien,"
						+ "ruanganAsal.namaRuangan as ruanganPengirim,pengirim.namaLengkap as userPengirim,"
						+ "strukKirim.tglkirim as tglKirim) from MappingKirimDokumenPasien map left join map.pasien pasien "
						+ "left join map.dokumen dokumen left join map.dokumenRekamMedis drm left join drm.noKirim strukKirim "
						+ "left join drm.ruanganAsal ruanganAsal left join drm.ruanganTujuan ruanganTujuan "
						+ "left join strukKirim.pegawaiPengirim pengirim where strukKirim.tglkirim is not null ");

		if (CommonUtil.isNotNullOrEmpty(noRec)) {
			buffer.append("and drm.noRec=:noRec ");
		}

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

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

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

		return list;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Map<String, Object>> getDaftarKirimDokumenRekamMedisPasien(String sort, String dir,
			String dateStartMasuk, String dateEndMasuk, String dateStartPulang, String dateEndPulang,
			String dateStartKirim, String dateEndKirim, String ruanganPelayanan, String ruanganAsal, Integer idRuangan,
			Integer idPasien, String namaPasien, String noCm, String ruanganPasien) {

		StringBuffer buffer = new StringBuffer();
		buffer.append("select distinct new map(strukKirim.tglkirim as tglKirim,ruangan.namaRuangan as ruanganPengirim,"
				+ "pengirim.namaLengkap as pegawaiPengirim,ruanganTujuan.namaRuangan as ruanganTujuan,"
				+ "ruanganPasien.namaRuangan as ruanganPasien,"
				+ "dokumen.id as idDokumen,dokumen.namaJudulDokumen as judulDokumen,"
				+ "pasien.id as idPasien,pasien.noCm as noCm,pasien.namaPasien as namaPasien,"
				+ "pd.tglRegistrasi as tglMasuk,pd.tglPulang as tglPulang,drm.status as status) "
				+ "from MappingKirimDokumenPasien map "
				+ "left join map.dokumenRekamMedis drm left join map.pasienDaftar pd "
				+ "left join map.pasien pasien left join map.dokumen dokumen left join drm.noKirim strukKirim "
				+ "left join pd.ruangan ruanganPasien left join strukKirim.kdruangan ruangan "
				+ "left join strukKirim.kdruanganasal ruanganAsal left join strukKirim.kdruangantujuan ruanganTujuan "
				+ "left join strukKirim.pegawaiPengirim pengirim where drm.status is not null ");

		if (CommonUtil.isNotNullOrEmpty(dateStartMasuk) && CommonUtil.isNotNullOrEmpty(dateEndMasuk)) {
			buffer.append("and date(pd.tglRegistrasi) between date(:dateStartMasuk) and date(:dateEndMasuk) ");
		}

		if (CommonUtil.isNotNullOrEmpty(dateStartPulang) && CommonUtil.isNotNullOrEmpty(dateEndPulang)) {
			buffer.append("and date(pd.tglPulang) between date(:dateStartPulang) and date(:dateEndPulang) ");
		}

		if (CommonUtil.isNotNullOrEmpty(idRuangan)) {
			buffer.append("and ruanganPasien.id=:idRuangan ");
		}

		if (CommonUtil.isNotNullOrEmpty(namaPasien)) {
			buffer.append("and lower(pasien.namaPasien) like lower(:namaPasien) ");
		}

		if (CommonUtil.isNotNullOrEmpty(noCm)) {
			buffer.append("and lower(pasien.noCm) like lower(:noCm) ");
		}

		if (CommonUtil.isNotNullOrEmpty(idPasien)) {
			buffer.append("and pasien.id=:idPasien ");
		}

		if (CommonUtil.isNotNullOrEmpty(ruanganPasien)) {
			buffer.append("and lower(ruanganPasien.namaRuangan) like lower(:ruanganPasien) ");
		}

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

		if (CommonUtil.isNotNullOrEmpty(dateStartMasuk) && CommonUtil.isNotNullOrEmpty(dateEndMasuk)) {
			query.setParameter("dateStartMasuk", dateStartMasuk);
			query.setParameter("dateEndMasuk", dateEndMasuk);
		}

		if (CommonUtil.isNotNullOrEmpty(dateStartPulang) && CommonUtil.isNotNullOrEmpty(dateEndPulang)) {
			query.setParameter("dateStartPulang", dateStartPulang);
			query.setParameter("dateEndPulang", dateEndPulang);
		}

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

		if (CommonUtil.isNotNullOrEmpty(namaPasien)) {
			query.setParameter("namaPasien", '%' + namaPasien + '%');
		}

		if (CommonUtil.isNotNullOrEmpty(noCm)) {
			query.setParameter("noCm", '%' + noCm + '%');
		}

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

		if (CommonUtil.isNotNullOrEmpty(ruanganPasien)) {
			query.setParameter("ruanganPasien", '%' + ruanganPasien + '%');
		}

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

		return list;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Map<String, Object>> getDaftarDokumenRekamMedisPasienTerima(String sort, String dir, String dateStartMasuk,
			String dateEndMasuk, String dateStartPulang, String dateEndPulang, String ruanganPelayanan,
			Integer idRuangan, Integer idPasien, String namaPasien, String noCm, String ruanganPasien) {

		StringBuffer buffer = new StringBuffer();
		buffer.append("select NEW Map("
				+ "a.noRec as noReVerifikasi,"
				+ "pd.noRec as noRec, "
				+ "pd.noRegistrasi as noRegistrasi, "
				+ "dokumen.id as idDokumen, "
				+ "dokumen.namaJudulDokumen as namaJudulDokumen, "
				+ "pasien.id as idPasien, "
				+ "pasien.noCm as noCm, "
				+ "pasien.namaPasien as namaPasien, "
				+ "ruanganPasien.id as idRuangan, "
				+ "ruanganPasien.namaRuangan as ruanganPasien, "
				+ "jk.jenisKelamin as jenisKelamin, "
				+ "pd.tglPulang as tglPulang, "
				+ "pd.tglRegistrasi as tglMasuk, "
				+ "a.status as statusDokumen, "
				+ "strukKirim.tglkirim as tglkirim) "
				+ "from MappingKirimDokumenPasien a "
				+ "left join a.pasienDaftar pd "
				+ "left join pd.pasien pasien "
				+ "left join pasien.jenisKelamin jk "
				+ "left join pasien.dokumenRekamMedis dokumen "
				+ "left join a.ruanganTujuan ruanganPasien "
				+ "left join a.strukKirim as strukKirim "
				+ "where pd.tglRegistrasi is not null ");

		if (CommonUtil.isNotNullOrEmpty(dateStartMasuk) && CommonUtil.isNotNullOrEmpty(dateEndMasuk)) {
			buffer.append("and date(pd.tglRegistrasi) between date(:dateStartMasuk) and date(:dateEndMasuk) ");
		}

		if (CommonUtil.isNotNullOrEmpty(dateStartPulang) && CommonUtil.isNotNullOrEmpty(dateEndPulang)) {
			buffer.append("and date(pd.tglPulang) between date(:dateStartPulang) and date(:dateEndPulang) ");
		}

		if (CommonUtil.isNotNullOrEmpty(idRuangan)) {
			buffer.append("and ruanganPasien.id=:idRuangan ");
		}

		if (CommonUtil.isNotNullOrEmpty(namaPasien)) {
			buffer.append("and lower(pasien.namaPasien) like lower(:namaPasien) ");
		}

		if (CommonUtil.isNotNullOrEmpty(noCm)) {
			buffer.append("and lower(pasien.noCm) like lower(:noCm) ");
		}

		if (CommonUtil.isNotNullOrEmpty(idPasien)) {
			buffer.append("and pasien.id=:idPasien ");
		}

		if (CommonUtil.isNotNullOrEmpty(ruanganPasien)) {
			buffer.append("and lower(ruanganPasien.namaRuangan) like lower(:ruanganPasien) ");
		}

		buffer.append("order by pd.noRegistrasi asc ");

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

		if (CommonUtil.isNotNullOrEmpty(dateStartMasuk) && CommonUtil.isNotNullOrEmpty(dateEndMasuk)) {
			query.setParameter("dateStartMasuk", dateStartMasuk);
			query.setParameter("dateEndMasuk", dateEndMasuk);
		}

		if (CommonUtil.isNotNullOrEmpty(dateStartPulang) && CommonUtil.isNotNullOrEmpty(dateEndPulang)) {
			query.setParameter("dateStartPulang", dateStartPulang);
			query.setParameter("dateEndPulang", dateEndPulang);
		}

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

		if (CommonUtil.isNotNullOrEmpty(namaPasien)) {
			query.setParameter("namaPasien", '%' + namaPasien + '%');
		}

		if (CommonUtil.isNotNullOrEmpty(noCm)) {
			query.setParameter("noCm", '%' + noCm + '%');
		}

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

		if (CommonUtil.isNotNullOrEmpty(ruanganPasien)) {
			query.setParameter("ruanganPasien", '%' + ruanganPasien + '%');
		}

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

		return list;
	}
}
