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.dao.AlatKhususDao;
import com.jasamedika.medifirst2000.dao.MonitoringDao;
import com.jasamedika.medifirst2000.dao.PerencanaanAnestesiDao;
import com.jasamedika.medifirst2000.dao.PersiapanPraAnestesiDao;
import com.jasamedika.medifirst2000.dao.RawatKhususDao;
import com.jasamedika.medifirst2000.dao.RegionalDao;
import com.jasamedika.medifirst2000.dao.TeknikKhususDao;
import com.jasamedika.medifirst2000.entities.AlatKhusus;
import com.jasamedika.medifirst2000.entities.AlatKhususDetail;
import com.jasamedika.medifirst2000.entities.Monitoring;
import com.jasamedika.medifirst2000.entities.MonitoringDetail;
import com.jasamedika.medifirst2000.entities.PerencanaanAnestesi;
import com.jasamedika.medifirst2000.entities.PersiapanPraAnestesi;
import com.jasamedika.medifirst2000.entities.PersiapanPraAnestesiDetail;
import com.jasamedika.medifirst2000.entities.PraAnestesiDokter;
import com.jasamedika.medifirst2000.entities.RawatKhusus;
import com.jasamedika.medifirst2000.entities.RawatKhususDetail;
import com.jasamedika.medifirst2000.entities.Regional;
import com.jasamedika.medifirst2000.entities.RegionalDetail;
import com.jasamedika.medifirst2000.entities.TeknikKhusus;
import com.jasamedika.medifirst2000.entities.TeknikKhususDetail;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.PerencanaanAnestesiService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.AlatKhususDetailVO;
import com.jasamedika.medifirst2000.vo.AlatKhususVO;
import com.jasamedika.medifirst2000.vo.MonitoringDetailVO;
import com.jasamedika.medifirst2000.vo.MonitoringVO;
import com.jasamedika.medifirst2000.vo.PerencanaanAnestesiVO;
import com.jasamedika.medifirst2000.vo.PersiapanPraAnestesiDetailVO;
import com.jasamedika.medifirst2000.vo.PersiapanPraAnestesiVO;
import com.jasamedika.medifirst2000.vo.PraAnestesiDokterVO;
import com.jasamedika.medifirst2000.vo.RawatKhususDetailVO;
import com.jasamedika.medifirst2000.vo.RawatKhususVO;
import com.jasamedika.medifirst2000.vo.RegionalDetailVO;
import com.jasamedika.medifirst2000.vo.RegionalVO;
import com.jasamedika.medifirst2000.vo.TeknikKhususDetailVO;
import com.jasamedika.medifirst2000.vo.TeknikKhususVO;


@Service("perencanaanAnestesiService")
public class PerencanaanAnestesiServiceImpl implements PerencanaanAnestesiService{
	
	@Autowired
	private BaseConverterImpl<MonitoringVO, Monitoring> monitoringConverter;
	
	@Autowired
	private BaseConverterImpl<MonitoringDetailVO, MonitoringDetail> monitoringDetailConverter;
	
	@Autowired
	private BaseConverterImpl<PerencanaanAnestesiVO, PerencanaanAnestesi> perencanaanAnestesiConverter;
	
	@Autowired
	private BaseConverterImpl<PraAnestesiDokterVO, PraAnestesiDokter> praAnestesiDokterConverter;
	
	@Autowired
	private BaseConverterImpl<TeknikKhususVO, TeknikKhusus> teknikKhususConverter;
	
	@Autowired
	private BaseConverterImpl<TeknikKhususDetailVO, TeknikKhususDetail> teknikKhususDetailConverter;
	
	@Autowired
	private BaseConverterImpl<AlatKhususVO, AlatKhusus> alatKhususConverter;
	
	@Autowired
	private BaseConverterImpl<RawatKhususVO, RawatKhusus> rawatKhususConverter;
	
	@Autowired
	private BaseConverterImpl<RawatKhususDetailVO, RawatKhususDetail> rawatKhususDetailConverter;
	
	@Autowired
	private BaseConverterImpl<PersiapanPraAnestesiVO, PersiapanPraAnestesi> persiapanPraAnestesiConverter;
	
	@Autowired
	private BaseConverterImpl<PersiapanPraAnestesiDetailVO, PersiapanPraAnestesiDetail> persiapanPraAnestesiDetailConverter;
	
	@Autowired
	private BaseConverterImpl<AlatKhususDetailVO, AlatKhususDetail> alatKhususDetailConverter;
	
	@Autowired
	private BaseConverterImpl<RegionalDetailVO, RegionalDetail> regionalDetailConverter;
	
	@Autowired
	private BaseConverterImpl<RegionalVO, Regional> regionalConverter;
	
	@Autowired
	private PerencanaanAnestesiDao perencanaanAnestesiDao;
	
	@Autowired
	private MonitoringDao monitoringDao;
	
	@Autowired
	private AlatKhususDao alatKhususDao;
	
	@Autowired
	private TeknikKhususDao teknikKhususDao;
	
	@Autowired
	private RegionalDao regionalDao;
	
	@Autowired
	private RawatKhususDao rawatKhususDao;
	
	@Autowired
	private PersiapanPraAnestesiDao persiapanPraAnestesiDao;
	
	@Override
	public PerencanaanAnestesiVO add(PerencanaanAnestesiVO vo) throws JpaSystemException, ServiceVOException {
		return null;
	}

	@Override
	public PerencanaanAnestesiVO update(PerencanaanAnestesiVO vo) throws JpaSystemException, ServiceVOException {
		return null;
	}

	@Override
	public Boolean delete(String key) throws JpaSystemException {
		return null;
	}

	@Override
	public PerencanaanAnestesiVO findById(String key) throws JpaSystemException {
		return null;
	}

	@Override
	public List<PerencanaanAnestesiVO> 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> save(PerencanaanAnestesiVO vo) {
		Map <String, Object> result = new HashMap<String, Object>();
		PerencanaanAnestesi perencanaanAnestesi = perencanaanAnestesiConverter.transferVOToModel(vo, new PerencanaanAnestesi());		
		List<Monitoring> listMonitoring = new ArrayList<Monitoring>();
		List<TeknikKhusus> listTeknikKhusus = new ArrayList<TeknikKhusus>();
		List<AlatKhusus> listAlatKhusus = new ArrayList<AlatKhusus>();
		List<RawatKhusus> listRawatKhusus = new ArrayList<RawatKhusus>();
		List<PersiapanPraAnestesi> listPersiapanPraAnestesi = new ArrayList<PersiapanPraAnestesi>();
		List<Regional> listRegional = new ArrayList<Regional>();
		for(MonitoringVO vos : vo.getMonitoring())
		{
			Monitoring monitoring = monitoringConverter.transferVOToModel(vos, new Monitoring());
			monitoring.setMonitoringDetail(monitoringDetailConverter.transferVOToModel(vos.getMonitoringDetail(), new MonitoringDetail()));
			monitoring.setPerencanaanAnestesi(perencanaanAnestesi);
			listMonitoring.add(monitoring);
		}
		for(TeknikKhususVO vos : vo.getTeknikKhusus())
		{
			TeknikKhusus teknikKhusus = teknikKhususConverter.transferVOToModel(vos, new TeknikKhusus());
			teknikKhusus.setTeknikKhususDetail(teknikKhususDetailConverter.transferVOToModel(vos.getTeknikKhususDetail(), new TeknikKhususDetail()));
			teknikKhusus.setPerencanaanAnestesi(perencanaanAnestesi);
			listTeknikKhusus.add(teknikKhusus);
		}
		for(AlatKhususVO vos : vo.getAlatKhusus())
		{
			AlatKhusus alatKhusus = alatKhususConverter.transferVOToModel(vos, new AlatKhusus());
			alatKhusus.setAlatKhususDetail(alatKhususDetailConverter.transferVOToModel(vos.getAlatKhususDetail(), new AlatKhususDetail()));
			alatKhusus.setPerencanaanAnestesi(perencanaanAnestesi);
			listAlatKhusus.add(alatKhusus);
		}
		for(RawatKhususVO vos : vo.getRawatKhusus())
		{
			RawatKhusus rawatKhusus = rawatKhususConverter.transferVOToModel(vos, new RawatKhusus());
			rawatKhusus.setRawatKhususDetail(rawatKhususDetailConverter.transferVOToModel(vos.getRawatKhususDetail(), new RawatKhususDetail()));
			rawatKhusus.setPerencanaanAnestesi(perencanaanAnestesi);
			listRawatKhusus.add(rawatKhusus);
		}		
		for(PersiapanPraAnestesiVO vos : vo.getPersiapanPraAnestesi())
		{
			PersiapanPraAnestesi persiapanPraAnestesi = persiapanPraAnestesiConverter.transferVOToModel(vos, new PersiapanPraAnestesi());
			persiapanPraAnestesi.setPersiapanPraAnestesiDetail(persiapanPraAnestesiDetailConverter.transferVOToModel(vos.getPersiapanPraAnestesiDetail(), new PersiapanPraAnestesiDetail()));
			persiapanPraAnestesi.setPerencanaanAnestesi(perencanaanAnestesi);
			listPersiapanPraAnestesi.add(persiapanPraAnestesi);
		}		
		for(RegionalVO vos : vo.getRegional())
		{
			Regional regional = regionalConverter.transferVOToModel(vos, new Regional());
			regional.setRegionalDetail(regionalDetailConverter.transferVOToModel(vos.getRegionalDetail(), new RegionalDetail()));
			regional.setPerencanaanAnestesi(perencanaanAnestesi);
			listRegional.add(regional);
		}
		if (CommonUtil.isNotNullOrEmpty(perencanaanAnestesi.getMonitoring())) {

			perencanaanAnestesi.getMonitoring().clear();
		}		
		if (CommonUtil.isNotNullOrEmpty(perencanaanAnestesi.getTeknikKhusus())) {

			perencanaanAnestesi.getTeknikKhusus().clear();
		}
		if (CommonUtil.isNotNullOrEmpty(perencanaanAnestesi.getAlatKhusus())) {

			perencanaanAnestesi.getAlatKhusus().clear();
		}
		if (CommonUtil.isNotNullOrEmpty(perencanaanAnestesi.getRawatKhusus())) {

			perencanaanAnestesi.getRawatKhusus().clear();
		}
		if (CommonUtil.isNotNullOrEmpty(perencanaanAnestesi.getPersiapanPraAnestesi())) {

			perencanaanAnestesi.getPersiapanPraAnestesi().clear();
		}
		if (CommonUtil.isNotNullOrEmpty(perencanaanAnestesi.getRegional())) {

			perencanaanAnestesi.getRegional().clear();
		}
		perencanaanAnestesi.getRegional().addAll(listRegional);
		perencanaanAnestesi.getPersiapanPraAnestesi().addAll(listPersiapanPraAnestesi);
		perencanaanAnestesi.getRawatKhusus().addAll(listRawatKhusus);
		perencanaanAnestesi.getMonitoring().addAll(listMonitoring);
		perencanaanAnestesi.getTeknikKhusus().addAll(listTeknikKhusus);
		perencanaanAnestesi.getAlatKhusus().addAll(listAlatKhusus);
		perencanaanAnestesi.setPraAnestesiDokter(praAnestesiDokterConverter.transferVOToModel(vo.getPraAnestesiDokter(), new PraAnestesiDokter()));
		PerencanaanAnestesi resultModel = perencanaanAnestesiDao.save(perencanaanAnestesi);
		if(CommonUtil.isNotNullOrEmpty(resultModel)){
			result.put("id", resultModel.getNoRec());
			result.put("Catatan", resultModel.getCatatan());
		}
		return result;
	}

	@Override
	public Map<String, Object> edit(PerencanaanAnestesiVO vo) {
		Map <String, Object> result = new HashMap<String, Object>();
		PerencanaanAnestesi perencanaanAnestesi = perencanaanAnestesiConverter.transferVOToModel(vo, new PerencanaanAnestesi());		
		List<Monitoring> modelMonitoring = monitoringDao.findByNoRec(vo.getNoRec());
		List<TeknikKhusus> modelTeknikKhusus = teknikKhususDao.findByNoRec(vo.getNoRec());
		List<AlatKhusus> modelAlatKhusus = alatKhususDao.findByNoRec(vo.getNoRec());
		List<RawatKhusus> modelRawatKhusus = rawatKhususDao.findByNoRec(vo.getNoRec());
		List<PersiapanPraAnestesi> modelPersiapanPraAnestesi = persiapanPraAnestesiDao.findByNoRec(vo.getNoRec());
		List<Regional> modelRegional = regionalDao.findByNoRec(vo.getNoRec());
		
		if(CommonUtil.isNotNullOrEmpty(modelMonitoring))
		{
			monitoringDao.delete(modelMonitoring);
		}
		if(CommonUtil.isNotNullOrEmpty(modelTeknikKhusus))
		{
			teknikKhususDao.delete(modelTeknikKhusus);
		}
		if(CommonUtil.isNotNullOrEmpty(modelAlatKhusus))
		{
			alatKhususDao.delete(modelAlatKhusus);
		}
		if(CommonUtil.isNotNullOrEmpty(modelRawatKhusus))
		{
			rawatKhususDao.delete(modelRawatKhusus);
		}
		if(CommonUtil.isNotNullOrEmpty(modelPersiapanPraAnestesi))
		{
			persiapanPraAnestesiDao.delete(modelPersiapanPraAnestesi);
		}
		if(CommonUtil.isNotNullOrEmpty(modelRegional))
		{
			regionalDao.delete(modelRegional);
		}
		
		List<Monitoring> listMonitoring = new ArrayList<Monitoring>();
		List<TeknikKhusus> listTeknikKhusus = new ArrayList<TeknikKhusus>();
		List<AlatKhusus> listAlatKhusus = new ArrayList<AlatKhusus>();
		List<RawatKhusus> listRawatKhusus = new ArrayList<RawatKhusus>();
		List<PersiapanPraAnestesi> listPersiapanPraAnestesi = new ArrayList<PersiapanPraAnestesi>();
		List<Regional> listRegional = new ArrayList<Regional>();
		for(MonitoringVO vos : vo.getMonitoring())
		{
			Monitoring monitoring = monitoringConverter.transferVOToModel(vos, new Monitoring());
			monitoring.setMonitoringDetail(monitoringDetailConverter.transferVOToModel(vos.getMonitoringDetail(), new MonitoringDetail()));
			monitoring.setPerencanaanAnestesi(perencanaanAnestesi);
			listMonitoring.add(monitoring);
		}
		for(TeknikKhususVO vos : vo.getTeknikKhusus())
		{
			TeknikKhusus teknikKhusus = teknikKhususConverter.transferVOToModel(vos, new TeknikKhusus());
			teknikKhusus.setTeknikKhususDetail(teknikKhususDetailConverter.transferVOToModel(vos.getTeknikKhususDetail(), new TeknikKhususDetail()));
			teknikKhusus.setPerencanaanAnestesi(perencanaanAnestesi);
			listTeknikKhusus.add(teknikKhusus);
		}
		for(AlatKhususVO vos : vo.getAlatKhusus())
		{
			AlatKhusus alatKhusus = alatKhususConverter.transferVOToModel(vos, new AlatKhusus());
			alatKhusus.setAlatKhususDetail(alatKhususDetailConverter.transferVOToModel(vos.getAlatKhususDetail(), new AlatKhususDetail()));
			alatKhusus.setPerencanaanAnestesi(perencanaanAnestesi);
			listAlatKhusus.add(alatKhusus);
		}
		for(RawatKhususVO vos : vo.getRawatKhusus())
		{
			RawatKhusus rawatKhusus = rawatKhususConverter.transferVOToModel(vos, new RawatKhusus());
			rawatKhusus.setRawatKhususDetail(rawatKhususDetailConverter.transferVOToModel(vos.getRawatKhususDetail(), new RawatKhususDetail()));
			rawatKhusus.setPerencanaanAnestesi(perencanaanAnestesi);
			listRawatKhusus.add(rawatKhusus);
		}		
		for(PersiapanPraAnestesiVO vos : vo.getPersiapanPraAnestesi())
		{
			PersiapanPraAnestesi persiapanPraAnestesi = persiapanPraAnestesiConverter.transferVOToModel(vos, new PersiapanPraAnestesi());
			persiapanPraAnestesi.setPersiapanPraAnestesiDetail(persiapanPraAnestesiDetailConverter.transferVOToModel(vos.getPersiapanPraAnestesiDetail(), new PersiapanPraAnestesiDetail()));
			persiapanPraAnestesi.setPerencanaanAnestesi(perencanaanAnestesi);
			listPersiapanPraAnestesi.add(persiapanPraAnestesi);
		}		
		for(RegionalVO vos : vo.getRegional())
		{
			Regional regional = regionalConverter.transferVOToModel(vos, new Regional());
			regional.setRegionalDetail(regionalDetailConverter.transferVOToModel(vos.getRegionalDetail(), new RegionalDetail()));
			regional.setPerencanaanAnestesi(perencanaanAnestesi);
			listRegional.add(regional);
		}
		if (CommonUtil.isNotNullOrEmpty(perencanaanAnestesi.getMonitoring())) {

			perencanaanAnestesi.getMonitoring().clear();
		}		
		if (CommonUtil.isNotNullOrEmpty(perencanaanAnestesi.getTeknikKhusus())) {

			perencanaanAnestesi.getTeknikKhusus().clear();
		}
		if (CommonUtil.isNotNullOrEmpty(perencanaanAnestesi.getAlatKhusus())) {

			perencanaanAnestesi.getAlatKhusus().clear();
		}
		if (CommonUtil.isNotNullOrEmpty(perencanaanAnestesi.getRawatKhusus())) {

			perencanaanAnestesi.getRawatKhusus().clear();
		}
		if (CommonUtil.isNotNullOrEmpty(perencanaanAnestesi.getPersiapanPraAnestesi())) {

			perencanaanAnestesi.getPersiapanPraAnestesi().clear();
		}
		if (CommonUtil.isNotNullOrEmpty(perencanaanAnestesi.getRegional())) {

			perencanaanAnestesi.getRegional().clear();
		}
		perencanaanAnestesi.getRegional().addAll(listRegional);
		perencanaanAnestesi.getPersiapanPraAnestesi().addAll(listPersiapanPraAnestesi);
		perencanaanAnestesi.getRawatKhusus().addAll(listRawatKhusus);
		perencanaanAnestesi.getMonitoring().addAll(listMonitoring);
		perencanaanAnestesi.getTeknikKhusus().addAll(listTeknikKhusus);
		perencanaanAnestesi.getAlatKhusus().addAll(listAlatKhusus);
		perencanaanAnestesi.setPraAnestesiDokter(praAnestesiDokterConverter.transferVOToModel(vo.getPraAnestesiDokter(), new PraAnestesiDokter()));
		PerencanaanAnestesi resultModel = perencanaanAnestesiDao.save(perencanaanAnestesi);
		if(CommonUtil.isNotNullOrEmpty(resultModel)){
			result.put("id", resultModel.getNoRec());
			result.put("Catatan", resultModel.getCatatan());
		}
		return result;
	}

}
