package com.jasamedika.medifirst2000.dao;

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

@Repository("PegawaiHistoriRekapIndexDao")
public interface PegawaiHistoriRekapIndexDao extends PagingAndSortingRepository<PegawaiHistoriRekapIndex, String> {

	@Query("select model from PegawaiHistoriRekapIndex model where model.noRecPlanningPerubahanStatus=:key")
	public PegawaiHistoriRekapIndex getPegawaiHistoriRekapIndex(@Param("key") String key);

	@Query("select coalesce(sum(pegawaiHistori.nilaiIndex), 0) " + "from PegawaiHistoriRekapIndex pegawaiHistori "
			+ "left join pegawaiHistori.komponenIndex komponenIndex " + "left join pegawaiHistori.pegawai pegawai "
			+ "where komponenIndex.id = :komponenIndex and pegawai.id = :idPegawai")
	public Integer getNilaiIndexPegawaiHistoriRekapIndex(@Param("idPegawai") Integer idPegawai,
			@Param("komponenIndex") Integer komponenIndex);

	@Query("select pegawaiHistori " + "from PegawaiHistoriRekapIndex pegawaiHistori "
			+ "left join pegawaiHistori.komponenIndex komponenIndex " + "left join pegawaiHistori.pegawai pegawai "
			+ "where komponenIndex.id = :komponenIndex and pegawai.id = :idPegawai")
	public PegawaiHistoriRekapIndex getPegawaiHistoriRekapIndex(@Param("idPegawai") Integer idPegawai,
			@Param("komponenIndex") Integer komponenIndex);

	@Query("select pegawaiHistori.noRec "
			+ "from PegawaiHistoriRekapIndex pegawaiHistori, PlanningPegawaiStatus planning  "
			+ "left join pegawaiHistori.komponenIndex komponenIndex  " + "left join pegawaiHistori.pegawai pegawai  "
			+ "left join planning.listTanggal listTanggal	 "
			+ "where komponenIndex.id = :komponenIndex and pegawai.id = :idPegawai and to_char(listTanggal.tgl,'yyyy-MM-dd') = :date  "
			+ "and planning.noRec = pegawaiHistori.noRecPlanningPerubahanStatus and  listTanggal.approvalStatus is true")
	public String getPegawaiHistoriRekapIndexByDate(@Param("idPegawai") Integer idPegawai,
			@Param("komponenIndex") int komponenIndex, @Param("date") String date);

	@Query("select new Map(pegawaiHistori.noRec as noRecHistory, "
			+ "coalesce(planning.deskripsiStatusPegawaiExec, planning.keteranganLainyaExec, planning.deskripsiStatusPegawaiPlan, planning.keteranganLainyaPlan, '') as alasan) "
			+ "from PegawaiHistoriRekapIndex pegawaiHistori, PlanningPegawaiStatus planning "
			+ "left join pegawaiHistori.komponenIndex komponenIndex " + "left join pegawaiHistori.pegawai pegawai "
			+ "left join planning.listTanggal listTanggal "
			+ "where planning.noRec = pegawaiHistori.noRecPlanningPerubahanStatus "
			+ "and komponenIndex.id in (:listKomponenIndex) " + "and pegawai.id = :idPegawai "
			+ "and to_char(listTanggal.tgl,'yyyy-MM-dd') = :date " + "and  listTanggal.approvalStatus is true")
	public List<Map<String, Object>> getPegawaiHistoriRekapIndexByDate(@Param("idPegawai") Integer idPegawai,
			@Param("listKomponenIndex") List<Integer> listKomponenIndex, @Param("date") String date);

	@Query("select count(distinct rekInd.noRec) " + "from PegawaiHistoriRekapIndex rekInd, "
			+ "PlanningPegawaiStatus planPegStat, " + "ListTanggalCuti listTagCuti "
			+ "where rekInd.pegawaiId = planPegStat.pegawaiId "
			+ "and planPegStat.noRec = listTagCuti.planningPegawaiStatusId "
			+ "and rekInd.komponenIndexId = :komponenIndex " + "and rekInd.pegawaiId = :idPegawai "
			+ "and planPegStat.jenisPerawatan = :jenisPerawatan "
			+ "and to_char(listTagCuti.tgl, 'yyyy-mm') = to_char(current_date, 'yyyy-mm')")
	public Integer getSakitTerpakai(@Param("idPegawai") Integer idPegawai,
			@Param("komponenIndex") Integer komponenIndex, @Param("jenisPerawatan") Integer jenisPerawatan);

	@Query("select count(distinct listTagCuti.planningPegawaiStatusId) " + "from PegawaiHistoriRekapIndex rekInd, "
			+ "PlanningPegawaiStatus planPegStat, " + "ListTanggalCuti listTagCuti "
			+ "where rekInd.pegawaiId = planPegStat.pegawaiId "
			+ "and rekInd.noRecPlanningPerubahanStatus = planPegStat.noRec "
			+ "and planPegStat.noRec = listTagCuti.planningPegawaiStatusId " + "and planPegStat.approvalStatus <> 3 "
			+ "and listTagCuti.statusEnabled is true " + "and rekInd.komponenIndexId = :komponenIndex "
			+ "and rekInd.pegawaiId = :idPegawai "
			+ "and to_char(listTagCuti.tgl, 'yyyy') = to_char(current_date, 'yyyy')")
	public Integer getIzinTerpakai(@Param("idPegawai") Integer idPegawai,
			@Param("komponenIndex") Integer komponenIndex);

	@Query("select count(distinct listTagCuti.noRec) " + "from PegawaiHistoriRekapIndex rekInd, "
			+ "PlanningPegawaiStatus planPegStat, " + "ListTanggalCuti listTagCuti "
			+ "where rekInd.pegawaiId = planPegStat.pegawaiId "
			+ "and planPegStat.noRec = listTagCuti.planningPegawaiStatusId " + "and planPegStat.approvalStatus <> 3 "
			+ "and listTagCuti.statusEnabled is true " + "and planPegStat.noRec <> :norec "
			+ "and rekInd.komponenIndexId = :komponenIndex " + "and rekInd.pegawaiId = :idPegawai "
			+ "and to_char(listTagCuti.tgl, 'yyyy') = to_char(current_date, 'yyyy')")
	public Integer getIzinTerpakai(@Param("norec") String norec, @Param("idPegawai") Integer idPegawai,
			@Param("komponenIndex") Integer komponenIndex);

	@Query("select count(distinct listTagCuti.tgl) " + "from PegawaiHistoriRekapIndex rekInd, "
			+ "PlanningPegawaiStatus planPegStat, " + "ListTanggalCuti listTagCuti "
			+ "where rekInd.pegawaiId = planPegStat.pegawaiId "
			+ "and rekInd.noRecPlanningPerubahanStatus = planPegStat.noRec "
			+ "and planPegStat.noRec = listTagCuti.planningPegawaiStatusId " + "and planPegStat.statusEnabled is true "
			+ "and listTagCuti.statusEnabled is true " + "and listTagCuti.approvalStatus is true "
			+ "and rekInd.komponenIndexId = :komponenIndex " + "and rekInd.pegawaiId = :idPegawai "
			+ "and to_char(listTagCuti.tgl, 'yyyy') = to_char(current_date, 'yyyy')")
	public Integer getCutiTerpakai(@Param("idPegawai") Integer idPegawai,
			@Param("komponenIndex") Integer komponenIndex);

	String strQryCutiTerpakai = "select count(distinct listTagCuti.tgl) " + "from PegawaiHistoriRekapIndex rekInd, "
			+ "PlanningPegawaiStatus planPegStat, " + "ListTanggalCuti listTagCuti "
			+ "where rekInd.pegawaiId = planPegStat.pegawaiId "
			+ "and rekInd.noRecPlanningPerubahanStatus = planPegStat.noRec "
			+ "and planPegStat.noRec = listTagCuti.planningPegawaiStatusId " + "and planPegStat.approvalStatus = 1 "
			+ "and planPegStat.statusEnabled is true " + "and listTagCuti.statusEnabled is true "
			+ "and listTagCuti.approvalStatus is true " + "and rekInd.komponenIndexId in (:listKomponenIndex) "
			+ "and rekInd.pegawaiId = :idPegawai";

	String tahunCutiTerpakai = " and to_char(listTagCuti.tgl, 'yyyy') = :tahun";

	String tahunHistoriCutiTerpakai = " and to_char(listTagCuti.tgl, 'yyyy') < :tahun";

	String tahunHistoriPengajuan = " and to_char(planPegStat.tglPengajuan, 'yyyy') < :tahun";

	@Query(strQryCutiTerpakai + tahunCutiTerpakai)
	public Integer getCutiTerpakai(@Param("tahun") String tahun, @Param("idPegawai") Integer idPegawai,
			@Param("listKomponenIndex") List<Integer> listKomponenIndex);

	@Query(strQryCutiTerpakai + tahunHistoriCutiTerpakai)
	public Integer getHistoriCutiTerpakai(@Param("tahun") String tahun, @Param("idPegawai") Integer idPegawai,
			@Param("listKomponenIndex") List<Integer> listKomponenIndex);

	@Query(strQryCutiTerpakai + tahunHistoriPengajuan)
	public Integer getHistoriCutiTerpakaiByTahunPengajuan(@Param("tahun") String tahun,
			@Param("idPegawai") Integer idPegawai, @Param("listKomponenIndex") List<Integer> listKomponenIndex);

}
