package com.jasamedika.medifirst2000.dao;

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

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import com.jasamedika.medifirst2000.entities.DetailDiagnosaPasien;
import com.jasamedika.medifirst2000.entities.Profile;

//import com.jasamedika.medifirst2000.entities.AbsensiPegawai;

@Repository("BridgingDao")
public interface BridgingDao extends PagingAndSortingRepository<DetailDiagnosaPasien, String> {

	//@Query("select c.kdDiagnosa,c.namaDiagnosa,a.tglRegistrasi from DetailDiagnosaPasien a left join Diagnosa c on c.id=a.jenisDiagnosaId where date(a.tglRegistrasi) between :tglAwal and :tglAkhir order by a.tglRegistrasi, c.kdDiagnosa")
	//@Query("select c.kdDiagnosa,c.namaDiagnosa,a.tglRegistrasi from DetailDiagnosaPasien a left join Diagnosa c on c.id=a.jenisDiagnosaId order by a.tglRegistrasi, c.kdDiagnosa")
	@Query("from Diagnosa ddp")
	//@Query("select c.kdDiagnosa,c.namaDiagnosa from Diagnosa c")
	//@Query(value="select c.kddiagnosa,c.namadiagnosa,b.tglregistrasi from detaildiagnosapasien_t a left join antrianpasiendiperiksa_t b on a.noregistrasifk=b.norec left join diagnosa_m c on c.id=a.objectdiagnosafk where b.tglregistrasi between :tgl1 and :tgl2 order by b.tglregistrasi, c.kddiagnosa",nativeQuery=true)
	//public List<Object[]> findICDbyDate(@Param("tgl1")String tgl1, @Param("tgl2")String tgl2);
	public List<Object[]> findICDbyDate();
	
	@Query("from Profile pf")
	public List<Profile>  biosProfile();
	
//	@Query("select coalesce(max(p.noAntrianTujuan),0) from PasienDiRujukKeIntExt p "
//			+ "where date(p.tglDirujuk)=:dateNow and p.ruanganTujuan.id=:idRuangan")
	@Query("select p.ruangan.id, p.qtyBed from Kamar p "
			+ "where p.kelasId=1 or p.kelasId=2 or p.kelasId=3 or p.kelasId=4 or p.kelasId=5 or p.kelasId=7 or p.kelasId=8")
	public List<Object[]>  getQtyBed();

	@Query("select p.tglRegistrasi, p.pasienDaftar.tglPulang from AntrianPasienDiPeriksa p "
			+ "where p.ruangan.departemenId=16 and date(p.tglRegistrasi) between :dateNow and :dateThen order by p.tglRegistrasi")
	public List<Object[]>  getListPasienRanap(@Param("dateNow")Date dateNow, @Param("dateThen")Date dateThen);
	
	@Query("select p.pasienDaftarId, p.ruangan.kdRuangan, p.ruangan.namaRuangan, p.pasienDaftar.kelompokPasien.id from AntrianPasienDiPeriksa p where date(p.tglRegistrasi)=:dateNow and p.ruangan.departemenId=18 order by p.ruangan.kdRuangan")	
	public List<Object[]>  kunjunganIrj(@Param("dateNow")Date dateNow);

	@Query("select p.pasienDaftarId, p.ruangan.kdRuangan, p.ruangan.namaRuangan, p.pasienDaftar.kelompokPasien.id from AntrianPasienDiPeriksa p where date(p.tglRegistrasi)=:dateNow and p.ruangan.departemenId=16 order by p.ruangan.kdRuangan")	
	public List<Object[]>  kunjunganIri(@Param("dateNow")Date dateNow);

	@Query("select p.pasienDaftarId, p.ruangan.kdRuangan, p.ruangan.namaRuangan, p.pasienDaftar.kelompokPasien.id from AntrianPasienDiPeriksa p where date(p.tglRegistrasi)=:dateNow and p.ruangan.departemenId=24 order by p.ruangan.kdRuangan")	
	public List<Object[]>  kunjunganIgd(@Param("dateNow")Date dateNow);
	
	//@Query("from SuratKeputusan sk")
	//public List<SuratKeputusan>  biosSK();
	//@Query("select New MAP(jk.ruangan.id as id, jk.ruangan.namaRuangan as namaRuangan, jk.jamBuka as jamBuka, jk.jamTutup as jamTutup, jk.dataJadwal.name as hari) from JadwalKlinik jk")
	@Query("select new map(jadwalPraktek.jamPraktek as jamPraktek,jadwalPraktek.waktumulai as jamBuka, jadwalPraktek.waktuselesai as jamTutup" 
			+ ",hari.namaHari as hari, ruangan.namaRuangan as namaRuangan, ruangan.id as id)"
			+ " from JadwalPraktikDokter model "
			+ " left join model.hari hari "
			+ " left join model.jadwalPraktek jadwalPraktek "
			+ " left join model.ruangan ruangan "
			+ " left join model.dokter dokter "
			+ " where model.statusEnabled = true ")
	public List<Map<String, Object>> getJadwalKlinik();
	
	@Query("select p.name from DataJadwal p where p.id =:id")
	public String getDay(@Param("id")Integer id);
	
	//@Query("select NEW MAP(p.ruangan.id as idklinik,p.dokter.id as iddokter, p.jadwalPraktek.jamPraktek as jam) from JadwalDokter p where p.ruangan.id = :idKlinik and p.dokter.id = :idDokter and date(p.tanggalJadwal)=date(:tanggal)")
	@Query("select new map(jadwalPraktek.jamPraktek as jamPraktek,jadwalPraktek.waktumulai as jamBuka, jadwalPraktek.waktuselesai as jamTutup" 
			+ ",hari.namaHari as hari, ruangan.namaRuangan as namaRuangan, ruangan.id as id)"
			+ " from JadwalPraktikDokter model "
			+ " left join model.hari hari "
			+ " left join model.jadwalPraktek jadwalPraktek "
			+ " left join model.ruangan ruangan "
			+ " left join model.dokter dokter "
			+ " where model.statusEnabled = true "
			+ " and ruangan.id = :idKlinik and dokter.id = :idDokter and hari.id=:tanggal")
	public List<Map<String, Object>> getJadwalKlinikbyId(@Param("idDokter")Integer idDokter,@Param("idKlinik")Integer idKlinik,@Param("tanggal") Integer tanggal);
	
	@Query(" select setting.nilaiField as nilaiField "+  
			" from SettingDataFixed setting"+			
			" where setting.namaField = 'IdDepartemenRawatInap'")
	public String findIdDepartemenRawatInap();	
	
	@Query(" select ruangan.id "+
			"from Ruangan ruangan "+
			"left join ruangan.departemen departemen "+
			"where departemen.id in (:id)")
	public List<Integer> findIdRuanganDepartemenRawatInap(@Param("id") List<Integer> id);
	
	@Query(" select new map (statusBed.statusBed as statusBed, "+			
			"kelas.kodeExternal as namaKelas, "+
			"ruangPerawatan.kodeExternal as tipePasien, "+
			"count (tempatTidur.id) as countBed) "+
			"from TempatTidur tempatTidur "+
			"left join tempatTidur.statusBed statusBed "+
			"left join tempatTidur.kamar kamar "+
			"left join tempatTidur.ruangPerawatanKemenkes ruangPerawatan "+
			"left join kamar.kelas kelas "+
			"left join kamar.ruangan ruangan "+
			"where ruangPerawatan.id =:idRuangan and kelas.id = :idKelas "+
			"group by statusBed.statusBed,kelas.kodeExternal,ruangPerawatan.kodeExternal")
	public List<Map<String,Object>> findCountBed(@Param("idRuangan")Integer idRuangan,@Param("idKelas")Integer idKelas);
	
	@Query(" select distinct kelas.id "+
			"from TempatTidur tempatTidur "+
			"left join tempatTidur.kamar kamar "+
			"left join tempatTidur.ruangPerawatanKemenkes ruangPerawatan "+
			"left join kamar.kelas kelas "+
			"where ruangPerawatan.id = :id "+
			"order by kelas.id")
	public List<Integer> findIdKelasRuangan(@Param("id")Integer id);
	
	@Query(" select asuransi.noAsuransi "+
			"from AsuransiPasien asuransi "+
			"left join asuransi.noCm pasien "+
			"left join asuransi.rekanan rekanan "+
			"where rekanan.id = :idRekanan and pasien.noCm = :noCm")
	public String findNoAsuransi(@Param("idRekanan")Integer idRekanan,@Param("noCm")String noCm);
	
	@Query(" select setting.nilaiField as nilaiField "+  
			" from SettingDataFixed setting"+			
			" where setting.namaField = 'IdRekananBPJS'")
	public String findIdBPJS();	
	
	@Query(" select distinct ruangPerawatan.id as idRuangan "+
			"from TempatTidur tempatTidur "+
			"left join tempatTidur.kamar kamar "+
			"left join tempatTidur.ruangPerawatanKemenkes ruangPerawatan "+
			"left join kamar.ruangan ruangan  "+
			"where ruangan.id in ( :id) "+
			"order by ruangPerawatan.id asc")
	public List<Integer> findIdRuanganPerawatan(@Param("id")List<Integer> id);
	
	@Query(" select distinct to_char(kamar.tglUpdate, 'yyyy-MM-dd') "+
			"from TempatTidur tempatTidur "+
			"left join tempatTidur.kamar kamar "+
			"left join tempatTidur.ruangPerawatanKemenkes ruangPerawatan "+
			"left join kamar.kelas kelas "+
			"where ruangPerawatan.id =:idRuangan and kelas.id = :idKelas and kamar.tglUpdate is not null "+
			"order by to_char(kamar.tglUpdate, 'yyyy-MM-dd') desc")
	public List<String> findTanggalUpdate(@Param("idRuangan")Integer idRuangan,@Param("idKelas")Integer idKelas);
	
	@Query(" select setting.nilaiField as nilaiField "+  
			" from SettingDataFixed setting"+			
			" where setting.namaField = 'KdKelompokPasienUmum'")
	public String findIdPasienUmum();
	
	@Query(" select setting.nilaiField as nilaiField "+  
			" from SettingDataFixed setting"+			
			" where setting.namaField = 'KdDepartemenInstalasiGawatDarurat'")
	public String findIdUGD();
	
	@Query(" select setting.nilaiField as nilaiField "+  
			" from SettingDataFixed setting"+			
			" where setting.namaField = 'IdRawatInap'")
	public String findIdRawatInap();
	
	@Query(" select setting.nilaiField as nilaiField "+  
			" from SettingDataFixed setting"+			
			" where setting.namaField = 'IdRawatJalan'")
	public String findIdRawatjalan();
	
	@Query(" select setting.nilaiField as nilaiField "+  
			" from SettingDataFixed setting"+			
			" where setting.namaField = 'IdProdukAkomodasi'")
	public String findIdProdukAkomodasi();
	
	@Query(" select count(antrian.noRec) "+
			"from PasienDaftar antrian "+
			"where to_char(antrian.tglRegistrasi,'yyyy')=:tahun "+
			"and to_char(antrian.tglRegistrasi,'MM')=:bulan") 
	public Long findTotalKunjungan(@Param("tahun")String tahun,@Param("bulan")String bulan);
	
	@Query(" select count(pasien.id) "+
			"from Pasien pasien "+
			"where pasien.id is not null and  "+
			"to_char(pasien.tglDaftar,'yyyy') = :tahun "+
			"and to_char(pasien.tglDaftar,'mm') = :bulan") 
	public Long findTotalPasien(@Param("tahun")String tahun,@Param("bulan")String bulan);
	
	@Query(" select count(pasienDaftar.noRec) "+
			"from PasienDaftar pasienDaftar "+
			"left join pasienDaftar.kelompokPasien kelompokPasien "+
			"where kelompokPasien.id = :idPasienUmum and "+
			"to_char(pasienDaftar.tglRegistrasi,'yyyy') = :tahun "+
			"and to_char(pasienDaftar.tglRegistrasi,'mm') =  :bulan") 
	public Long findTotalKunjunganPasienUmum(@Param("tahun")String tahun,@Param("bulan")String bulan,@Param("idPasienUmum")Integer idPasienUmum);
	
	@Query(" select count(distinct pasien.id) "+
			"from PasienDaftar pasienDaftar "+
			"left join pasienDaftar.kelompokPasien kelompokPasien "+
			"left join pasienDaftar.pasien pasien "+
			"where kelompokPasien.id = :idPasienUmum and "+
			"to_char(pasienDaftar.tglRegistrasi,'yyyy') = :tahun "+
			"and to_char(pasienDaftar.tglRegistrasi,'mm') =  :bulan") 
	public Long findTotalPasienUmum(@Param("tahun")String tahun,@Param("bulan")String bulan,@Param("idPasienUmum")Integer idPasienUmum);
	
	@Query(" select count(distinct pasien.id) "+
			"from PasienDaftar pasienDaftar "+
			"left join pasienDaftar.ruangan ruangan "+
			"left join ruangan.departemen departemen "+
			"left join pasienDaftar.pasien pasien "+
			"where departemen.id = :idDepUGD and "+
			"to_char(pasienDaftar.tglRegistrasi,'yyyy') = :tahun "+
			"and to_char(pasienDaftar.tglRegistrasi,'mm') =  :bulan") 
	public Long findTotalPasienUGD(@Param("tahun")String tahun,@Param("bulan")String bulan,@Param("idDepUGD")Integer idDepUGD);
	
	@Query(" select count(pasienDaftar.noRec) "+
			"from PasienDaftar pasienDaftar "+
			"left join pasienDaftar.ruangan ruangan "+
			"left join ruangan.departemen departemen "+
			"left join pasienDaftar.pasien pasien "+
			"where departemen.id = :idDepUGD and "+
			"to_char(pasienDaftar.tglRegistrasi,'yyyy') = :tahun "+
			"and to_char(pasienDaftar.tglRegistrasi,'mm') =  :bulan") 
	public Long findTotalKunjunganPasienUGD(@Param("tahun")String tahun,@Param("bulan")String bulan,@Param("idDepUGD")Integer idDepUGD);
	
	
	@Query(" select count(distinct pasien.id) "+
			"from PasienDaftar pasienDaftar "+
			"left join pasienDaftar.ruangan ruangan "+
			"left join ruangan.departemen departemen "+
			"left join pasienDaftar.pasien pasien "+
			"where departemen.id in (:idDep) and "+
			"to_char(pasienDaftar.tglRegistrasi,'yyyy') = :tahun "+
			"and to_char(pasienDaftar.tglRegistrasi,'mm') =  :bulan") 
	public Long findTotalPasienRawatJalan(@Param("tahun")String tahun,@Param("bulan")String bulan,@Param("idDep")List<Integer> idDep);
	
	@Query(" select count(pasienDaftar.noRec) "+
			"from PasienDaftar pasienDaftar "+
			"left join pasienDaftar.ruangan ruangan "+
			"left join ruangan.departemen departemen "+
			"left join pasienDaftar.pasien pasien "+
			"where departemen.id in (:idDep) and "+
			"to_char(pasienDaftar.tglRegistrasi,'yyyy') = :tahun "+
			"and to_char(pasienDaftar.tglRegistrasi,'mm') =  :bulan") 
	public Long findTotalKunjunganPasienRawatJalan(@Param("tahun")String tahun,@Param("bulan")String bulan,@Param("idDep")List<Integer> idDep);
	
	@Query(" select count(distinct pasien.id) "+
			"from PasienDaftar pasienDaftar "+
			"left join pasienDaftar.ruangan ruangan "+
			"left join ruangan.departemen departemen "+
			"left join pasienDaftar.pasien pasien "+
			"where departemen.id in (:idDep) and "+
			"to_char(pasienDaftar.tglRegistrasi,'yyyy') = :tahun "+
			"and to_char(pasienDaftar.tglRegistrasi,'mm') =  :bulan") 
	public Long findTotalPasienRawatInap(@Param("tahun")String tahun,@Param("bulan")String bulan,@Param("idDep")List<Integer> idDep);
	
	@Query(" select count(pasienDaftar.noRec) "+
			"from PasienDaftar pasienDaftar "+
			"left join pasienDaftar.ruangan ruangan "+
			"left join ruangan.departemen departemen "+
			"left join pasienDaftar.pasien pasien "+
			"where departemen.id in (:idDep) and "+
			"to_char(pasienDaftar.tglRegistrasi,'yyyy') = :tahun "+
			"and to_char(pasienDaftar.tglRegistrasi,'mm') =  :bulan") 
	public Long findTotalKunjunganPasienRawatInap(@Param("tahun")String tahun,@Param("bulan")String bulan,@Param("idDep")List<Integer> idDep);
	
	@Query(" select count(pasienDaftar.noRec) "+
			"from PasienDaftar pasienDaftar "+
			"left join pasienDaftar.kelompokPasien kelompokPasien "+
			"where kelompokPasien.id != :idPasienUmum and "+
			"to_char(pasienDaftar.tglRegistrasi,'yyyy') = :tahun "+
			"and to_char(pasienDaftar.tglRegistrasi,'mm') =  :bulan") 
	public Long findTotalKunjunganPasienJaminan(@Param("tahun")String tahun,@Param("bulan")String bulan,@Param("idPasienUmum")Integer idPasienUmum);
	
	@Query(" select count(distinct pasien.id) "+
			"from PasienDaftar pasienDaftar "+
			"left join pasienDaftar.kelompokPasien kelompokPasien "+
			"left join pasienDaftar.pasien pasien "+
			"where kelompokPasien.id != :idPasienUmum and "+
			"to_char(pasienDaftar.tglRegistrasi,'yyyy') = :tahun "+
			"and to_char(pasienDaftar.tglRegistrasi,'mm') =  :bulan") 
	public Long findTotalPasienJaminan(@Param("tahun")String tahun,@Param("bulan")String bulan,@Param("idPasienUmum")Integer idPasienUmum);
	
	@Query(" select distinct new map(harga.hargaSatuan as hargaSatuan, "+
			"kelas.namaKelas as namaKelas) "+
			"from HargaNettoProdukByKelas harga "+
			"left join harga.produk produk "+
			"left join harga.kelas kelas "+
			"where produk.id = :idproduk  ") 
	public List<Map<String,Object>> findTarifAkomodasi(@Param("idproduk")Integer idproduk);
	
	@Query(" select count(pasienDaftar.noRec) "+
			"from PasienDaftar pasienDaftar "+
			"left join pasienDaftar.kelas kelas "+
			"where to_char(pasienDaftar.tglRegistrasi,'yyyy')= :tahun "+
			"and to_char(pasienDaftar.tglRegistrasi,'mm')= :bulan and kelas.id in (:kelas)") 
	public Integer findTotalKunjunganPasienPerKelas(@Param("tahun")String tahun,@Param("bulan")String bulan,@Param("kelas")List<Integer> kelas);
	
	
		
}
