package com.jasamedika.medifirst2000.service.impl;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

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

import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.KamarDao;
import com.jasamedika.medifirst2000.dao.TempatTidurDao;
import com.jasamedika.medifirst2000.entities.AntrianPasienDiPeriksa;
import com.jasamedika.medifirst2000.entities.JadwalDpjpRawatInap;
import com.jasamedika.medifirst2000.entities.Kamar;
import com.jasamedika.medifirst2000.entities.Kelas;
import com.jasamedika.medifirst2000.entities.MapPasienDpjpToPasienDaftar;
import com.jasamedika.medifirst2000.entities.PasienDaftar;
import com.jasamedika.medifirst2000.entities.RegistrasiPelayananPasien;
import com.jasamedika.medifirst2000.entities.StatusBed;
import com.jasamedika.medifirst2000.entities.TempatTidur;
import com.jasamedika.medifirst2000.service.AntrianPasienDiPeriksaService;
import com.jasamedika.medifirst2000.service.MasukKamarService;
import com.jasamedika.medifirst2000.service.PasienDaftarService;
import com.jasamedika.medifirst2000.service.PersetujuanUmumService;
import com.jasamedika.medifirst2000.service.RegistrasiPelayananPasienService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.DateUtil;
import com.jasamedika.medifirst2000.vo.JadwalDpjpRawatInapVO;
import com.jasamedika.medifirst2000.vo.MapPasienDpjpToPasienDaftarVO;
import com.jasamedika.medifirst2000.vo.MasukKamarVO;


@Service("masukKamarService")
public class MasukKamarServiceImpl extends BaseVoServiceImpl implements MasukKamarService {
	
	@Autowired
	private PasienDaftarService pasienDaftarService;
	
	@Autowired
	private RegistrasiPelayananPasienService registrasiPelayananPasienService;
	
	@Autowired
	private AntrianPasienDiPeriksaService antrianPasienDiPeriksaService;
	
	@Autowired
	private BaseConverterImpl<MapPasienDpjpToPasienDaftarVO, MapPasienDpjpToPasienDaftar> mapPasienDpjpToPasienDaftarConverter;
	
	@Autowired
	private BaseConverterImpl<JadwalDpjpRawatInapVO, JadwalDpjpRawatInap> jadwalDpjpRawatInapConverter;
	
	@Autowired
	private KamarDao kamarDao;

	@Autowired
	private TempatTidurDao tempatTidurDao;
	
	@Override
	@Transactional(readOnly=false)
	public Map<String, Object> saveMasukKamar(MasukKamarVO vo) {
		Map<String,Object> resultMessages=new HashMap<String,Object>();
		
		if(CommonUtil.isNotNullOrEmpty(vo)){
			Map<String,Object> resusltPasienDaftar=pasienDaftarService.updatePasienDaftarFromMasukKamar(vo);
			
			Kamar kamar = kamarDao.findOne(vo.getKamar().getId());
			
			if(CommonUtil.isNotNullOrEmpty(resusltPasienDaftar)){
				PasienDaftar pasienDaftar = ((PasienDaftar) resusltPasienDaftar.get("pasienDaftar"));
				
				if(CommonUtil.isNotNullOrEmpty(pasienDaftar)){
					if(CommonUtil.isNotNullOrEmpty(vo.getKamar())){
						pasienDaftar.setRuangan(kamar.getRuangan());
					}
					
					if(CommonUtil.isNotNullOrEmpty(vo.getKelas())){
						pasienDaftar.setKelas(BaseConverterImpl.transferVOToModelData(vo.getKelas(), new Kelas()));
						pasienDaftar.setTglPulang(null);
					}
					
					if(CommonUtil.isNotNullOrEmpty(vo.getMapPasienDpjpToPasienDaftar())){
						Set<MapPasienDpjpToPasienDaftar> mapPasienDpjpToPasienDaftarSet = new HashSet<MapPasienDpjpToPasienDaftar>();
						
						for(MapPasienDpjpToPasienDaftarVO modelVO : vo.getMapPasienDpjpToPasienDaftar()){
							MapPasienDpjpToPasienDaftar mapPasienDpjpToPasienDaftar = new MapPasienDpjpToPasienDaftar();
						
							if(CommonUtil.isNotNullOrEmpty(modelVO)){
								mapPasienDpjpToPasienDaftar = mapPasienDpjpToPasienDaftarConverter.transferVOToModel(modelVO, new MapPasienDpjpToPasienDaftar());
								mapPasienDpjpToPasienDaftar.setTglInput(DateUtil.now());
							}
							if(CommonUtil.isNotNullOrEmpty(pasienDaftar)){
								mapPasienDpjpToPasienDaftar.setPasienDaftar(pasienDaftar);
							}
							if(CommonUtil.isNotNullOrEmpty(modelVO.getJadwalDpjp())){
								mapPasienDpjpToPasienDaftar.setJadwalDpjp(jadwalDpjpRawatInapConverter.transferVOToModel(modelVO.getJadwalDpjp(), new JadwalDpjpRawatInap()));
							}
							if(CommonUtil.isNotNullOrEmpty(mapPasienDpjpToPasienDaftar)){
								mapPasienDpjpToPasienDaftarSet.add(mapPasienDpjpToPasienDaftar);
							}
						}
						
						if(CommonUtil.isNotNullOrEmpty(mapPasienDpjpToPasienDaftarSet)){
							pasienDaftar.setMapPasienDpjpToPasienDaftar(mapPasienDpjpToPasienDaftarSet);
						}
					}			
				}
				
				if(CommonUtil.isNotNullOrEmpty(pasienDaftar)){
					antrianPasienDiPeriksaService.saveAntrianPasienDiperiksaFromMasukKamar(pasienDaftar);
					//-----------------------------------------------------------------------------------
					Map<String,Object> resultRegistrasiPelayananPasien = registrasiPelayananPasienService.createRegistrasiPelayananPasienFromMasukRuangan(pasienDaftar,vo);
					RegistrasiPelayananPasien registrasiPelayananPasien = ((RegistrasiPelayananPasien) resultRegistrasiPelayananPasien.get("registrasiPelayananPasien"));
					if(CommonUtil.isNotNullOrEmpty(registrasiPelayananPasien)){
						resultMessages.put("noRec", registrasiPelayananPasien.getNoRec());
					}
					//-----------------------------------------------------------------------------------
					if(CommonUtil.isNotNullOrEmpty(kamar)){
						
						Integer jumlahKamarIsi = kamar.getJumlaKamarIsi()+1;
						if(CommonUtil.isNotNullOrEmpty(jumlahKamarIsi)){
							kamar.setJumlaKamarIsi(jumlahKamarIsi);
						}
						
						Integer jumlahKamarKosong = kamar.getJumlaKamarKosong()-1;
						if(CommonUtil.isNotNullOrEmpty(jumlahKamarKosong)){
							kamar.setJumlaKamarKosong(jumlahKamarKosong);
						}
						
						if(CommonUtil.isNotNullOrEmpty(kamar)){
							kamarDao.save(kamar);
						}
					}
					
					if(CommonUtil.isNotNullOrEmpty(vo.getTempatTidur())){
						TempatTidur tempatTidur = tempatTidurDao.findOne(vo.getTempatTidur().getId());
						StatusBed statusBed = new StatusBed();
						statusBed.setId(1);
						
						if(CommonUtil.isNotNullOrEmpty(statusBed)){
							tempatTidur.setStatusBed(statusBed);
						}
						if(CommonUtil.isNotNullOrEmpty(statusBed)){
							tempatTidurDao.save(tempatTidur);
						}
					}
					
				}
			}
		}
		return resultMessages;
	}
	
	public void saveMasukKamarDaftarRawatInap(MasukKamarVO vo, PasienDaftar pasienDaftar){
		if(CommonUtil.isNotNullOrEmpty(vo)){
			
			Kamar kamar = kamarDao.findOne(vo.getKamar().getId());
			
			if(CommonUtil.isNotNullOrEmpty(pasienDaftar)){
				
				if(CommonUtil.isNotNullOrEmpty(pasienDaftar)){
					if(CommonUtil.isNotNullOrEmpty(vo.getKamar())){
						pasienDaftar.setRuangan(kamar.getRuangan());
					}
					
					if(CommonUtil.isNotNullOrEmpty(vo.getKelas())){
						pasienDaftar.setKelas(BaseConverterImpl.transferVOToModelData(vo.getKelas(), new Kelas()));
						pasienDaftar.setTglPulang(null);
					}
				}			
			}
			
			if(CommonUtil.isNotNullOrEmpty(kamar)){
				
				Integer jumlahKamarIsi = kamar.getJumlaKamarIsi()+1;
				if(CommonUtil.isNotNullOrEmpty(jumlahKamarIsi)){
					kamar.setJumlaKamarIsi(jumlahKamarIsi);
				}
				
				Integer jumlahKamarKosong = kamar.getJumlaKamarKosong()-1;
				if(CommonUtil.isNotNullOrEmpty(jumlahKamarKosong)){
					kamar.setJumlaKamarKosong(jumlahKamarKosong);
				}
				
				if(CommonUtil.isNotNullOrEmpty(kamar)){
					kamarDao.save(kamar);
				}
			}
			
			if(CommonUtil.isNotNullOrEmpty(vo.getTempatTidur())){
				TempatTidur tempatTidur = tempatTidurDao.findOne(vo.getTempatTidur().getId());
				StatusBed statusBed = new StatusBed();
				statusBed.setId(1);
				
				if(CommonUtil.isNotNullOrEmpty(statusBed)){
					tempatTidur.setStatusBed(statusBed);
				}
				if(CommonUtil.isNotNullOrEmpty(statusBed)){
					tempatTidurDao.save(tempatTidur);
				}
			}
		}
	}

}
