package com.jasamedika.medifirst2000.service.impl;

import java.util.ArrayList;
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 com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.DetailPengkajianAwalDao;
import com.jasamedika.medifirst2000.dao.PengkajianAwalBaruDao;
import com.jasamedika.medifirst2000.dao.PengkajianAwalTransaksiDao;
import com.jasamedika.medifirst2000.entities.DetailPengkajianAwal;
import com.jasamedika.medifirst2000.entities.PengkajianAwal;
import com.jasamedika.medifirst2000.entities.PengkajianAwalBaru;
import com.jasamedika.medifirst2000.entities.PengkajianAwalTransaksi;
import com.jasamedika.medifirst2000.service.PengkajianAwalService;
import com.jasamedika.medifirst2000.service.PengkajianLanjutanTransaksiService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.DetailPengkajianAwalVO;
import com.jasamedika.medifirst2000.vo.PengkajianAwalBaruVO;
import com.jasamedika.medifirst2000.vo.PengkajianAwalTransaksiVO;
import com.jasamedika.medifirst2000.vo.PengkajianAwalVO;

@Service("PengkajianLanjutanTransaksiService")
public class PengkajianLanjutanTransaksiServiceImpl implements PengkajianLanjutanTransaksiService{
	
	@Autowired
	private PengkajianAwalTransaksiDao pengkajianAwalTransaksiDao;
	
	@Autowired
	private DetailPengkajianAwalDao detailPengkajianAwalDao;
	
	@Autowired
	private BaseConverterImpl<PengkajianAwalVO, PengkajianAwal> pengkajianAwalConveter;
	
	@Autowired
	private BaseConverterImpl<PengkajianAwalTransaksiVO, PengkajianAwalTransaksi> headPengkajianAwalConveter;
	
	@Autowired
	private BaseConverterImpl<PengkajianAwalBaruVO, PengkajianAwalBaru> pengkajianAwalBaruConveter;
	
	@Autowired
	private BaseConverterImpl<DetailPengkajianAwalVO, DetailPengkajianAwal> detailHeadPengkajianAwalConveter;

	@Autowired
	private PengkajianAwalService pengkajianAwalService;
	
	@Autowired
	private PengkajianAwalBaruDao pengkajianAwalBaruDao;
	
	
	@Override
	public Map<String, Object> getPengkajianAwalPasien(String noRegistrasi){
		return pengkajianAwalBaruDao.getOneLast(noRegistrasi);
	}
	
	@Override
	public Map<String, Object> save(PengkajianAwalTransaksiVO vo){
		Map<String, Object> result = new HashMap<String, Object>();
		
		PengkajianAwalTransaksi pengkajianAwalTransaksi = new PengkajianAwalTransaksi();
				
		if(CommonUtil.isNotNullOrEmpty(vo)){
			pengkajianAwalTransaksi = headPengkajianAwalConveter.transferVOToModel(vo, new PengkajianAwalTransaksi());
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getPengkajianAwalBaru())){
			pengkajianAwalTransaksi.setPengkajianLanjutan(pengkajianAwalBaruConveter.transferVOToModel(vo.getPengkajianAwalBaru(), new PengkajianAwalBaru()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getDetailPengkajianAwal())){
			Set<DetailPengkajianAwal> detailPengkajianAwalSet = new HashSet<>();
			
			for(DetailPengkajianAwalVO detailPengkajianAwalVO : vo.getDetailPengkajianAwal()){
				DetailPengkajianAwal detailPengkajianAwal = new DetailPengkajianAwal();
				
				if(CommonUtil.isNotNullOrEmpty(detailPengkajianAwalVO)){
					detailPengkajianAwal = detailHeadPengkajianAwalConveter.transferVOToModel(detailPengkajianAwalVO, new DetailPengkajianAwal());
					detailPengkajianAwal.setPengkajianAwalTransaksi(pengkajianAwalTransaksi);
				}
				if(CommonUtil.isNotNullOrEmpty(detailPengkajianAwalVO.getPengkajianAwal())){
					detailPengkajianAwal.setPengkajianAwal(pengkajianAwalConveter.transferVOToModel(detailPengkajianAwalVO.getPengkajianAwal(), new PengkajianAwal()));
				}
				if(CommonUtil.isNotNullOrEmpty(detailPengkajianAwal)){
					detailPengkajianAwalSet.add(detailPengkajianAwal);
				}
			}
			if(CommonUtil.isNotNullOrEmpty(detailPengkajianAwalSet)){
				pengkajianAwalTransaksi.setDetailPengkajianAwal(detailPengkajianAwalSet);
			}
		}
		if(CommonUtil.isNotNullOrEmpty(pengkajianAwalTransaksi)){
			PengkajianAwalTransaksi headPengkajianAwalResult = pengkajianAwalTransaksiDao.save(pengkajianAwalTransaksi);
			result.put("noRec", headPengkajianAwalResult.noRec);
		}
		
		return result;
	}
	
	@Override
	public Map<String, Object> update(PengkajianAwalTransaksiVO vo){
		Map<String, Object> result = new HashMap<String, Object>();
		
		PengkajianAwalTransaksi pengkajianAwalTransaksi = pengkajianAwalTransaksiDao.findOne(vo.getNoRec());
		
		if(CommonUtil.isNotNullOrEmpty(vo)){
			pengkajianAwalTransaksi = headPengkajianAwalConveter.transferVOToModel(vo, new PengkajianAwalTransaksi());
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getPengkajianAwalBaru())){
			pengkajianAwalTransaksi.setPengkajianLanjutan(pengkajianAwalBaruConveter.transferVOToModel(vo.getPengkajianAwalBaru(), new PengkajianAwalBaru()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getDetailPengkajianAwal())){
			Set<DetailPengkajianAwal> detailPengkajianAwalSet = new HashSet<>();
			
			for(DetailPengkajianAwalVO detailPengkajianAwalVO : vo.getDetailPengkajianAwal()){
				
				DetailPengkajianAwal detailHeadPengkajianAwalGet = detailPengkajianAwalDao.
						getDetailPengkajianAwal(detailPengkajianAwalVO.getPengkajianAwal().getId(), pengkajianAwalTransaksi.getNoRec());
				
				if(CommonUtil.isNotNullOrEmpty(detailHeadPengkajianAwalGet)){
					
					DetailPengkajianAwal detailPengkajianAwal = new DetailPengkajianAwal();
					if(CommonUtil.isNotNullOrEmpty(detailHeadPengkajianAwalGet.getNoRec())){
						detailPengkajianAwal.setNoRec(detailHeadPengkajianAwalGet.getNoRec());
					}
					if(CommonUtil.isNotNullOrEmpty(detailPengkajianAwalVO.getNilai())){
						detailPengkajianAwal.setNilai(detailPengkajianAwalVO.getNilai());
					}
					if(CommonUtil.isNotNullOrEmpty(pengkajianAwalTransaksi)){
						detailPengkajianAwal.setPengkajianAwalTransaksi(pengkajianAwalTransaksi);
					}
					if(CommonUtil.isNotNullOrEmpty(detailPengkajianAwalVO.getPengkajianAwal())){
						detailPengkajianAwal.setPengkajianAwal(pengkajianAwalConveter.transferVOToModel(detailPengkajianAwalVO.getPengkajianAwal(), new PengkajianAwal()));
					}
					if(CommonUtil.isNotNullOrEmpty(detailPengkajianAwal)){
						detailPengkajianAwalSet.add(detailPengkajianAwal);
					}
				}else{
					DetailPengkajianAwal detailPengkajianAwal = new DetailPengkajianAwal();
					
					if(CommonUtil.isNotNullOrEmpty(detailPengkajianAwalVO)){
						detailPengkajianAwal = detailHeadPengkajianAwalConveter.transferVOToModel(detailPengkajianAwalVO, new DetailPengkajianAwal());
						detailPengkajianAwal.setPengkajianAwalTransaksi(pengkajianAwalTransaksi);
					}
					if(CommonUtil.isNotNullOrEmpty(detailPengkajianAwalVO.getPengkajianAwal())){
						detailPengkajianAwal.setPengkajianAwal(pengkajianAwalConveter.transferVOToModel(detailPengkajianAwalVO.getPengkajianAwal(), new PengkajianAwal()));
					}
					if(CommonUtil.isNotNullOrEmpty(detailPengkajianAwal)){
						detailPengkajianAwalSet.add(detailPengkajianAwal);
					}
				}
			}
			if(CommonUtil.isNotNullOrEmpty(detailPengkajianAwalSet)){
				pengkajianAwalTransaksi.setDetailPengkajianAwal(detailPengkajianAwalSet);
			}
		}
		if(CommonUtil.isNotNullOrEmpty(pengkajianAwalTransaksi)){
			PengkajianAwalTransaksi headPengkajianAwalResult = pengkajianAwalTransaksiDao.save(pengkajianAwalTransaksi);
			result.put("noRec", headPengkajianAwalResult.noRec);
		}
		return result;
	}
	
	@Override
	public Map<String, Object> loadPengkajianLanjutan(Integer id, String noRec){
		Map<String, Object> result = jsonManipulationHead(id, noRec);
		if(CommonUtil.isNotNullOrEmpty(noRec)){
			String data = pengkajianAwalTransaksiDao.getNoRecByPLanjutan(noRec);
			if(CommonUtil.isNotNullOrEmpty(data)){
				Map<String, Object> pengkajianAwalTransaksi = new HashMap<>();
				pengkajianAwalTransaksi.put("noRec", data);
				result.put("pengkajianAwalTransaksi", pengkajianAwalTransaksi);
			}
		}
		return result;
	}
	
	private PengkajianAwalVO getMasterPengkajianAwal(Integer id){
		PengkajianAwalVO result = new PengkajianAwalVO();
		if(CommonUtil.isNotNullOrEmpty(id)){
			PengkajianAwal pengkajianAwal = pengkajianAwalService.getHeadPengkajianAwal(id);
			try {
				if(CommonUtil.isNotNullOrEmpty(pengkajianAwal)){
					result = pengkajianAwalConveter.transferModelToVO(pengkajianAwal, new PengkajianAwalVO());
				}
				if(CommonUtil.isNotNullOrEmpty(pengkajianAwal.getPengkajianAwal())){
					Set<PengkajianAwalVO> pengkajianAwalVOSet = new HashSet<>();
					
					for(PengkajianAwal model : pengkajianAwal.getPengkajianAwal()){
						PengkajianAwalVO pengkajianAwalVO = getMasterPengkajianAwal(model.getId());
						
						if(CommonUtil.isNotNullOrEmpty(pengkajianAwalVO)){
							pengkajianAwalVOSet.add(pengkajianAwalVO);
						}
					}
					if(CommonUtil.isNotNullOrEmpty(pengkajianAwalVOSet)){
						result.setPengkajianAwal(pengkajianAwalVOSet);
					}
				}
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			}
		}
		return result;
	}
	
	private Map<String, Object> jsonManipulationHead(Integer id, String noRec){
		Map<String, Object> result = new HashMap<>();
		
		if(CommonUtil.isNotNullOrEmpty(id)&&CommonUtil.isNotNullOrEmpty(noRec)){
			PengkajianAwalVO pengkajianAwalVO = getMasterPengkajianAwal(id);
			
			Map<String, Object> pengkajianAwal = new HashMap<>();
			if(CommonUtil.isNotNullOrEmpty(pengkajianAwalVO)){
				pengkajianAwal.put("id", pengkajianAwalVO.getId());
				pengkajianAwal.put("nama", pengkajianAwalVO.getNama());
				pengkajianAwal.put("descNilai",  pengkajianAwalVO.getDescNilai());
				pengkajianAwal.put("value",  pengkajianAwalTransaksiDao.getNilaiDetailLanjutan(pengkajianAwalVO.getId(), noRec));
				pengkajianAwal.put("detail", jsonManipulationDetail(pengkajianAwalVO.getPengkajianAwal(), noRec));
			}
			if(CommonUtil.isNotNullOrEmpty(pengkajianAwal)){
				result.put("pengkajianAwal", pengkajianAwal);
			}
		}
		return result;
	}
	
	private List<Map<String, Object>> jsonManipulationDetail(Set<PengkajianAwalVO> child, String noRec){
		List<Map<String, Object>> result = new ArrayList<>();
		
		for(PengkajianAwalVO pengkajianAwalVO : child){
			Map<String, Object> detail = new HashMap<>();
			if(pengkajianAwalVO.getId()==78)
			{
				System.out.println("yeyeyye");
			}
			detail.put("id", pengkajianAwalVO.getId());
			detail.put("nama", pengkajianAwalVO.getNama());
			detail.put("descNilai", pengkajianAwalVO.getDescNilai());
			System.out.println(pengkajianAwalVO.getId());
			detail.put("value",  pengkajianAwalTransaksiDao.getNilaiDetailLanjutan(pengkajianAwalVO.getId(), noRec));
			detail.put("values",  pengkajianAwalTransaksiDao.getNilaiDetailListLanjutan(pengkajianAwalVO.getId(), noRec));
			if(CommonUtil.isNotNullOrEmpty(pengkajianAwalVO.getPengkajianAwal())){
				detail.put("detail", jsonManipulationDetail(pengkajianAwalVO.getPengkajianAwal(), noRec));
			}
			if(CommonUtil.isNotNullOrEmpty(detail)){
				result.add(detail);
			}
		}
		return result;
	}

}
