package com.jasamedika.medifirst2000.service.impl;

import java.util.ArrayList;
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 java.util.concurrent.TimeUnit;

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

import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.AntrianPasienDiPeriksaDao;
import com.jasamedika.medifirst2000.dao.UskomPemeriksaanDao;
import com.jasamedika.medifirst2000.entities.AntrianPasienDiPeriksa;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.UskomJenisPemeriksaan;
import com.jasamedika.medifirst2000.entities.UskomListPemeriksaan;
import com.jasamedika.medifirst2000.entities.UskomNilaiNormal;
import com.jasamedika.medifirst2000.entities.UskomPemeriksaan;
import com.jasamedika.medifirst2000.service.UskomPemeriksaanService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.DateUtil;
import com.jasamedika.medifirst2000.vo.AntrianPasienDiPeriksaVO;
import com.jasamedika.medifirst2000.vo.PegawaiVO;
import com.jasamedika.medifirst2000.vo.UskomJenisPemeriksaanVO;
import com.jasamedika.medifirst2000.vo.UskomListPemeriksaanVO;
import com.jasamedika.medifirst2000.vo.UskomNilaiNormalVO;
import com.jasamedika.medifirst2000.vo.UskomPemeriksaanVO;

@Service("UskomPemeriksaanService")
public class UskomPemeriksaanServiceImpl implements UskomPemeriksaanService {

	@Autowired
	private UskomPemeriksaanDao uskomPemeriksaanDao;
	
	@Autowired
	private AntrianPasienDiPeriksaDao noRegistrasiDao;
	
	@Autowired
	private BaseConverterImpl<UskomPemeriksaanVO, UskomPemeriksaan> uskomPemeriksaanConverter;
	
	@Autowired
	private BaseConverterImpl<UskomListPemeriksaanVO, UskomListPemeriksaan> uskomListPemeriksaanConverter;
	
	@Autowired
	private BaseConverterImpl<UskomJenisPemeriksaanVO, UskomJenisPemeriksaan> uskomJenisPemeriksaanConverter;
	
	@Autowired
	private BaseConverterImpl<UskomNilaiNormalVO, UskomNilaiNormal> uskomNilaiNormalConverter;
	
	@Autowired
	private BaseConverterImpl<AntrianPasienDiPeriksaVO, AntrianPasienDiPeriksa> noRegistrasiConverter;
	
	@Autowired
	private BaseConverterImpl<PegawaiVO, Pegawai> pegawaiConverter;
	
	@SuppressWarnings("unchecked")
	@Override
	public Map<String, Object> loadData(String noRec){
		Map<String, Object> result = new HashMap<>();
		
		Map<String, Object> uskomPemeriksaanData = uskomPemeriksaanDao.getUskomPemeriksaan(noRec);
		if(CommonUtil.isNotNullOrEmpty(uskomPemeriksaanData)) {
			
			if(CommonUtil.isNotNullOrEmpty(uskomPemeriksaanData.get("noRec"))) {
				result.put("noRec", (String)uskomPemeriksaanData.get("noRec"));
			}
			if(CommonUtil.isNotNullOrEmpty(uskomPemeriksaanData.get("luasPermukaanTubuh"))) {
				result.put("luasPermukaanTubuh", (String)uskomPemeriksaanData.get("luasPermukaanTubuh"));
			}
			if(CommonUtil.isNotNullOrEmpty(uskomPemeriksaanData.get("diagnosa"))) {
				result.put("diagnosa", (String)uskomPemeriksaanData.get("diagnosa"));
			}
			if(CommonUtil.isNotNullOrEmpty(uskomPemeriksaanData.get("noRegostrasi"))) {
				Map<String, Object> noRegistrasi = new HashMap<>();
				noRegistrasi.put("noRegostrasi", (String)uskomPemeriksaanData.get("noRegostrasi"));
				result.put("noRegistrasi", noRegistrasi);
			}
			
			List<Map<String, Object>> uskomListPemeriksaan = new ArrayList<>();
			for(Map<String, Object> uskomListPemeriksaanData : uskomPemeriksaanDao.getUskomListPemeriksaan((String) uskomPemeriksaanData.get("noRec"))) {
				
				Map<String, Object> data = new HashMap<>();
				if(CommonUtil.isNotNullOrEmpty(uskomListPemeriksaanData.get("noRec"))) {
					data.put("noRec", (String)uskomListPemeriksaanData.get("noRec"));
				}
				if(CommonUtil.isNotNullOrEmpty(uskomListPemeriksaanData.get("tanggal"))) {
					data.put("tanggal", (Date)uskomListPemeriksaanData.get("tanggal"));
				}
				if(CommonUtil.isNotNullOrEmpty(uskomListPemeriksaanData.get("sistoleDistole"))) {
					data.put("sistoleDistole", (String)uskomListPemeriksaanData.get("sistoleDistole"));
				}
				if(CommonUtil.isNotNullOrEmpty(uskomListPemeriksaanData.get("frekuensiNadi"))) {
					data.put("frekuensiNadi", (String)uskomListPemeriksaanData.get("frekuensiNadi"));
				}
				if(CommonUtil.isNotNullOrEmpty(uskomListPemeriksaanData.get("saturasi"))) {
					data.put("saturasi", (String)uskomListPemeriksaanData.get("saturasi"));
				}
				if(CommonUtil.isNotNullOrEmpty(uskomListPemeriksaanData.get("hemoglobin"))) {
					data.put("hemoglobin", (String)uskomListPemeriksaanData.get("hemoglobin"));
				}
				if(CommonUtil.isNotNullOrEmpty(uskomListPemeriksaanData.get("idPegawai"))) {
					Map<String, Object> pegawai = new HashMap<>();
					pegawai.put("id", (Integer)uskomListPemeriksaanData.get("idPegawai"));
					data.put("pegawai", pegawai);
				}
				
				for(Map<String, Object> uskomJenisPemeriksaanData : uskomPemeriksaanDao.getUskomJenisPemeriksaan((String) uskomListPemeriksaanData.get("noRec"))) {

					if(uskomJenisPemeriksaanData.get("jenisPemeriksaan").toString().equalsIgnoreCase("CI")) {
						data.put("idCI", uskomJenisPemeriksaanData.get("idNilaiNormal"));
						data.put("nilaiNormalCI", uskomJenisPemeriksaanData.get("nilaiNormal"));
						data.put("nilaiCI", uskomJenisPemeriksaanData.get("nilai"));
					}
					if(uskomJenisPemeriksaanData.get("jenisPemeriksaan").toString().equalsIgnoreCase("SVI")) {
						data.put("idSVI", uskomJenisPemeriksaanData.get("idNilaiNormal"));
						data.put("nilaiNormalSVI", uskomJenisPemeriksaanData.get("nilaiNormal"));
						data.put("nilaiSVI", uskomJenisPemeriksaanData.get("nilai"));
					}
					if(uskomJenisPemeriksaanData.get("jenisPemeriksaan").toString().equalsIgnoreCase("FTc (AV)")) {
						data.put("idFTc", uskomJenisPemeriksaanData.get("idNilaiNormal"));
						data.put("nilaiNormalFTc", uskomJenisPemeriksaanData.get("nilaiNormal"));
						data.put("nilaiFTc", uskomJenisPemeriksaanData.get("nilai"));
					}
					if(uskomJenisPemeriksaanData.get("jenisPemeriksaan").toString().equalsIgnoreCase("SVV")) {
						data.put("idSVV", uskomJenisPemeriksaanData.get("idNilaiNormal"));
						data.put("nilaiNormalSVV", uskomJenisPemeriksaanData.get("nilaiNormal"));
						data.put("nilaiSVV", uskomJenisPemeriksaanData.get("nilai"));					
					}
					if(uskomJenisPemeriksaanData.get("jenisPemeriksaan").toString().equalsIgnoreCase("INO")) {
						data.put("idINO", uskomJenisPemeriksaanData.get("idNilaiNormal"));
						data.put("nilaiNormalINO", uskomJenisPemeriksaanData.get("nilaiNormal"));
						data.put("nilaiINO", uskomJenisPemeriksaanData.get("nilai"));					
					}
					if(uskomJenisPemeriksaanData.get("jenisPemeriksaan").toString().equalsIgnoreCase("Vpk (AV)")) {
						data.put("idVpk", uskomJenisPemeriksaanData.get("idNilaiNormal"));
						data.put("nilaiNormalVpk", uskomJenisPemeriksaanData.get("nilaiNormal"));
						data.put("nilaiVpk", uskomJenisPemeriksaanData.get("nilai"));					
					}
					if(uskomJenisPemeriksaanData.get("jenisPemeriksaan").toString().equalsIgnoreCase("SVRI")) {
						data.put("idSVRI", uskomJenisPemeriksaanData.get("idNilaiNormal"));
						data.put("nilaiNormalSVRI", uskomJenisPemeriksaanData.get("nilaiNormal"));
						data.put("nilaiSVRI", uskomJenisPemeriksaanData.get("nilai"));
					}
					if(uskomJenisPemeriksaanData.get("jenisPemeriksaan").toString().equalsIgnoreCase("PKR")) {
						data.put("idPKR", uskomJenisPemeriksaanData.get("idNilaiNormal"));
						data.put("nilaiNormalPKR", uskomJenisPemeriksaanData.get("nilaiNormal"));
						data.put("nilaiPKR", uskomJenisPemeriksaanData.get("nilai"));
					}
					if(uskomJenisPemeriksaanData.get("jenisPemeriksaan").toString().equalsIgnoreCase("DO2I")) {
						data.put("idDO2I", uskomJenisPemeriksaanData.get("idNilaiNormal"));
						data.put("nilaiNormalDO2I", uskomJenisPemeriksaanData.get("nilaiNormal"));
						data.put("nilaiDO2I", uskomJenisPemeriksaanData.get("nilai"));
					}
				}
				
				if(CommonUtil.isNotNullOrEmpty(data)) {
					uskomListPemeriksaan.add(data);
				}
			}
			
			if(CommonUtil.isNotNullOrEmpty(uskomListPemeriksaan)) {
				result.put("uskom", uskomListPemeriksaan);
			}
		}
		return result;
	}
	
	@Override
	public Map<String, Object> getDataMaster(String noRec){
		Map<String, Object> result = new HashMap<>();
		
		result.put("noRec", null);
		result.put("luasPermukaanTubuh", null);
		result.put("diagnosa", null);
		
		Map<String, Object> noRegistrasi = new HashMap<>();
		result.put("noRegistrasi", noRegistrasi);
		
		List<Map<String, Object>> uskomListPemeriksaan = new ArrayList<>();
		Map<String, Object> data = new HashMap<>();
		data.put("noRec", null);
		data.put("tanggal", null);
		data.put("sistoleDistole", null);
		data.put("frekuensiNadi", null);
		data.put("saturasi", null);
		data.put("hemoglobin", null);
		
		Map<String, Object> pegawai = new HashMap<>();
		data.put("pegawai", pegawai);
		
		if(CommonUtil.isNotNullOrEmpty(noRec)) {
		
			AntrianPasienDiPeriksa antrianPasienSiPeriksa = noRegistrasiDao.findOne(noRec);
			if(CommonUtil.isNotNullOrEmpty(antrianPasienSiPeriksa)) {
				Date tglLahir = antrianPasienSiPeriksa.getPasienDaftar().getPasien().getTglLahir();
				Date tglKini = DateUtil.now();
				Long jumlahHari = Math.abs(tglKini.getTime() - tglLahir.getTime());
				Long toDay = TimeUnit.MILLISECONDS.toDays(jumlahHari);
				Double usia = (toDay.doubleValue()+1);
				
				for(Map<String, Object> uskomJenisPemeriksaanData : uskomPemeriksaanDao.getUskomNilaiNormal(usia)) {
					if(uskomJenisPemeriksaanData.get("jenisPemeriksaan").toString().equalsIgnoreCase("CI")) {
						data.put("idCI", uskomJenisPemeriksaanData.get("idNilaiNormal"));
						data.put("nilaiNormalCI", uskomJenisPemeriksaanData.get("nilaiNormal"));
						data.put("nilaiCI", null);
					}
					if(uskomJenisPemeriksaanData.get("jenisPemeriksaan").toString().equalsIgnoreCase("SVI")) {
						data.put("idSVI", uskomJenisPemeriksaanData.get("idNilaiNormal"));
						data.put("nilaiNormalSVI", uskomJenisPemeriksaanData.get("nilaiNormal"));
						data.put("nilaiSVI", null);
					}
					if(uskomJenisPemeriksaanData.get("jenisPemeriksaan").toString().equalsIgnoreCase("FTc (AV)")) {
						data.put("idFTc", uskomJenisPemeriksaanData.get("idNilaiNormal"));
						data.put("nilaiNormalFTc", uskomJenisPemeriksaanData.get("nilaiNormal"));
						data.put("nilaiFTc", null);
					}
					if(uskomJenisPemeriksaanData.get("jenisPemeriksaan").toString().equalsIgnoreCase("SVV")) {
						data.put("idSVV", uskomJenisPemeriksaanData.get("idNilaiNormal"));
						data.put("nilaiNormalSVV", uskomJenisPemeriksaanData.get("nilaiNormal"));
						data.put("nilaiSVV", null);					
					}
					if(uskomJenisPemeriksaanData.get("jenisPemeriksaan").toString().equalsIgnoreCase("INO")) {
						data.put("idINO", uskomJenisPemeriksaanData.get("idNilaiNormal"));
						data.put("nilaiNormalINO", uskomJenisPemeriksaanData.get("nilaiNormal"));
						data.put("nilaiINO", null);					
					}
					if(uskomJenisPemeriksaanData.get("jenisPemeriksaan").toString().equalsIgnoreCase("Vpk (AV)")) {
						data.put("idVpk", uskomJenisPemeriksaanData.get("idNilaiNormal"));
						data.put("nilaiNormalVpk", uskomJenisPemeriksaanData.get("nilaiNormal"));
						data.put("nilaiVpk", null);					
					}
					if(uskomJenisPemeriksaanData.get("jenisPemeriksaan").toString().equalsIgnoreCase("SVRI")) {
						data.put("idSVRI", uskomJenisPemeriksaanData.get("idNilaiNormal"));
						data.put("nilaiNormalSVRI", uskomJenisPemeriksaanData.get("nilaiNormal"));
						data.put("nilaiSVRI", null);
					}
					if(uskomJenisPemeriksaanData.get("jenisPemeriksaan").toString().equalsIgnoreCase("PKR")) {
						data.put("idPKR", uskomJenisPemeriksaanData.get("idNilaiNormal"));
						data.put("nilaiNormalPKR", uskomJenisPemeriksaanData.get("nilaiNormal"));
						data.put("nilaiPKR", null);
					}
					if(uskomJenisPemeriksaanData.get("jenisPemeriksaan").toString().equalsIgnoreCase("DO2I")) {
						data.put("idDO2I", uskomJenisPemeriksaanData.get("idNilaiNormal"));
						data.put("nilaiNormalDO2I", uskomJenisPemeriksaanData.get("nilaiNormal"));
						data.put("nilaiDO2I", null);
					}
				}
				
				if(CommonUtil.isNotNullOrEmpty(data)) {
					uskomListPemeriksaan.add(data);
				}
				
				if(CommonUtil.isNotNullOrEmpty(uskomListPemeriksaan)) {
					result.put("uskom", uskomListPemeriksaan);
				}
			}
		}
			
		return result;
	}
	
	@Override
	public Map<String, Object> savePemeriksaanUskom(UskomPemeriksaanVO vo){
		Map<String, Object> result = new HashMap<>();
		
		UskomPemeriksaan uskomPemeriksaan = null;
		
		if(CommonUtil.isNotNullOrEmpty(vo.getNoRec())) {
			uskomPemeriksaan = uskomPemeriksaanDao.findOne(vo.getNoRec());
		} else {
			uskomPemeriksaan = uskomPemeriksaanConverter.transferVOToModel(vo, new UskomPemeriksaan());
		}
		
		if(CommonUtil.isNotNullOrEmpty(vo.getNoRegistrasi())) {
			uskomPemeriksaan.setNoRegistrasi(noRegistrasiConverter.transferVOToModel(vo.getNoRegistrasi(), new AntrianPasienDiPeriksa()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getUskomListPemeriksaan())) {
			Set<UskomListPemeriksaan> uskomListPemeriksaanSet = new HashSet<>();
			
			for(UskomListPemeriksaanVO uskomListPemeriksaanVO : vo.getUskomListPemeriksaan()) {
				UskomListPemeriksaan uskomListPemeriksaan = new UskomListPemeriksaan();
				
				if(CommonUtil.isNotNullOrEmpty(uskomListPemeriksaanVO)) {
					uskomListPemeriksaan = uskomListPemeriksaanConverter.transferVOToModel(uskomListPemeriksaanVO, new UskomListPemeriksaan());
					uskomListPemeriksaan.setUskomPemeriksaan(uskomPemeriksaan);
				}
				if(CommonUtil.isNotNullOrEmpty(uskomListPemeriksaanVO.getPegawai())) {
					uskomListPemeriksaan.setPegawai(pegawaiConverter.transferVOToModel(uskomListPemeriksaanVO.getPegawai(), new Pegawai()));
				}
				if(CommonUtil.isNotNullOrEmpty(uskomListPemeriksaan.getUskomJenisPemeriksaan())) {
					Set<UskomJenisPemeriksaan> uskomJenisPemeriksaanSet = new HashSet<>();
					
					for(UskomJenisPemeriksaanVO uskomJenisPemeriksaanVO : uskomListPemeriksaanVO.getUskomJenisPemeriksaan()) {
						UskomJenisPemeriksaan uskomJenisPemeriksaan = new UskomJenisPemeriksaan();
						
						if(CommonUtil.isNotNullOrEmpty(uskomJenisPemeriksaanVO)) {
							uskomJenisPemeriksaan = uskomJenisPemeriksaanConverter.transferVOToModel(uskomJenisPemeriksaanVO, new UskomJenisPemeriksaan());
							uskomJenisPemeriksaan.setUskomListPemeriksaan(uskomListPemeriksaan);
						}
						if(CommonUtil.isNotNullOrEmpty(uskomJenisPemeriksaanVO.getUskomNilaiNormal())) {
							uskomJenisPemeriksaan.setUskomNilaiNormal(uskomNilaiNormalConverter.transferVOToModel(uskomJenisPemeriksaanVO.getUskomNilaiNormal(), new UskomNilaiNormal()));
						}
						if(CommonUtil.isNotNullOrEmpty(uskomJenisPemeriksaan)) {
							uskomJenisPemeriksaanSet.add(uskomJenisPemeriksaan);
						}
					}
					if(CommonUtil.isNotNullOrEmpty(uskomJenisPemeriksaanSet)) {
						uskomListPemeriksaan.setUskomJenisPemeriksaan(uskomJenisPemeriksaanSet);
					}
				}
				if(CommonUtil.isNotNullOrEmpty(uskomListPemeriksaan)) {
					uskomListPemeriksaanSet.add(uskomListPemeriksaan);
				}
			}
			if(CommonUtil.isNotNullOrEmpty(uskomListPemeriksaanSet)) {
				uskomPemeriksaan.setUskomListPemeriksaan(uskomListPemeriksaanSet);
			}
		}
		if(CommonUtil.isNotNullOrEmpty(uskomPemeriksaan)) {
			UskomPemeriksaan uskomPemeriksaanResult = uskomPemeriksaanDao.save(uskomPemeriksaan);
			result.put("noRec", uskomPemeriksaanResult.getNoRec());
		}
		return result;
	}
}
