package com.jasamedika.medifirst2000.service.impl;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.jpa.JpaSystemException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.jasamedika.medifirst2000.converter.PapPengambilanSpesimenConverter;
import com.jasamedika.medifirst2000.dao.AntrianPasienDiPeriksaDao;
import com.jasamedika.medifirst2000.dao.OrderPelayananDao;
import com.jasamedika.medifirst2000.dao.PapPengambilanSpesimenDao;
import com.jasamedika.medifirst2000.dao.PasienDaftarDao;
import com.jasamedika.medifirst2000.dao.PelayananPasienDao;
import com.jasamedika.medifirst2000.dto.PiutangRekananProfileTemp;
import com.jasamedika.medifirst2000.entities.AntrianPasienDiPeriksa;
import com.jasamedika.medifirst2000.entities.AsalProduk;
import com.jasamedika.medifirst2000.entities.GolonganAsuransi;
import com.jasamedika.medifirst2000.entities.HubunganKeluarga;
import com.jasamedika.medifirst2000.entities.JenisTarif;
import com.jasamedika.medifirst2000.entities.Kelas;
import com.jasamedika.medifirst2000.entities.KomponenHarga;
import com.jasamedika.medifirst2000.entities.ObservasiIGD;
import com.jasamedika.medifirst2000.entities.OrderPelayanan;
import com.jasamedika.medifirst2000.entities.Paket;
import com.jasamedika.medifirst2000.entities.PapPengambilanSpesimen;
import com.jasamedika.medifirst2000.entities.PasienDaftar;
import com.jasamedika.medifirst2000.entities.PelayananPasien;
import com.jasamedika.medifirst2000.entities.StrukOrder;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.PapPengambilanSpesimenService;
import com.jasamedika.medifirst2000.service.PelayananPiutangRekananService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.PapPengambilanSpesimenCustomVO;
import com.jasamedika.medifirst2000.vo.PapPengambilanSpesimenVO;

@Service("papPengambilanSpesimenService")
public class PapPengambilanSpesimenServiceImpl implements PapPengambilanSpesimenService {
	
	@Autowired
	private PapPengambilanSpesimenDao papPengambilanSpesimenDao;
	@Autowired
	private OrderPelayananDao orderPelayananDao;
	
	
	@Autowired
	private PasienDaftarDao pasienDaftarDao;
	
	@Autowired
	private PapPengambilanSpesimenConverter papPengambilanSpesimenConverter;
	
	@Autowired
	private PelayananPiutangRekananService pelayananPiutangRekananService;
	@Autowired
	private PelayananPasienDao pelayananPasienDao;

	@Override
	public PapPengambilanSpesimenCustomVO add(PapPengambilanSpesimenCustomVO vo)
			throws JpaSystemException, ServiceVOException {
		return null;
	}
	@Override
	public PapPengambilanSpesimenCustomVO update(PapPengambilanSpesimenCustomVO vo)
			throws JpaSystemException, ServiceVOException {
		return null;
	}
	@Override
	public Boolean delete(String key) throws JpaSystemException {
		return null;
	}
	@Override
	public PapPengambilanSpesimenCustomVO findById(String key) throws JpaSystemException {
		return null;
	}
	@Override
	public List<PapPengambilanSpesimenCustomVO> findAll() throws JpaSystemException {
		return null;
	}
	@Override
	public Map<String, Object> findAllWithPageAndLimitAndSortByAndDirectionParameter(Integer page, Integer limit,
			String sort, String dir) {
		return null;
	}
	
	@Override
	public Map<String, Object> findByNoOrderAndTglOrder(String noOrder, Date tglOrder) {
		Map<String,Object> result=new HashMap<String,Object>();
		PapPengambilanSpesimen resultModel=papPengambilanSpesimenDao.finByNoOrderAndTglOrder(noOrder, tglOrder);
		if(CommonUtil.isNotNullOrEmpty(resultModel)){
			result.put("Jumlah", resultModel.getJumlah());
			result.put("pasien", resultModel.getPasien());
			result.put("dataFound", true);
			if(CommonUtil.isNotNullOrEmpty(resultModel.getStrukOrder().getNoOrder())){
				result.put("StrukOrder.noOrder", resultModel.getStrukOrder().getNoOrder());
			}
		}else{
			result.put("dataFound", false);
		}
		return result;
	}
	
	@Override
	public PapPengambilanSpesimen findByNoOrderAndTglOrder2(String noOrder, Date tglOrder) {
		PapPengambilanSpesimen resultModel=papPengambilanSpesimenDao.finByNoOrderAndTglOrder(noOrder, tglOrder);
		
		return resultModel;
	}
	
	@Autowired
	private AntrianPasienDiPeriksaDao antrianPasienDiPeriksaDao;
	@Override
	public Map<String, Object> savePapPengambilanSpesimen(PapPengambilanSpesimenCustomVO vo) {
		Map<String,Object> result=new HashMap<String,Object>();
		for(PapPengambilanSpesimenVO vos : vo.getPengambilanSpesimen())
		{
			PapPengambilanSpesimen model = papPengambilanSpesimenConverter.transferVOToModel(vos, new PapPengambilanSpesimen());			
			PapPengambilanSpesimen modelSpesimen  = new PapPengambilanSpesimen();
			modelSpesimen.setJumlah(model.getJumlah());
			modelSpesimen.setTglAmbilSpesimen(model.getTglAmbilSpesimen());
			//modelSpesimen.setBahanSample(model.getBahanSample());	
			modelSpesimen.setStrukOrder(model.getStrukOrder());
			if(vo.getNoRec()==null)
			modelSpesimen.setPasien(antrianPasienDiPeriksaDao.finByNoIdAndTglRegistrasi(Short.parseShort("0"), vos.getPasien().getId(), vo.getTglRegistrasi()));
			else
				modelSpesimen.setPasien(antrianPasienDiPeriksaDao.findOne(vo.getNoRec()));	
			modelSpesimen.setStrukOrder(modelSpesimen.getPasien().getStrukOrder());
			PapPengambilanSpesimen modelResult = papPengambilanSpesimenDao.save(modelSpesimen);
			if(CommonUtil.isNotNullOrEmpty(modelResult))
			{
				result.put("noRec", modelResult.getNoRec());
				//result.put("Bahan Sample", modelResult.getBahanSample().getNamaBahanSample());
			}
		}
		return result;
	}
	@Override
	public Map<String, Object> updatePapPengambilanSpesimen(PapPengambilanSpesimenCustomVO vo) {
		Map<String,Object> result=new HashMap<String,Object>();
//		for(PapPengambilanSpesimenVO vos : vo.getPengambilanSpesimen())
//		{
//			
//			PapPengambilanSpesimen modelSpesimen  = papPengambilanSpesimenDao.findPapPengambilanSpesimenByNoRec(vos.getNoRec());
//			papPengambilanSpesimenDao.delete(modelSpesimen);			
//			
//		}
		for(PapPengambilanSpesimenVO vos : vo.getPengambilanSpesimen())
		{
			
			PapPengambilanSpesimen modelSpesimen  = papPengambilanSpesimenDao.findPapPengambilanSpesimenByNoRec(vos.getNoRec());
			
			modelSpesimen.setJumlah(papPengambilanSpesimenConverter.transferVOToModel(vos, new PapPengambilanSpesimen()).getJumlah());
			modelSpesimen.setTglAmbilSpesimen(papPengambilanSpesimenConverter.transferVOToModel(vos, new PapPengambilanSpesimen()).getTglAmbilSpesimen());
			modelSpesimen.setBahanSample(papPengambilanSpesimenConverter.transferVOToModel(vos, new PapPengambilanSpesimen()).getBahanSample());	
			modelSpesimen.setStrukOrder(papPengambilanSpesimenConverter.transferVOToModel(vos, new PapPengambilanSpesimen()).getStrukOrder());
			modelSpesimen.setPasien(antrianPasienDiPeriksaDao.finByNoIdAndTglRegistrasi(Short.parseShort("0"), vos.getPasien().getId(), vos.getTglRegistrasi()));			
			PapPengambilanSpesimen modelResult = papPengambilanSpesimenDao.save(modelSpesimen);
			if(CommonUtil.isNotNullOrEmpty(modelResult))
			{
				result.put("noRec", modelResult.getNoRec());
				//result.put("Bahan Sample", modelResult.getBahanSample().getNamaBahanSample());
			}	
		
		}
		
		return result;
	}
	@Override
	@Transactional(readOnly = false)
	public Map<String, Object> updatePemeriksaan(String[] listOrderPelayanan) {
		Map<String,Object> result=new HashMap<String,Object>();
		try
		{
			for(String noRec : listOrderPelayanan)
			{
				System.out.println("VERIFIKASI-RADIOLOGI : "+noRec);
				OrderPelayanan order = orderPelayananDao.findById(noRec);
				order.setKeteranganLainnya("Sudah diverifikasi");
				OrderPelayanan hasil=orderPelayananDao.save(order);
				StrukOrder strukOrder=order.getStrukOrder();
				PasienDaftar pasienDaftar=strukOrder.getNoRegistrasi();
				/*List<AntrianPasienDiPeriksa> antrian=antrianPasienDiPeriksaDao.findByPasienDaftar(pasienDaftar.getNoRec());
				for(AntrianPasienDiPeriksa abc:antrian){
					System.out.println("LAB : " +abc.getNoRec());
					System.out.println("LAB : " +abc.getRuangan());
				}*/
				AntrianPasienDiPeriksa antrian=antrianPasienDiPeriksaDao.findByStrukOrderNoRec(strukOrder.getNoRec());
				System.out.println("LAB 2 : " +antrian.getNoRec());
				PelayananPasien pelayanan=new PelayananPasien();
				pelayanan.setStrukOrder(hasil.getNoOrder());
				pelayanan.setProduk(hasil.getProduk());
				pelayanan.setJumlah(1.0);
				pelayanan.setTglPelayanan(hasil.getTglPelayanan());
				pelayanan.setPasien(antrian);
				Map<String, Object> map=pelayananPiutangRekananService.getHargaPiutangRekananProfile(antrian.getNoRec(), 
						hasil.getProduk(), hasil.getJumlah(), 0);
				List<PiutangRekananProfileTemp> listPiutangRekananProfileTemp=(List<PiutangRekananProfileTemp>) map.get("list");
				Double mapHargaCito=0.0;
				Double mapHargaSatuan=0.0;
				Double mapHargaDiskon=0.0;
				Double mapHargaNetto=0.0;
				Double mapHargaPiutangRekanan=0.0;
				Double mapHargaPiutangProfile=0.0;
				for(PiutangRekananProfileTemp abcd:listPiutangRekananProfileTemp){
					mapHargaCito=Double.valueOf(abcd.getHargaCito());
					mapHargaSatuan=Double.valueOf(abcd.getHargaSatuan());
					mapHargaDiskon=Double.valueOf(abcd.getHargaDiskon());
					mapHargaNetto=Double.valueOf(abcd.getHargaNetto());
					mapHargaPiutangRekanan=Double.valueOf(abcd.getHargaPiutangRekanan());
					mapHargaPiutangProfile=Double.valueOf(abcd.getHargaPiutangProfile());
				}
				
				Double hargaSatuan=mapHargaSatuan;
				Double hargaJual=mapHargaSatuan;
				Double hargaNetto=mapHargaNetto;
				Double hargaPiutangPenjamin=mapHargaPiutangRekanan;
				Double hargaPiutangRumahSakit=mapHargaPiutangProfile;
				pelayanan.setHargaJual(hargaJual);
				pelayanan.setHargaSatuan(hargaSatuan);
				pelayanan.setHargaNetto(hargaNetto);
				pelayanan.setPiutangPenjamin(hargaPiutangPenjamin);
				pelayanan.setPiutangRumahSakit(hargaPiutangRumahSakit);
				pelayanan.setStock(1.0);
				pelayananPasienDao.save(pelayanan);
			}	
			result.put("statusCode", 200);
		}
		catch(Exception ex)
		{
			result.put("statusCode", 404);
		}
		
		
		return result;
	}
	
	
	
}
