package com.jasamedika.medifirst2000.service.impl;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
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.Isolation;
import org.springframework.transaction.annotation.Transactional;
import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.AntrianPasienDiPeriksaDao;
import com.jasamedika.medifirst2000.dao.JadwalDokterDao;
import com.jasamedika.medifirst2000.dao.KelasDao;
import com.jasamedika.medifirst2000.dao.MapPasienBayiToPasienIbuDao;
import com.jasamedika.medifirst2000.dao.PasienDaftarDao;
import com.jasamedika.medifirst2000.dao.PasienDao;
import com.jasamedika.medifirst2000.dao.PelayananPasienDao;
import com.jasamedika.medifirst2000.dao.RuanganDao;
import com.jasamedika.medifirst2000.dao.RunningNumberDao;
import com.jasamedika.medifirst2000.dto.RuanganJumlah;
import com.jasamedika.medifirst2000.dto.StrukPelayananDto;
import com.jasamedika.medifirst2000.entities.Agama;
import com.jasamedika.medifirst2000.entities.Alamat;
import com.jasamedika.medifirst2000.entities.AntrianPasienDiPeriksa;
import com.jasamedika.medifirst2000.entities.AsalRujukan;
import com.jasamedika.medifirst2000.entities.CatatanPasien;
import com.jasamedika.medifirst2000.entities.DesaKelurahan;
import com.jasamedika.medifirst2000.entities.Diagnosa;
import com.jasamedika.medifirst2000.entities.Diputuskan;
import com.jasamedika.medifirst2000.entities.DiputuskanDetail;
import com.jasamedika.medifirst2000.entities.HubunganKeluarga;
import com.jasamedika.medifirst2000.entities.JadwalDokter;
import com.jasamedika.medifirst2000.entities.JenisAlamat;
import com.jasamedika.medifirst2000.entities.JenisKelamin;
import com.jasamedika.medifirst2000.entities.Kamar;
import com.jasamedika.medifirst2000.entities.KasusPenyakit;
import com.jasamedika.medifirst2000.entities.Kebangsaan;
import com.jasamedika.medifirst2000.entities.Kecamatan;
import com.jasamedika.medifirst2000.entities.Kelas;
import com.jasamedika.medifirst2000.entities.KelompokPasien;
import com.jasamedika.medifirst2000.entities.KondisiPasien;
import com.jasamedika.medifirst2000.entities.KotaKabupaten;
import com.jasamedika.medifirst2000.entities.LoginUser;
import com.jasamedika.medifirst2000.entities.MapPasienBayiToPasienIbu;
import com.jasamedika.medifirst2000.entities.Negara;
import com.jasamedika.medifirst2000.entities.Pasien;
import com.jasamedika.medifirst2000.entities.PasienDaftar;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.Pekerjaan;
import com.jasamedika.medifirst2000.entities.PemakaianAsuransi;
import com.jasamedika.medifirst2000.entities.PenanggungJawabPasien;
import com.jasamedika.medifirst2000.entities.Pendidikan;
import com.jasamedika.medifirst2000.entities.Propinsi;
import com.jasamedika.medifirst2000.entities.Rekanan;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.entities.RunningNumber;
import com.jasamedika.medifirst2000.entities.StatusKeluar;
import com.jasamedika.medifirst2000.entities.StatusPerkawinan;
import com.jasamedika.medifirst2000.entities.StatusPulang;
import com.jasamedika.medifirst2000.entities.StrukOrder;
import com.jasamedika.medifirst2000.entities.StrukRetur;
import com.jasamedika.medifirst2000.entities.TitlePasien;
import com.jasamedika.medifirst2000.enums.TipePasienEnum;
import com.jasamedika.medifirst2000.service.AntrianPasienDiPeriksaService;
import com.jasamedika.medifirst2000.service.PasienDaftarService;
import com.jasamedika.medifirst2000.service.RegistrasiPasienRawatInapService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.DateUtil;
import com.jasamedika.medifirst2000.util.StringUtil;
import com.jasamedika.medifirst2000.vo.AgamaVO;
import com.jasamedika.medifirst2000.vo.AlamatVO;
import com.jasamedika.medifirst2000.vo.AntrianPasienDiPeriksaVO;
import com.jasamedika.medifirst2000.vo.AsalRujukanVO;
import com.jasamedika.medifirst2000.vo.CatatanPasienVO;
import com.jasamedika.medifirst2000.vo.DesaKelurahanVO;
import com.jasamedika.medifirst2000.vo.DiagnosaVO;
import com.jasamedika.medifirst2000.vo.DiputuskanDetailVO;
import com.jasamedika.medifirst2000.vo.DiputuskanVO;
import com.jasamedika.medifirst2000.vo.HubunganKeluargaVO;
import com.jasamedika.medifirst2000.vo.JenisAlamatVO;
import com.jasamedika.medifirst2000.vo.JenisKelaminVO;
import com.jasamedika.medifirst2000.vo.KamarVO;
import com.jasamedika.medifirst2000.vo.KasusPenyakitVO;
import com.jasamedika.medifirst2000.vo.KebangsaanVO;
import com.jasamedika.medifirst2000.vo.KecamatanVO;
import com.jasamedika.medifirst2000.vo.KelasVO;
import com.jasamedika.medifirst2000.vo.KelompokPasienVO;
import com.jasamedika.medifirst2000.vo.KondisiPasienVO;
import com.jasamedika.medifirst2000.vo.KotaKabupatenVO;
import com.jasamedika.medifirst2000.vo.LoginUserVO;
import com.jasamedika.medifirst2000.vo.NegaraVO;
import com.jasamedika.medifirst2000.vo.PasienDaftarVO;
import com.jasamedika.medifirst2000.vo.PasienVO;
import com.jasamedika.medifirst2000.vo.PegawaiVO;
import com.jasamedika.medifirst2000.vo.PekerjaanVO;
import com.jasamedika.medifirst2000.vo.PemakaianAsuransiVO;
import com.jasamedika.medifirst2000.vo.PenanggungJawabPasienVO;
import com.jasamedika.medifirst2000.vo.PendidikanVO;
import com.jasamedika.medifirst2000.vo.PropinsiVO;
import com.jasamedika.medifirst2000.vo.RegistrasiPelayananVO;
import com.jasamedika.medifirst2000.vo.RekananVO;
import com.jasamedika.medifirst2000.vo.RuanganVO;
import com.jasamedika.medifirst2000.vo.StatusKeluarVO;
import com.jasamedika.medifirst2000.vo.StatusPerkawinanVO;
import com.jasamedika.medifirst2000.vo.StatusPulangVO;
import com.jasamedika.medifirst2000.vo.StrukOrderVO;
import com.jasamedika.medifirst2000.vo.StrukReturVO;
import com.jasamedika.medifirst2000.vo.TitlePasienVO;

@Service("RegistrasiPasienRawatInapService")
public class RegistrasiPasienRawatInapServiceImpl implements RegistrasiPasienRawatInapService{
	
	@Autowired
	private PasienDao pasienDao;
	
	@Autowired
	private PasienDaftarDao pasienDaftarDao;
	
	@Autowired
	private RuanganDao ruanganDao;

	@Autowired
	private KelasDao kelasDao;
	
	@Autowired
	private RunningNumberDao runningNumberDao;
	
	@Autowired
	private JadwalDokterDao jadwalDokterDao;
	
	@Autowired
	private AntrianPasienDiPeriksaDao antrianPasienDiPeriksaDao;
	
	//--------------------------------------------------------------------------------------------------------------------------
	
	@Autowired
	private PasienDaftarService pasienDaftarService;
	
	@Autowired
	private AntrianPasienDiPeriksaService antrianPasienDiPeriksaService;
	
	@Autowired
	private BaseConverterImpl<RekananVO, Rekanan> rekananConverter;
	
	@Autowired
	private BaseConverterImpl<PasienVO, Pasien> pasienConverter;
	
	@Autowired
	private BaseConverterImpl<HubunganKeluargaVO, HubunganKeluarga> hubunganKeluargaConverter;
	
	@Autowired
	private BaseConverterImpl<JenisKelaminVO, JenisKelamin> jenisKelaminConverter;
	
	@Autowired
	private BaseConverterImpl<AgamaVO, Agama> agamaConverter;
	
	@Autowired
	private BaseConverterImpl<PendidikanVO, Pendidikan> pendidikanConverter;
	
	@Autowired
	private BaseConverterImpl<PekerjaanVO, Pekerjaan> pekerjaanConverter;
	
	@Autowired
	private BaseConverterImpl<KebangsaanVO, Kebangsaan> kebangsaanConverter;
	
	@Autowired
	private BaseConverterImpl<NegaraVO, Negara> negaraConverter;
	
	@Autowired
	private BaseConverterImpl<StatusPerkawinanVO, StatusPerkawinan> statusPerkawinanConverter;
	
	@Autowired
	private BaseConverterImpl<CatatanPasienVO, CatatanPasien> catatanPasienConverter;
	
	@Autowired
	private BaseConverterImpl<TitlePasienVO, TitlePasien> titlePasienConverter;
	
	@Autowired
	private BaseConverterImpl<AlamatVO, Alamat> alamatConverter;
	
	@Autowired
	private BaseConverterImpl<JenisAlamatVO, JenisAlamat> jenisAlamatConverter;
	
	@Autowired
	private BaseConverterImpl<PropinsiVO, Propinsi> propinsiConverter;
	
	@Autowired
	private BaseConverterImpl<KecamatanVO, Kecamatan> kecamatanConverter;
	
	@Autowired
	private BaseConverterImpl<DesaKelurahanVO, DesaKelurahan> desaKelurahanConverter;
	
	@Autowired
	private BaseConverterImpl<KotaKabupatenVO, KotaKabupaten> kotaKabupatenConverter;
	
	@Autowired
	private BaseConverterImpl<LoginUserVO, LoginUser> loginUserConverter;
	
	@Autowired
	private BaseConverterImpl<KasusPenyakitVO, KasusPenyakit> kasusPenyakitConverter;

	@Autowired
	private BaseConverterImpl<AsalRujukanVO, AsalRujukan> asalRujukanConverter;

	@Autowired
	private BaseConverterImpl<RuanganVO, Ruangan> ruanganConverter;

	@Autowired
	private BaseConverterImpl<PegawaiVO, Pegawai> pegawaiConverter;

	@Autowired
	private BaseConverterImpl<KelompokPasienVO, KelompokPasien> kelompokPasienConverter;

	@Autowired
	private BaseConverterImpl<StrukOrderVO, StrukOrder> strukOrderConverter;

	@Autowired
	private BaseConverterImpl<PasienDaftarVO, PasienDaftar> pasienDaftarConverter;
	
	@Autowired
	private BaseConverterImpl<KelasVO, Kelas> kelasConverter;
	
	@Autowired
	private BaseConverterImpl<StatusKeluarVO, StatusKeluar> statusKeluarConverter;
	
	@Autowired
	private BaseConverterImpl<DiputuskanVO, Diputuskan> diputuskanConverter;
	
	@Autowired
	private BaseConverterImpl<PenanggungJawabPasienVO, PenanggungJawabPasien> penanggungJawabPasienConverter;
	
	@Autowired
	private BaseConverterImpl<StatusPulangVO, StatusPulang> statusPulangConverter;
	
	@Autowired
	private BaseConverterImpl<KondisiPasienVO, KondisiPasien> kondisiPasienConverter;
	
	@Autowired
	private BaseConverterImpl<AntrianPasienDiPeriksaVO, AntrianPasienDiPeriksa> antrianPasienDiperiksaConverter;
	
	@Autowired
	private BaseConverterImpl<StrukReturVO, StrukRetur> strukReturConverter;
	
	@Autowired
	private BaseConverterImpl<KamarVO, Kamar> kamarConverter;
	
	@Autowired
	private BaseConverterImpl<DiputuskanDetailVO, DiputuskanDetail> diputuskanDetailConverter;
	
	@Autowired
	private MapPasienBayiToPasienIbuDao mapPasienBayiToPasienIbuDao;

	//--------------------------------------------------------------------------------------------------------------------------
	
	@Override
	@Transactional(readOnly = false,isolation=Isolation.SERIALIZABLE)
	public Map<String, Object> registrasiPasien(PasienVO vo){
		Map<String, Object> result = new HashMap<>();
		Pasien pasien = new Pasien();

		if(CommonUtil.isNotNullOrEmpty(vo)){
			pasien = pasienConverter.transferVOToModel(vo, new Pasien());
			try{
				//010606
				RunningNumber runningNumber = runningNumberDao.findByResetAndKegunaan("0", "Pasien Bayi");
				//----------------------------------------------------------------------------------
				if(CommonUtil.isNullOrEmpty(runningNumber)){
					runningNumber = new RunningNumber();
					runningNumber.setReset("0");
					runningNumber.setNomerTerbaru((Integer)0);
				}
				if(runningNumber.getNomerTerbaru()==99) {
					runningNumber = new RunningNumber();
					runningNumber.setReset("0");
					runningNumber.setExtention(runningNumber.getExtention()+(Integer)1);
					runningNumber.setNomerTerbaru((Integer)0);
				}
				//----------------------------------------------------------------------------------
				if(CommonUtil.isNullOrEmpty(pasien.getNoCm())){
					Integer number=(runningNumber.getNomerTerbaru()+(Integer)1);
					runningNumber.setNomerTerbaru(runningNumber.getNomerTerbaru()+(Integer)1);
					String missNoCm = StringUtil.formatNumber(number.toString(), 2);
					
					if(runningNumber.getExtention().toString().length()<=5) {
						pasien.setNoCm("0"+runningNumber.getExtention()+missNoCm);
					} else {
						pasien.setNoCm(runningNumber.getExtention()+missNoCm);
					}
				}
			} catch(Exception ex){
				ex.printStackTrace();
			}
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getJamLahir())) {
			pasien.setJamLahir(vo.getJamLahir());
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getJenisKelamin())){
			pasien.setJenisKelamin(jenisKelaminConverter.transferVOToModel(vo.getJenisKelamin(), new JenisKelamin()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getAgama())){
			pasien.setAgama(agamaConverter.transferVOToModel(vo.getAgama(), new Agama()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getPendidikan())){
			pasien.setPendidikan(pendidikanConverter.transferVOToModel(vo.getPendidikan(), new Pendidikan()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getPekerjaan())){
			pasien.setPekerjaan(pekerjaanConverter.transferVOToModel(vo.getPekerjaan(), new Pekerjaan()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getKebangsaan())){
			pasien.setKebangsaan(kebangsaanConverter.transferVOToModel(vo.getKebangsaan(), new Kebangsaan()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getNegara())){
			pasien.setNegara(negaraConverter.transferVOToModel(vo.getNegara(), new Negara()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getStatusPerkawinan())){
			pasien.setStatusPerkawinan(statusPerkawinanConverter.transferVOToModel(vo.getStatusPerkawinan(), new StatusPerkawinan()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getTitle())){
			pasien.setTitlePasien(titlePasienConverter.transferVOToModel(vo.getTitle(), new TitlePasien()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getCatatanPasien())){
			Set<CatatanPasien> catatanPasienSet = new HashSet<>();
			
			for(CatatanPasienVO catatanPasienVO : vo.getCatatanPasien()){
				CatatanPasien catatanPasien = new CatatanPasien();
				
				if(CommonUtil.isNotNullOrEmpty(catatanPasienVO)){
					catatanPasien = catatanPasienConverter.transferVOToModel(catatanPasienVO, new CatatanPasien());
					catatanPasien.setPasien(pasien);
				}
				if(CommonUtil.isNotNullOrEmpty(catatanPasienVO.getDeskripsi())){
					catatanPasien.setDeskripsi(catatanPasienVO.getDeskripsi());
				}
				if(CommonUtil.isNotNullOrEmpty(catatanPasien)){
					catatanPasienSet.add(catatanPasien);
				}
			}
			if(CommonUtil.isNotNullOrEmpty(catatanPasienSet)){
				pasien.setCatatanPasien(catatanPasienSet);
			}
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getAlamats())){
			Set<Alamat> alamatSet = new HashSet<>();
			
			for(AlamatVO alamatVO : vo.getAlamats()){
				Alamat alamat = new Alamat();
				
				if(CommonUtil.isNotNullOrEmpty(alamatVO)){
					alamat = alamatConverter.transferVOToModel(alamatVO, new Alamat());
					//alamat.setIsPrimaryAddress(alamatVO.getIsPrimaryAddress());
					alamat.setPasien(pasien);
				}
				if(CommonUtil.isNotNullOrEmpty(alamatVO.getJenisAlamat())){
					alamat.setJenisAlamat(jenisAlamatConverter.transferVOToModel(alamatVO.getJenisAlamat(), new JenisAlamat()));
				}
				
				if(CommonUtil.isNotNullOrEmpty(alamatVO.getPropinsi())){
					alamat.setPropinsi(propinsiConverter.transferVOToModel(alamatVO.getPropinsi(), new Propinsi()));
				}
				
				if(CommonUtil.isNotNullOrEmpty(alamatVO.getNegara())){
					alamat.setNegara(negaraConverter.transferVOToModel(alamatVO.getNegara(), new Negara()));
				}
				
				if(CommonUtil.isNotNullOrEmpty(alamatVO.getRekanan())){
					alamat.setRekanan(rekananConverter.transferVOToModel(alamatVO.getRekanan(), new Rekanan()));
				}
				
				if(CommonUtil.isNotNullOrEmpty(alamatVO.getPegawai())){
					alamat.setPegawai(loginUserConverter.transferVOToModel(alamatVO.getPegawai(), new LoginUser()));
				}
				
				if(CommonUtil.isNotNullOrEmpty(alamatVO.getKecamatan())){
					alamat.setKecamatan(kecamatanConverter.transferVOToModel(alamatVO.getKecamatan(), new Kecamatan()));
				}
				
				if(CommonUtil.isNotNullOrEmpty(alamatVO.getDesaKelurahan())){
					alamat.setDesaKelurahan(desaKelurahanConverter.transferVOToModel(alamatVO.getDesaKelurahan(), new DesaKelurahan()));
				}
				
				if(CommonUtil.isNotNullOrEmpty(alamatVO.getHubunganKeluarga())){
					alamat.setHubunganKeluarga(hubunganKeluargaConverter.transferVOToModel(alamatVO.getHubunganKeluarga(), new HubunganKeluarga()));
				}
				
				if(CommonUtil.isNotNullOrEmpty(alamatVO.getKotaKabupaten())){
					alamat.setKotaKabupaten(kotaKabupatenConverter.transferVOToModel(alamatVO.getKotaKabupaten(), new KotaKabupaten()));
				}
				if(CommonUtil.isNotNullOrEmpty(alamat)){
					alamatSet.add(alamat);
				}
			}
			if(CommonUtil.isNotNullOrEmpty(alamatSet)){
				pasien.setAlamats(alamatSet);
			}
		}
		if(CommonUtil.isNotNullOrEmpty(pasien)){
			Pasien pasienResult = pasienDao.save(pasien);
			if(CommonUtil.isNotNullOrEmpty(pasienResult)) {
				MapPasienBayiToPasienIbu mapPasienBayiToPasienIbu = new MapPasienBayiToPasienIbu();
				
				if(CommonUtil.isNotNullOrEmpty(vo.getPasienIbu())) {
					Pasien pasienIbu = pasienDao.findOne(vo.getPasienIbu().getId());
					mapPasienBayiToPasienIbu.setNoCmIbu(pasienIbu);
				}
				if(CommonUtil.isNotNullOrEmpty(pasienResult)) {
					mapPasienBayiToPasienIbu.setNoCmBayi(pasienResult);
				}
				if(CommonUtil.isNotNullOrEmpty(mapPasienBayiToPasienIbu)) {
					mapPasienBayiToPasienIbuDao.save(mapPasienBayiToPasienIbu);
				}
				
				result.put("noCm", pasienResult.getNoCm());
				result.put("id", pasienResult.getId());
				result.put("namaPasien", pasienResult.getNamaPasien());
			}
		}
		return result;
	}
	//-----------------------------------------------------------------------------------------------------------------------
	
	@Autowired
	private PelayananPasienDao pelayananPasienDao;
	
	@Transactional(readOnly = false,isolation=Isolation.SERIALIZABLE)
	public Map<String, Object> registrasiRekamMedisPasien(PasienDaftarVO vo){
		Map<String, Object> result = new HashMap<>();
		String statusPasien = "";
		
		String KdDepartemenInstalasiRawatInap = pelayananPasienDao.getSettingDataFixed("KdDepartemenInstalasiRawatInap");
		
		if(CommonUtil.isNotNullOrEmpty(vo.getRuangan())){
			StrukPelayananDto checkPasienBayar = pasienDaftarDao.getPasienBayar(
					vo.getPasien().getPasienDaftar().getNoRec());
			if(CommonUtil.isNotNullOrEmpty(checkPasienBayar)){
				if(CommonUtil.isNotNullOrEmpty(checkPasienBayar.getTotalDiBayar())){
					if((checkPasienBayar.getTotalharusdibayar()-checkPasienBayar.getTotalDiBayar())==0.00){
						List<Map<String, Object>> checkPasienPulang = pasienDaftarDao.checkPasienPulang(
								vo.getPasien().getPasienDaftar().getNoRec(), Integer.parseInt(KdDepartemenInstalasiRawatInap));
						for(Map<String, Object> data : checkPasienPulang){
							if(CommonUtil.isNullOrEmpty(data.get("tglPulang"))){
								statusPasien = "Psien belum pulang";
								break;
							}
						}
					}
				} else{
					statusPasien = "Pasien belum menyelesaikan administrasi";
				}
			}
		}
		
		if(CommonUtil.isNullOrEmpty(statusPasien)){
			savePasienDaftar(vo);
		} else{
			result.put("statusPasien", statusPasien);
		}
		return result;
	}
	
	@Override
	public Map<String, Object> savePasienDaftar(PasienDaftarVO vo){
		Map<String, Object> result = new HashMap<>();
		
		PasienDaftar pasienDaftar = new PasienDaftar();
		
		if(CommonUtil.isNotNullOrEmpty(vo)){
			pasienDaftar = pasienDaftarConverter.transferVOToModel(vo, new PasienDaftar());
			pasienDaftar.setNoRegistrasi(pasienDaftarService.getFormatNumberByMonthYearByParameter(vo.getTglRegistrasi()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getRekanan())){
			pasienDaftar.setRekanan(rekananConverter.transferVOToModel(vo.getRekanan(), new Rekanan()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getKelas())){
			pasienDaftar.setKelas(kelasDao.findNonKelas());
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getStatusKeluar())){
			pasienDaftar.setStatusKeluar(statusKeluarConverter.transferVOToModel(vo.getStatusKeluar(), new StatusKeluar()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getKasusPenyakit())){
			pasienDaftar.setKasusPenyakit(kasusPenyakitConverter.transferVOToModel(vo.getKasusPenyakit(), new KasusPenyakit()));
			Integer countKasusPenyakit = pasienDaftarDao.checkStatuspasien(pasienDaftar.getKasusPenyakit().getId());
			if (countKasusPenyakit == 0 || countKasusPenyakit == null){
				pasienDaftar.setStatusKasusPenyakit(true);
			} else{
				pasienDaftar.setStatusKasusPenyakit(false);
			}
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getDokterPenanggungJawab())){
			pasienDaftar.setDokterPenanggungJawab(pegawaiConverter.transferVOToModel(vo.getDokterPenanggungJawab(), new Pegawai()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getKelompokPasien())){
			pasienDaftar.setKelompokPasien(kelompokPasienConverter.transferVOToModel(vo.getKelompokPasien(), new KelompokPasien()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getRuangan())){
			//-------------------------------------------CUSTOM SPACE-------------------------------------------
			if(vo.getRuangan().getDepartemenId()==18){
				pasienDaftar.setTglPulang(DateUtil.now());
			}
			//-------------------------------------------CUSTOM SPACE-------------------------------------------
			Integer hitungBilik = ruanganDao.countRuanganBilik(vo.getRuangan().getId());
			if(CommonUtil.isNotNullOrEmpty(hitungBilik)){
				if (hitungBilik == 0) {
					pasienDaftar.setRuangan(ruanganConverter.transferVOToModel(vo.getRuangan(), new Ruangan()));
				} else {
					Ruangan ruangan = findRuanganBilik(vo.getRuangan().getId(), vo.getTglRegistrasi());
					pasienDaftar.setRuangan(ruangan);
				}
			}
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getRuanganNextSchedule())){
			pasienDaftar.setRuanganNextSchedule(ruanganConverter.transferVOToModel(vo.getRuanganNextSchedule(), new Ruangan()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getPasien())){
			pasienDaftar.setPasien(pasienConverter.transferVOToModel(vo.getPasien(), new Pasien()));
			//-------------------------------------------CUSTOM SPACE-------------------------------------------
			if (CommonUtil.isNotNullOrEmpty(vo.getPasien().getId())) {
				if (pasienDaftarService.checkStatusPasien(vo.getPasien().getId())) {
					pasienDaftar.setStatusPasien(TipePasienEnum.LAMA.getVal());
				} else {
					pasienDaftar.setStatusPasien(TipePasienEnum.BARU.getVal());
				}
			} else{
				pasienDaftar.setStatusPasien(TipePasienEnum.BARU.getVal());
			}
			//-------------------------------------------CUSTOM SPACE-------------------------------------------
			List<PasienDaftar> listPasienDaftar = pasienDaftarDao.findByPasienNoCm(vo.getPasien().getNoCm());
			if(CommonUtil.isNotNullOrEmpty(listPasienDaftar)){
				if (listPasienDaftar.size() == 0) {
					pasienDaftar.setIsKajianAwal(true);
				} else {
					PasienDaftar pasienDaftarTemp = listPasienDaftar.get(0);
					long diff = new Date().getTime() - pasienDaftarTemp.getTglRegistrasi().getTime();
					long diffMonth = diff / 1000 / 60 / 60 / 24 / 30;
					pasienDaftar.setIsKajianAwal(diffMonth >= 3);
				}
			} else {
				pasienDaftar.setIsKajianAwal(true);
			}
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getPenanggungJawabPasien())){
			pasienDaftar.setPenanggungJawabPasien(penanggungJawabPasienConverter.transferVOToModel(vo.getPenanggungJawabPasien(), new PenanggungJawabPasien()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getStatusPulang())){
			pasienDaftar.setStatusPulang(statusPulangConverter.transferVOToModel(vo.getStatusPulang(), new StatusPulang()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getKondisiPasien())){
			pasienDaftar.setKondisiPasien(kondisiPasienConverter.transferVOToModel(vo.getKondisiPasien(), new KondisiPasien()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getHubunganKeluarga())){
			pasienDaftar.setHubunganKeluarga(hubunganKeluargaConverter.transferVOToModel(vo.getHubunganKeluarga(), new HubunganKeluarga()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getAntrianPasienDiPeriksaSet())){
			Set<AntrianPasienDiPeriksa> antrianPasienDiPeriksaSet = new HashSet<>();
			
			for(AntrianPasienDiPeriksaVO antrianPasienDiPeriksaVO : vo.getAntrianPasienDiPeriksaSet()){
				AntrianPasienDiPeriksa antrianPasienDiPeriksa = new AntrianPasienDiPeriksa();
				
				if(CommonUtil.isNotNullOrEmpty(antrianPasienDiPeriksaVO)){
					antrianPasienDiPeriksa = antrianPasienDiperiksaConverter.transferVOToModel(antrianPasienDiPeriksaVO, new AntrianPasienDiPeriksa());
					antrianPasienDiPeriksa.setPasienDaftar(pasienDaftar);
					
					if (CommonUtil.isNotNullOrEmpty(vo.getPasien().getId())) {
						if (antrianPasienDiPeriksaService.checkStatusPasien(vo.getPasien().getId(), vo.getRuangan().getId())) {
							antrianPasienDiPeriksa.setStatusKunjungan(TipePasienEnum.LAMA.getVal());
						} else {
							antrianPasienDiPeriksa.setStatusKunjungan(TipePasienEnum.BARU.getVal());
						}
		
					}
				}
				if(CommonUtil.isNotNullOrEmpty(antrianPasienDiPeriksaVO.getKelas())){
					antrianPasienDiPeriksa.setKelas(kelasConverter.transferVOToModel(antrianPasienDiPeriksaVO.getKelas(), new Kelas()));
				}
				if(CommonUtil.isNotNullOrEmpty(antrianPasienDiPeriksaVO.getStrukOrder())){
					antrianPasienDiPeriksa.setStrukOrder(strukOrderConverter.transferVOToModel(antrianPasienDiPeriksaVO.getStrukOrder(), new StrukOrder()));
				}
				if(CommonUtil.isNotNullOrEmpty(antrianPasienDiPeriksaVO.getAsalRujukan())){
					antrianPasienDiPeriksa.setAsalRujukan(asalRujukanConverter.transferVOToModel(antrianPasienDiPeriksaVO.getAsalRujukan(), new AsalRujukan()));
				}
				if(CommonUtil.isNotNullOrEmpty(antrianPasienDiPeriksaVO.getPegawai())){
					antrianPasienDiPeriksa.setPegawai(pegawaiConverter.transferVOToModel(antrianPasienDiPeriksaVO.getPegawai(), new Pegawai()));
				}
				if(CommonUtil.isNotNullOrEmpty(antrianPasienDiPeriksaVO.getStrukRetur())){
					antrianPasienDiPeriksa.setStrukRetur(strukReturConverter.transferVOToModel(antrianPasienDiPeriksaVO.getStrukRetur(), new StrukRetur()));
				}
				if(CommonUtil.isNotNullOrEmpty(antrianPasienDiPeriksaVO.getKamar())){
					antrianPasienDiPeriksa.setKamar(kamarConverter.transferVOToModel(antrianPasienDiPeriksaVO.getKamar(), new Kamar()));
				}
				if(CommonUtil.isNotNullOrEmpty(antrianPasienDiPeriksaVO.getKasusPenyakit())){
					antrianPasienDiPeriksa.setKasusPenyakit(kasusPenyakitConverter.transferVOToModel(antrianPasienDiPeriksaVO.getKasusPenyakit(), new KasusPenyakit()));
				}
				if(CommonUtil.isNotNullOrEmpty(antrianPasienDiPeriksaVO.getRuangan())){
					antrianPasienDiPeriksa.setRuangan(ruanganConverter.transferVOToModel(antrianPasienDiPeriksaVO.getRuangan(), new Ruangan()));
				}
				if(CommonUtil.isNotNullOrEmpty(antrianPasienDiPeriksa)){
					antrianPasienDiPeriksaSet.add(antrianPasienDiPeriksa);
				}
			}
			if(CommonUtil.isNotNullOrEmpty(antrianPasienDiPeriksaSet)){
				pasienDaftar.setAntrianPasienDiPeriksaSet(antrianPasienDiPeriksaSet);
			}
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getDiputuskanDetailSet())){
			Set<DiputuskanDetail> diputuskanDetailSet = new HashSet<>();
			
			for(DiputuskanDetailVO diputuskanDetailVO : vo.getDiputuskanDetailSet()){
				DiputuskanDetail diputuskanDetail = new DiputuskanDetail();
				
				if(CommonUtil.isNotNullOrEmpty(diputuskanDetailVO)){
					diputuskanDetail = diputuskanDetailConverter.transferVOToModel(diputuskanDetailVO, new DiputuskanDetail());
					diputuskanDetail.setPasienDaftar(pasienDaftar);
				}
				if(CommonUtil.isNotNullOrEmpty(diputuskanDetailVO.getDiputuskan())){
					diputuskanDetail.setDiputuskan(diputuskanConverter.transferVOToModel(diputuskanDetailVO.getDiputuskan(), new Diputuskan()));
				}
				if(CommonUtil.isNotNullOrEmpty(diputuskanDetail)){
					diputuskanDetailSet.add(diputuskanDetail);
				}
			}
			if(CommonUtil.isNotNullOrEmpty(diputuskanDetailSet)){
				pasienDaftar.setDiputuskanDetailSet(diputuskanDetailSet);
			}
		}
		if(CommonUtil.isNotNullOrEmpty(pasienDaftar)){
			PasienDaftar pasienDaftarResult = pasienDaftarDao.save(pasienDaftar);
			result.put("noRec", pasienDaftarResult.noRec);
		}
		
		return result;
	}
	
	public Ruangan findRuanganBilik(Integer id, Date tglRegistrasi) {
		List<RuanganJumlah> output = new ArrayList<RuanganJumlah>();
		List<Ruangan> listRuangan = new ArrayList<Ruangan>();
		List<JadwalDokter> listJadwal = jadwalDokterDao.findJadwalByTanggalRuanganBilik(id, tglRegistrasi);
		if(listJadwal.isEmpty()){
			List<JadwalDokter> listJadwal2=jadwalDokterDao.findJadwalByTanggalRuanganBilik3(id, tglRegistrasi);
			for(JadwalDokter jd:listJadwal2){
				listRuangan.add(jd.getRuangan());
			}
		}
		for(JadwalDokter jadwalDokter : listJadwal) {
			listRuangan.add(jadwalDokter.getRuangan());
		}
		for(Ruangan localR : listRuangan) {
			RuanganJumlah jml = new RuanganJumlah();
			List<Object[]> list = antrianPasienDiPeriksaDao.findRuanganByRuanganId(localR.getId(),
					DateUtil.formatDate(tglRegistrasi));
			for (Object[] o : list) {
				Long count = (Long) o[0];
				String namaR = (String) o[1];
				String tgl = (String) o[2];
				Integer idR = (Integer) o[3];
				if (localR.getNamaRuangan().equals(namaR)) {
					jml.setCount(count);
					jml.setNamaRuangan(namaR);
					jml.setIdRuangan(idR);
					jml.setTglRegistrasi(tgl);
					output.add(jml);
				}
			}
			if (jml.getIdRuangan() == null) {
				jml.setCount(0L);
				jml.setNamaRuangan(localR.getNamaRuangan());
				jml.setIdRuangan(localR.getId());
				output.add(jml);
			}
		}
		Collections.sort(output, new Comparator<RuanganJumlah>() {
			@Override
			public int compare(RuanganJumlah t, RuanganJumlah t1) {
				int a = Integer.parseInt(String.valueOf(t.getCount() - t1.getCount()));
				if (a == 0L) {
					int a1 = t.getNamaRuangan().compareTo(t1.getNamaRuangan());
					return a1;
				} else
					return a;
			}
		});
		Ruangan ruang = new Ruangan();
		if(CommonUtil.isNotNullOrEmpty(output)){
			ruang.setId(output.get(0).getIdRuangan());
		}
		return ruang;
	}
}