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.JadwalDokter;

@Repository("JadwalDokterDao")
public interface JadwalDokterDao extends PagingAndSortingRepository<JadwalDokter, Integer> {

	@Query("select model from JadwalDokter model where date(model.tanggalJadwal)=date(:tanggalJadwal)")
	public List<JadwalDokter> findJadwalByTanggal(@Param("tanggalJadwal") Date tanggalJadwal);

	@Query("select model from JadwalDokter model where model.ruangan.id=:id and to_char(model.tanggalJadwal,'yyyy-MM-dd') >= :date")
	public List<JadwalDokter> findJadwalByRuangan(@Param("id") Integer id,@Param("date") String date);

	@Query("select model from JadwalDokter model where model.ruangan.id=:idRuangan and date(model.tanggalJadwal)=date(:tanggalJadwal)")
	public List<JadwalDokter> findJadwalByTanggalRuangan(@Param("idRuangan") Integer idRuangan,
			@Param("tanggalJadwal") Date tanggalJadwal);

	@Query("select count(model) from JadwalDokter model where model.dokter.id=:id and date(model.tanggalJadwal)=date(:date)")
	public Integer CheckJadwalDokter(@Param("date") Date date, @Param("id") Integer id);

	@Query("select model from JadwalDokter model where model.ruangan.id=:idRuangan and date(model.tanggalJadwal)=date(:tanggalJadwal) and model.dokter.qPegawai=:kdPegawai")
	public JadwalDokter findJadwalByTanggalRuanganAndKdPegawai(@Param("idRuangan") Integer idRuangan,
			@Param("tanggalJadwal") Date tanggalJadwal, @Param("kdPegawai") short kdPegawai);

	@Query("select model from JadwalDokter model order by model.tanggalJadwal desc,model.dokter.namaLengkap desc,model.ruangan.namaRuangan")
	public List<JadwalDokter> findJadwalAll();

	@Query("select model from JadwalDokter model where model.ruangan.id=:idRuangan and date(model.tanggalJadwal)=date(:tanggalJadwal) and model.dokter.qPegawai=:kdPegawai")
	public List<JadwalDokter> findJadwalByTanggalRuanganAndKdPegawaiList(@Param("idRuangan") Integer idRuangan,
			@Param("tanggalJadwal") Date tanggalJadwal, @Param("kdPegawai") short kdPegawai);

	@Query("select model from JadwalDokter model where model.ruangan.id=:idRuangan and date(model.tanggalJadwal)=date(:tanggalJadwal)")
	public List<JadwalDokter> findJadwalByTanggalRuanganList(@Param("idRuangan") Integer idRuangan,
			@Param("tanggalJadwal") Date tanggalJadwal);
	
	@Query("select p from JadwalDokter p where p.dokter.id=:idDokter ")
	public List<JadwalDokter> getJadwalDokterByIdDokter(@Param("idDokter") Integer idDokter);

	@Query("select p from JadwalDokter p where p.dokter.id=:idDokter and p.tanggalJadwal between :now and :nextWeek")
	public List<JadwalDokter> getJadwalDokterMingguanByIdDokter(@Param("idDokter") Integer idDokter,
			@Param("now") Date now, @Param("nextWeek") Date nextWeek);

	@Query("select Distinct NEW com.jasamedika.medifirst2000.entities.JadwalDokter(p.ruangan,p.tanggalJadwal,p.dokter,p.jadwalPraktek) from JadwalDokter p where p.dokter.id=:idDokter and p.tanggalJadwal between :now and :nextWeek")
	public List<JadwalDokter> getJadwalDokterMingguanByIdDokter2(@Param("idDokter") Integer idDokter,
			@Param("now") Date now, @Param("nextWeek") Date nextWeek);

	@Query("select NEW Map(pg.id as id,pg.namaLengkap as namaLengkap) from Pegawai pg left join pg.jabatanFungsional jf "
			+ "where jf.id in (24,58)")
	public List<Map<String, Object>> getSupirAmbulances();

	@Query("select distinct NEW Map(dkt.id as id,dkt.namaLengkap as namaLengkap,jd.tanggalJadwal as tglJadwal,jp.id as jadwalPraktekId,"
			+ "jp.reportDisplay as reportDisplay) from JadwalDokter jd left join jd.jadwalPraktek jp left join jd.dokter dkt "
			+ "where jd.dokter.id=:id and month(jd.tanggalJadwal)=:bulan and year(jd.tanggalJadwal)=:tahun order by jd.tanggalJadwal")
	public List<Map<String, Object>> getJadwalSupirAmbulanceByIdPegawaiAndPeriode(@Param("id") Integer id,
			@Param("bulan") Integer bulan, @Param("tahun") Integer tahun);

	@Query("select p from JadwalDokter p where p.tanggalJadwal between :dateFrom and :dateTo and ( p.dokter.jabatanFungsional.id in (24,58) or p.dokter.jabatanStruktural.id in (24,58) ) ")
	public List<JadwalDokter> getJadwalSupirAmbulanceByDate(@Param("dateFrom") Date dateFrom,
			@Param("dateTo") Date dateTo);

	@Query("select model from JadwalDokter model where model.ruangan.id=:ruangan and month(model.tanggalJadwal)=:bulan and year(model.tanggalJadwal) = :tahun and model.dokter.id  = (:pegawai)")
	public List<JadwalDokter> findJadwalByTanggalRuangan(@Param("ruangan") Integer ruangan,
			@Param("tahun") Integer tahun, @Param("bulan") Integer bulan, @Param("pegawai") Integer pegawai);
	
	@Query("select model from JadwalDokter model, MapPegawaiJabatanToUnitKerja mapPegawai inner join model.dokter dokter "
			+ "where mapPegawai.pegawaiId = dokter.id and mapPegawai.isPrimary is true and mapPegawai.statusEnabled is true and mapPegawai.unitKerjaPegawaiId = :unitKerja "
			+ "and month(model.tanggalJadwal) = :bulan and year(model.tanggalJadwal) = :tahun and dokter.id = (:pegawai)")
	public List<JadwalDokter> findJadwalByTanggalUnitKerja(@Param("unitKerja") Integer unitKerja,
			@Param("tahun") Integer tahun, @Param("bulan") Integer bulan, @Param("pegawai") Integer pegawai);

	
	@Query("select model from JadwalDokter model where model.ruangan.headRuangan.id=:idRuangan and date(model.tanggalJadwal)=date(:tanggalJadwal)")
	public List<JadwalDokter> findJadwalByTanggalRuanganBilik(@Param("idRuangan") Integer idRuangan,
			@Param("tanggalJadwal") Date tanggalJadwal);

	@Query("select model from JadwalDokter model where model.ruangan.id=:idRuangan and date(model.tanggalJadwal)=date(:tanggalJadwal)")
	public List<JadwalDokter> findJadwalByTanggalRuanganBilik3(@Param("idRuangan") Integer idRuangan,
			@Param("tanggalJadwal") Date tanggalJadwal);

	@Query("select model from JadwalDokter model where model.dokter.id=:pegawai and date(model.tanggalJadwal)=date(:jamMasuk)")
	public JadwalDokter findByTanggalAndPegawai(@Param("jamMasuk") Date jamMasuk, @Param("pegawai") Integer pegawai);

	@Query("select model from JadwalDokter model where model.ruangan.headRuangan.id=:idRuangan and to_char(date(model.tanggalJadwal),'yyyy-mm-dd')=to_char(date(:tanggalJadwal),'yyyy-mm-dd')")
	public List<JadwalDokter> findJadwalByTanggalRuanganBilik2(@Param("idRuangan") Integer idRuangan,
			@Param("tanggalJadwal") Date tanggalJadwal);
	
	//add by iwankasan 210417
	@Query("select distinct new map(j.dokter.id as idDokter, " +
			" j.dokter.namaLengkap as nmDokter, j.ruangan.id as idRuangan, " +
			" j.ruangan.namaRuangan as namaRuangan, to_char(j.tanggalJadwal,'yyyy-mm-dd') as tglJadwal, " +
			" j.jadwalPraktek.id as idPraktek, j.jadwalPraktek.jamPraktek as jamPraktek) from " +
			" JadwalDokter j where j.dokter.id=:idDokter and j.ruangan.id=:idRuangan and to_char(date(j.tanggalJadwal),'yyyy-mm-dd') between to_char(date(:from),'yyyy-mm-dd') and to_char(date(:to),'yyyy-mm-dd')")
	public List<JadwalDokter> findJadwalDokterByKisaranTglRuangan(
			@Param("idDokter") int idDokter,
			@Param("idRuangan") int idRuangan,
			@Param("from") Date from,
			@Param("to") Date to);
	
	@Query("select distinct new map(j.dokter.id as idDokter, " +
			" j.dokter.namaLengkap as nmDokter, j.ruangan.id as idRuangan, " +
			" j.ruangan.namaRuangan as namaRuangan, to_char(j.tanggalJadwal,'yyyy-mm-dd') as tglJadwal, " +
			" j.jadwalPraktek.id as idPraktek, j.jadwalPraktek.jamPraktek as jamPraktek) from " +
			" JadwalDokter j where j.dokter.id=:idDokter and to_char(date(j.tanggalJadwal),'yyyy-mm-dd') between to_char(date(:from),'yyyy-mm-dd') and to_char(date(:to),'yyyy-mm-dd')")
	public List<JadwalDokter> findJadwalDokterByKisaranTglRuanganAll(
			@Param("idDokter") int idDokter,
			@Param("from") Date from,
			@Param("to") Date to);
	
	/*@Query("select NEW Map ("
			+ "a.quota as quota, "
			+ "b.id as ruanganId, "
			+ "b.namaRuangan as namaRuangan, "
			+ "c.id as kamarId, "
			+ "c.namaKamar as namaKamar) "
			+ "from JadwalDokter a "
			+ "left join a.ruangan b "
			+ "left join b.kamarSet c "
			+ "where b.id=:idRuangan and "
			+ "date(a.tanggalJadwal)=date(:tanggalJadwal)")
	public List<Map<String, Object>> findJadwalByTanggalRuangan(
			@Param("idRuangan") Integer idRuangan,
			@Param("tanggalJadwal") Date tanggalJadwal);*/
}
