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

/**
 * @author salmanoe
 * @since Oct 8, 2021
 */
@Repository("produkPerawat")
public interface ProdukPerawatDao extends PagingAndSortingRepository<ProdukPerawat, Integer> {

	String allProduk = "select new Map(prp.id as id,prp.namaProduk as namaProduk," + "prp.klasifikasi as kdKlasif,"
			+ "(case when prp.klasifikasi = 1 then 'Asuhan' " + "when prp.klasifikasi = 2 then 'Tindakan' "
			+ "when prp.klasifikasi = 3 then 'Laporan' end) as klasifikasi) " + "from ProdukPerawat prp "
			+ "where prp.statusEnabled is true";

	String namaProduk = " and lower(prp.namaProduk) like %:namaProduk%";

	String kdKlasif = " and prp.klasifikasi = :kdKlasif";

	String listIdProduk = " and prp.id in (:listProdukId)";

	String sortAllProduk = " order by prp.klasifikasi, prp.namaProduk asc";

	@Query(allProduk + sortAllProduk)
	public List<Map<String, Object>> findAllActive();

	@Query(allProduk + namaProduk + sortAllProduk)
	public List<Map<String, Object>> findAllActive(@Param("namaProduk") String namaProduk);

	@Query(allProduk + kdKlasif + sortAllProduk)
	public List<Map<String, Object>> findAllActive(@Param("kdKlasif") Short kdKlasif);

	@Query(allProduk + namaProduk + kdKlasif + sortAllProduk)
	public List<Map<String, Object>> findAllActive(@Param("namaProduk") String namaProduk,
			@Param("kdKlasif") Short kdKlasif);

	@Query(allProduk + listIdProduk + sortAllProduk)
	public List<Map<String, Object>> findProdukPerawat(@Param("listProdukId") List<Integer> listIdProduk);

	String dupCheck = "select prp.id from ProdukPerawat prp " + "where prp.statusEnabled is true "
			+ "and lower(regexp_replace(prp.namaProduk,:patternText,'','g')) = :namaProduk "
			+ "and prp.klasifikasi = :kdKlasif";

	String notIdProduk = " and prp.id <> :produkId";

	@Query(dupCheck)
	public List<Integer> findDupProduk(@Param("patternText") String patternText, @Param("namaProduk") String namaProduk,
			@Param("kdKlasif") Short kdKlasif);

	@Query(dupCheck + notIdProduk)
	public List<Integer> findDupProduk(@Param("patternText") String patternText, @Param("namaProduk") String namaProduk,
			@Param("kdKlasif") Short kdKlasif, @Param("produkId") Integer idProduk);

}
