package com.jasamedika.medifirst2000.service.impl;

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

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

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.HubunganKeluargaConverter;
import com.jasamedika.medifirst2000.converter.KondisiPasienConverter;
import com.jasamedika.medifirst2000.converter.StatusPulangConverter;
import com.jasamedika.medifirst2000.dao.PasienDaftarDao;
import com.jasamedika.medifirst2000.dao.PasienDao;
import com.jasamedika.medifirst2000.dao.PasienMeninggalDao;
import com.jasamedika.medifirst2000.dao.RegistrasiPelayananPasienDao;
import com.jasamedika.medifirst2000.entities.HubunganKeluarga;
import com.jasamedika.medifirst2000.entities.KondisiPasien;
import com.jasamedika.medifirst2000.entities.Pasien;
import com.jasamedika.medifirst2000.entities.PasienDaftar;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.PenyebabKematian;
import com.jasamedika.medifirst2000.entities.StatusPulang;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.PasienDaftarService;
import com.jasamedika.medifirst2000.service.PasienMeninggalService;
import com.jasamedika.medifirst2000.service.PasienPulangService;
import com.jasamedika.medifirst2000.service.PasienService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.PasienDaftarVO;
import com.jasamedika.medifirst2000.vo.PasienMeninggalVO;
import com.jasamedika.medifirst2000.vo.PasienPulangVO;

/**
 * Implement class for RegistrasiPasienService
 * 
 * @author Adik
 * @param <T>
 */
@Service("pasienMeninggalService")
public class PasienMeninggalServiceImpl extends BaseVoServiceImpl implements PasienMeninggalService{

	@Autowired
	private PasienDaftarService pasienDaftarService;
	
	@Autowired
	private PasienService pasienService;
	
	@Autowired
	private RegistrasiPelayananPasienDao registrasiPelayananPasienDao;
	
	@Autowired
	private PasienDaftarDao pasienDaftarDao;
	
	@Autowired
	private PasienMeninggalDao pasienMeninggalDao;
	
	@Autowired
	private PasienDao pasienDao;
	
	@Transactional(readOnly=false)
	public Map<String, Object> updatePasienMeninggal(PasienMeninggalVO vo) {
		Map<String,Object>result=new HashMap<String,Object>();
		if(CommonUtil.isNotNullOrEmpty(vo.getPasienDaftar())){
			if(CommonUtil.isNotNullOrEmpty(vo.getPasienDaftar().getNoRec())){
				PasienDaftar pasienDaftar = pasienDaftarDao.findOne(vo.getPasienDaftar().getNoRec());
				if(CommonUtil.isNotNullOrEmpty(pasienDaftar)){
					pasienDaftar.setTanggalMeninggal(vo.getTanggalMeninggal());
					pasienDaftarService.updateTanggalMeninggal(pasienDaftar);
					
					Pasien pasien=pasienDao.findOne(pasienDaftar.getPasienId());
					pasien.setTanggalMeninggal(vo.getTanggalMeninggal());
					pasienService.updateTanggalMeninggal(pasien);
					result.put("noCm", pasien.getNoCm());
					result.put("noRegistrasi",pasienDaftar.getNoRegistrasi());
					result.put("dataFound", true);
				}else{
					result.put("dataFound", false);
				}
				
			}
		}
		return result;
	}
	
	@Override
	public Map<String, Object> loadPasienMeninggal(String noCm) {
		Map<String, Object> result = new HashMap<>();
		
		if(CommonUtil.isNotNullOrEmpty(noCm)){
			List<Map<String, Object>> listDokterbyRuangan = pasienMeninggalDao.getDokterPemeriksa(noCm);
			List<Map<String, Object>> listPenyebabKematian = pasienMeninggalDao.getPenyebabKematian();
			
			result.put("listDokterDiRuangan", listDokterbyRuangan);
			result.put("listPenyebabKematian", listPenyebabKematian);
		} 
		
		return result;
	}

	@Override
	public Map<String, Object> savePasienMeninggal(Map<String, Object> map){
		Map<String, Object> result = new HashMap<>();
		PasienDaftar pasienDaftar = pasienDaftarDao.findOne((String)map.get("noRec"));
		
		if(CommonUtil.isNotNullOrEmpty((Date)map.get("tanggalMeninggal"))){
			pasienDaftar.setTanggalMeninggal((Date) map.get("tanggalMeninggal"));
		}
		if(CommonUtil.isNotNullOrEmpty((PenyebabKematian)map.get("penyebabKematian"))){
			pasienDaftar.setPenyebabKematian((PenyebabKematian) map.get("penyebabKematian"));
		}
		if(CommonUtil.isNotNullOrEmpty((Pegawai)map.get("dokterPemeriksa"))){
			pasienDaftar.setDokterPemeriksa((Pegawai) map.get("dokterPemeriksa"));
		}
		return result;
	}
	
	@Override
	public Map<String, Object> loadRencanaPindah(String noRec){
		Map<String, Object> result = new HashMap<>();
		Map<String, Object> atributPasien = registrasiPelayananPasienDao.loadRencanaPindah(noRec);
		if(CommonUtil.isNotNullOrEmpty(atributPasien)){
			result.put("atributPasien", atributPasien);
		}
		return result;
	}
	
	@Override
	public Map<String, Object> getKelasRencana(){
		Map<String, Object> result = new HashMap<>();
		List<Map<String, Object>> listData = pasienDao.getkelas();
		if(CommonUtil.isNotNullOrEmpty(listData)){
			result.put("listData", listData);
		}
		return result;
	}
	
	@Override
	public Map<String, Object> getRuanganByKelas(Integer id){
		Map<String, Object> result = new HashMap<>();
		List<Map<String, Object>> listData = pasienDao.getRuanganByKelas(id);
		if(CommonUtil.isNotNullOrEmpty(listData)){
			result.put("listData", listData);
		}
		return result;
	}
	
	@Override
	public Map<String, Object> getKamarByRuangan(Integer id){
		Map<String, Object> result = new HashMap<>();
		List<Map<String, Object>> listData = pasienDao.getKamarByRuangan(id);
		if(CommonUtil.isNotNullOrEmpty(listData)){
			result.put("listData", listData);
		}
		return result;
	}
	
	@Override
	public Map<String, Object> getKasurByKamar(Integer id){
		Map<String, Object> result = new HashMap<>();
		List<Map<String, Object>> listData = pasienDao.getKasurByKamar(id);
		if(CommonUtil.isNotNullOrEmpty(listData)){
			result.put("listData", listData);
		}
		return result;
	}

}
