package com.jasamedika.medifirst2000.service.impl;

import java.util.ArrayList;
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 com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.converter.PemeriksaanJaringanCairanTubuhConverter;
import com.jasamedika.medifirst2000.converter.PemeriksaanJaringanCairanTubuhDetailConverter;
import com.jasamedika.medifirst2000.converter.SignOutOperationConverter;
import com.jasamedika.medifirst2000.dao.AntrianPasienDiPeriksaDao;
import com.jasamedika.medifirst2000.dao.CekKelengkapanAlkesDetailDao;
import com.jasamedika.medifirst2000.dao.CheckOutOperationDao;
import com.jasamedika.medifirst2000.dao.PemeriksaanJaringanCairanTubuhDetailDao;
import com.jasamedika.medifirst2000.dao.SignOutOperationDao;
import com.jasamedika.medifirst2000.entities.AntrianPasienDiPeriksa;
import com.jasamedika.medifirst2000.entities.CekKelengkapanAlkes;
import com.jasamedika.medifirst2000.entities.CekKelengkapanAlkesDetail;
import com.jasamedika.medifirst2000.entities.PemeriksaanJaringanCairanTubuh;
import com.jasamedika.medifirst2000.entities.PemeriksaanJaringanCairanTubuhDetail;
import com.jasamedika.medifirst2000.entities.SignOutOperation;
import com.jasamedika.medifirst2000.entities.StatusLengkapTidakLengkap;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.SignOutOperationService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.CekKelengkapanAlkesDetailVO;
import com.jasamedika.medifirst2000.vo.CekKelengkapanAlkesVO;
import com.jasamedika.medifirst2000.vo.PemeriksaanJaringanCairanTubuhDetailVO;
import com.jasamedika.medifirst2000.vo.SignOutOperationVO;
import com.jasamedika.medifirst2000.vo.StatusLengkapTidakLengkapVO;


/**
 * Implement class for SignOutOperationServiceImpl
 * 
 * @author shakato
 * @param <T>
 */
@Service("SignOutOperationService")
public class SignOutOperationServiceImpl implements SignOutOperationService{
	
	//@Autowired
	//private CheckOutOperationDao checkOutOperationDao;
	
	@Autowired
	private SignOutOperationConverter signOutOperationConverter;
	
	@Autowired
	private PemeriksaanJaringanCairanTubuhDetailConverter pemeriksaanJaringanCairanTubuhDetailConverter; 
	
	@Autowired
	private PemeriksaanJaringanCairanTubuhDetailDao pemeriksaanJaringanCairanTubuhDetailDao; 
	
	@Autowired
	private CekKelengkapanAlkesDetailDao cekKelengkapanAlkesDetailDao;
	
	@Autowired
	private PemeriksaanJaringanCairanTubuhConverter pemeriksaanJaringanCairanTubuhConverter; 
	
	@Autowired
	private BaseConverterImpl<CekKelengkapanAlkesDetailVO, CekKelengkapanAlkesDetail> cekKelengkapanAlkesDetailConverter;
	
	@Autowired
	private BaseConverterImpl<CekKelengkapanAlkesVO, CekKelengkapanAlkes> cekKelengkapanAlkesConverter;
	
	@Autowired
	private BaseConverterImpl<StatusLengkapTidakLengkapVO, StatusLengkapTidakLengkap> statusLengkapTidakLengkapConverter;
	
	@Autowired
	private SignOutOperationDao signOutOperationDao;
	
	@Autowired
	private AntrianPasienDiPeriksaDao antrianPasienDiPeriksaDao;
	
	@Override
	public SignOutOperationVO add(SignOutOperationVO vo) throws JpaSystemException, ServiceVOException {
		return null;
	}
	@Override
	public SignOutOperationVO update(SignOutOperationVO vo) throws JpaSystemException, ServiceVOException {
		return null;
	}
	@Override
	public Boolean delete(Integer key) throws JpaSystemException {
		return null;
	}
	@Override
	public SignOutOperationVO findById(Integer key) throws JpaSystemException {
		return null;
	}
	@Override
	public List<SignOutOperationVO> 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> saveSignOutOperationService(SignOutOperationVO vo) {
		SignOutOperation signOutOperation = new SignOutOperation();
		signOutOperation = signOutOperationConverter.transferVOToModel(vo, signOutOperation);
		AntrianPasienDiPeriksa norec = antrianPasienDiPeriksaDao.findByNoRec(vo.getPasienDaftar().getNoRec());
		signOutOperation.setPasienDaftar(norec);	
		signOutOperation.setNoRec(vo.getNoRec());
		signOutOperation.getPemeriksaanJaringanCairanTubuhDetail().clear();
		
		for (PemeriksaanJaringanCairanTubuhDetailVO pemeriksaanJaringanCairanTubuhDetailVO:vo.getPemeriksaanJaringanCairanTubuhDetail()){
			PemeriksaanJaringanCairanTubuhDetail pemeriksaanJaringanCairanTubuhDetail = pemeriksaanJaringanCairanTubuhDetailConverter.transferVOToModel(pemeriksaanJaringanCairanTubuhDetailVO, new PemeriksaanJaringanCairanTubuhDetail());
			pemeriksaanJaringanCairanTubuhDetail.setSignOutOperation(signOutOperation);
			pemeriksaanJaringanCairanTubuhDetail.setNoRec(pemeriksaanJaringanCairanTubuhDetailVO.getNoRec());
		
			//by iwankasan
			//06.11.2017
			pemeriksaanJaringanCairanTubuhDetail.setKeterangan(pemeriksaanJaringanCairanTubuhDetailVO.getKeterangan());
			pemeriksaanJaringanCairanTubuhDetail.setStatusEnabled(pemeriksaanJaringanCairanTubuhDetailVO.getStatusEnabled());
			//pemeriksaanJaringanCairanTubuhDetail.setPemeriksaanJaringanCairanTubuhId(pemeriksaanJaringanCairanTubuhDetail.getPemeriksaanJaringanCairanTubuh().getId());
			pemeriksaanJaringanCairanTubuhDetail.setPemeriksaanJaringanCairanTubuh(pemeriksaanJaringanCairanTubuhConverter.transferVOToModel(pemeriksaanJaringanCairanTubuhDetailVO.getPemeriksaanJaringanCairanTubuh(), new PemeriksaanJaringanCairanTubuh()));
			
			if(CommonUtil.isNotNullOrEmpty(pemeriksaanJaringanCairanTubuhDetail.getSignOutOperation())){
				signOutOperation.getPemeriksaanJaringanCairanTubuhDetail().add(pemeriksaanJaringanCairanTubuhDetail);
			}
	
		}
			signOutOperation.getCekKelengkapanAlkesDetail().clear();
			for (CekKelengkapanAlkesDetailVO cekKelengkapanAlkesDetailVO:vo.getCekKelengkapanAlkesDetail()){
			CekKelengkapanAlkesDetail cekKelengkapanAlkesDetail = cekKelengkapanAlkesDetailConverter.transferVOToModel(cekKelengkapanAlkesDetailVO, new CekKelengkapanAlkesDetail());
			cekKelengkapanAlkesDetail.setSignOutOperation(signOutOperation);
			cekKelengkapanAlkesDetail.setCekKelengkapanAlkes(cekKelengkapanAlkesConverter.transferVOToModel(cekKelengkapanAlkesDetailVO.getCekKelengkapanAlkes(), new CekKelengkapanAlkes()));
			cekKelengkapanAlkesDetail.setStatusLengkapTidakLengkap(statusLengkapTidakLengkapConverter.transferVOToModel(cekKelengkapanAlkesDetailVO.getStatusLengkapTidakLengkap(), new StatusLengkapTidakLengkap()));
			
			//addketerangan
			//by iwankasan
			//06.11.2017
			cekKelengkapanAlkesDetail.setKeterangan(cekKelengkapanAlkesDetailVO.getKeterangan());
			cekKelengkapanAlkesDetail.setStatusEnabled(cekKelengkapanAlkesDetailVO.getStatusEnabled());
			
			cekKelengkapanAlkesDetail.setNoRec(cekKelengkapanAlkesDetailVO.getNoRec());
			
			if(CommonUtil.isNotNullOrEmpty(cekKelengkapanAlkesDetail.getSignOutOperation())){
				signOutOperation.getCekKelengkapanAlkesDetail().add(cekKelengkapanAlkesDetail);
			}
		
		}

		SignOutOperation model = signOutOperationDao.save(signOutOperation);
		Map<String, Object> result = new HashMap<String, Object>();
		if (CommonUtil.isNotNullOrEmpty(model)) {
			result.put("noRec", model.getNoRec());
		}
		return result;
	}
	
	
	@Override
	public Map<String, Object> getSignOutByNoRec(String noRec) {
		Map<String, Object> result = new HashMap<String, Object>();
		List<Map<String, Object>> listData = new ArrayList<>();

		Map<String, Object> signOutMap = new HashMap<>();
		List<Map<String, Object>> signOut = this.signOutOperationDao.getSignOutByNoRec(noRec);
		
		//get data getCekKelengkapanAlKesDetail
		try {
			
			Map<String, Object> kelangkapanMap = new HashMap<>();
			List<Map<String, Object>> tempList = new ArrayList<>();
			List<Map<String, Object>> kelangkapanList = this.signOutOperationDao.getCekKelengkapanalKesDetail(noRec);
			//List<Map<String, Object>> alatTerpasangList = this.checkInDao.getAlatTerpasangDetail((String) checkIn.get(0).get("noRec"));
			
			for(Map<String, Object> data : kelangkapanList){
				Map<String, Object> tempMap = new HashMap<>();
				tempMap.put("noRec", (String) data.get("noRec"));
				//tempMap.put("status", data.get("status"));
				tempMap.put("noRecSignOut", (String) data.get("noRecSignOutOperation"));
				tempMap.put("id", (Integer) data.get("idCekKelengkapanAlkes"));
				tempMap.put("name", (String) data.get("nameCekKelengkapanAlkes"));
				tempMap.put("idStatus", (Integer) data.get("idStatusLengkapTidakLengkap"));
				tempMap.put("nameStatus", (String) data.get("nameStatusLengkapTidakLengkap"));
				tempMap.put("keterangan", (String) data.get("keterangan"));
				tempList.add(tempMap);
			}
			
			kelangkapanMap.put("CekKelengkapanalKesDetail", tempList);
			listData.add(kelangkapanMap);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		//get data getPemeriksaanJaringanCairanTubuhDetail
		try {
					
			Map<String, Object> pemeriksaanMap = new HashMap<>();
			List<Map<String, Object>> tempList = new ArrayList<>();
			List<Map<String, Object>> pemeriksaanList = this.signOutOperationDao.getPemeriksaanJaringanCairanTubuhDetail(noRec);
					
			for(Map<String, Object> data : pemeriksaanList){
				Map<String, Object> tempMap = new HashMap<>();
				tempMap.put("noRec", (String) data.get("noRec"));
				tempMap.put("noRecSignOutOperation", data.get("noRecSignOutOperation"));
				tempMap.put("keterangan", data.get("keterangan"));
				tempMap.put("id", (Integer) data.get("idPemeriksaanJaringanCairanTubuh"));
				tempMap.put("name", (String) data.get("namePemeriksaanJaringanCairanTubuh"));
				tempMap.put("status", (Boolean) data.get("status"));
				tempList.add(tempMap);
			}
					
			pemeriksaanMap.put("PemeriksaanJaringanCairanTubuhDetail", tempList);
			listData.add(pemeriksaanMap);
					
			} catch (Exception e) {
					e.printStackTrace();
			}
		
				
		signOutMap.put("noRecCheckOut", signOut);
		listData.add(signOutMap);
		result.put("showData", listData);
		
		return result;
	}
	
	
	@Override
	public Map<String, Object> getSignOutByNoRecAntrian(String noRec) {
		Map<String, Object> result = new HashMap<String, Object>();
		
		List<Map<String, Object>> resultData = this.signOutOperationDao.getSignOutByNoRecAntrian(noRec);
		
		if(CommonUtil.isNotNullOrEmpty(resultData)) {
			result.put("showData", resultData);
		}
		return result;
		
	}

	
	
	
}
