package com.jasamedika.medifirst2000.dao;

import java.util.List;

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.KartuStok;
import com.jasamedika.medifirst2000.entities.StokProdukGlobal;

/**
 * Repository class for StokProdukGlobal
 * 
 * @author Adik
 */
@Repository("StokProdukGlobalDao")
public interface StokProdukGlobalDao extends PagingAndSortingRepository<StokProdukGlobal, Integer> {
	// custom query
	
	@Query("select MAX(p.hargaNetto1) from StokProdukGlobal p where p.ruangan.id=:idRuangan and p.produk.id=:idProduk")
	Double TakeHarga(@Param("idProduk") Integer idProduk,@Param("idRuangan") Integer idRuangan);
	
	/*@Query("select p from StokProdukGlobal p where p.ruangan.id=:idRuangan and p.produk.id=:idProduk and p.asalProdukId=:asalProdukId ")
	List<StokProdukGlobal> findStokWitAsalProduk(@Param("idProduk") Integer idProduk,@Param("idRuangan") Integer idRuangan, @Param("asalProdukId") Integer asalProdukId);*/
	
	@Query("select p from StokProdukGlobal p where p.ruangan.id=:idRuangan and p.produk.id=:idProduk  ")
	List<StokProdukGlobal> findStokWitAsalProduk(@Param("idProduk") Integer idProduk,@Param("idRuangan") Integer idRuangan);
	
	
	
	@Query("select p from KartuStok p where p.produk.id=:idProduk")
	List<KartuStok> findKartuStok(@Param("idProduk") Integer idProduk);
	
	@Query("select b.produk.id,b.produk.namaProduk,b.qtyProdukOnHand from StokProdukGlobal b where b.produk.generik.id=:generikId and b.produk.id in "+
			"(select id from Produk c where c.detailJenisProduk.id in (select id from DetailJenisProduk d where d.jenisProduk.id=(Select cast(s.nilaiField as int) from  SettingDataFixed s where s.namaField='KdObatObatGenerik' ) and d.statusEnabled =true))")
	List<Object[]> findProdukObatAndStok2(@Param("generikId") Integer generikId);

	@Query("select q.id,q.namaProduk,s.qtyProduk "+ 
			"from MapGenerikToProduk p,StokProdukGlobal s "+
			"left join p.produk q "+
			"left join p.generik r "+
			"where q.id=s.produk.id and r.id=:generikId and s.ruangan.id=(Select cast(s.nilaiField as int) from  SettingDataFixed s where s.namaField='KdRuanganFarmasi' )")
	List<Object[]> findProdukObatAndStok(@Param("generikId") Integer generikId);

	@Query("select coalesce(sum(p.qtyProduk),0) from StokProdukGlobal p where p.ruangan.id=:idRuangan and p.produk.id=:idProduk ")
	Double findStokCount(@Param("idProduk") Integer idProduk,@Param("idRuangan") Integer idRuangan);


	@Query("select p from StokProdukGlobal p where p.ruangan.id=:idRuangan and p.produk.id=:idProduk ")
	List<StokProdukGlobal> findStok(@Param("idProduk") Integer idProduk,@Param("idRuangan") Integer idRuangan);

	@Query("select p from StokProdukGlobal p where p.ruangan.id=:idRuangan and p.produk.id=:idProduk ")
	List<StokProdukGlobal> findHargaJual(@Param("idRuangan") Integer idRuangan,@Param("idProduk") Integer idProduk);
	
	@Query("select q.id,q.namaProduk,s.qtyProduk "+ 
			"from MapGenerikToProduk p,StokProdukGlobal s "+
			"left join p.produk q "+
			"left join p.generik r "+
			"where q.id=s.produk.id and s.ruangan.id=(Select cast(s.nilaiField as int) from  SettingDataFixed s where s.namaField='KdRuanganFarmasi' )")
	List<Object[]> findProdukObatAndStok();

	@Query("select model from StokProdukGlobal model "
			+ "left join model.produk produk "
			+ "left join model.ruangan ruangan "
			+ "where produk.id=:produkId and ruangan.id=:ruanganId")
	StokProdukGlobal findbyProdukAndRuangan(@Param("produkId")Integer produkId, @Param("ruanganId")Integer ruanganId);
	
	@Query("select a.hargaNetto1 from StokProdukGlobal a "
			+ "left join a.produk b where b.id=:produkId")
	Double findByIdProduk(@Param("produkId") Integer produkId);

}
