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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.K3LaporanKecelakaanKerjaDao;
import com.jasamedika.medifirst2000.dao.LkkIdentifikasiKorbanDao;
import com.jasamedika.medifirst2000.dao.custom.K3LaporanKecelakaanKerjaDaoCustom;
import com.jasamedika.medifirst2000.entities.K3LaporanKecelakaanKerja;
import com.jasamedika.medifirst2000.entities.LkkPerkiraanKerugian;
import com.jasamedika.medifirst2000.entities.LkkIdentifikasiKejadian;
import com.jasamedika.medifirst2000.entities.LkkIdentifikasiKorban;
import com.jasamedika.medifirst2000.entities.LkkRencanaTindakLanjut;
import com.jasamedika.medifirst2000.entities.LkkSaksiKejadian;
import com.jasamedika.medifirst2000.entities.LoginUser;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.entities.StatusYaTidak;
import com.jasamedika.medifirst2000.service.K3LaporanKecelakaanKerjaService;
import com.jasamedika.medifirst2000.service.LoginUserService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.K3LaporanKecelakaanKerjaVO;
import com.jasamedika.medifirst2000.vo.LkkPerkiraanKerugianVO;
import com.jasamedika.medifirst2000.vo.LkkIdentifikasiKejadianVO;
import com.jasamedika.medifirst2000.vo.LkkIdentifikasiKorbanVO;
import com.jasamedika.medifirst2000.vo.LkkRencanaTindakLanjutVO;
import com.jasamedika.medifirst2000.vo.LkkSaksiKejadianVO;
import com.jasamedika.medifirst2000.vo.PegawaiVO;
import com.jasamedika.medifirst2000.vo.RuanganVO;
import com.jasamedika.medifirst2000.vo.StatusYaTidakVO;

@Service("k3LaporanKecelakaanKerjaService")
public class K3LaporanKecelakaanKerjaServiceImpl implements K3LaporanKecelakaanKerjaService{

	@Autowired
	private K3LaporanKecelakaanKerjaDao k3LaporanKecelakaanKerjaDao;
	
	@Autowired
	private K3LaporanKecelakaanKerjaDaoCustom k3LaporanKecelakaanKerjaDaoCustom;
	
	@Autowired
	private LoginUserService loginUserService;
	
	@Autowired
	private BaseConverterImpl <K3LaporanKecelakaanKerjaVO, K3LaporanKecelakaanKerja> k3LaporanKecelakaanKerjaConverter;
	
	@Autowired
	private BaseConverterImpl <PegawaiVO, Pegawai> pelaporConverter;
	
	@Autowired
	private BaseConverterImpl <LkkIdentifikasiKejadianVO, LkkIdentifikasiKejadian> lkkIdentifikasiKejadianConverter;
	
	@Autowired
	private BaseConverterImpl <LkkRencanaTindakLanjutVO, LkkRencanaTindakLanjut> lkkRencanaTindakLanjutConverter;
	
	@Autowired
	private BaseConverterImpl <LkkPerkiraanKerugianVO, LkkPerkiraanKerugian> lkkPerkiraanKerugianConverter;
	
	@Autowired
	private BaseConverterImpl <LkkIdentifikasiKorbanVO, LkkIdentifikasiKorban> lkkIdentifikasiKorbanConverter;
	
	@Autowired
	private BaseConverterImpl <RuanganVO, Ruangan> ruanganConverter;
	
	@Autowired
	private BaseConverterImpl <LkkSaksiKejadianVO, LkkSaksiKejadian> lkkSaksiKejadianConverter;
	
	@Autowired
	private LkkIdentifikasiKorbanDao lkkIdentifikasiKorbanDao;
	
	
	@Override
	public Map<String, Object> getUserLogin() {
		Map<String, Object> result = new HashMap<String,Object>();
		Pegawai pegawai = loginUserService.getLoginUser().getPegawai();
		if(CommonUtil.isNotNullOrEmpty(pegawai)){
			result.put("name", pegawai.getNamaLengkap());
			result.put("idPegawai", pegawai.getId());
			result.put("idRuangan", pegawai.getRuangan().getId());
		}
		return result;
	}
	
	@Override
	public Map<String, Object> getUnitRuangan(){
		Map<String, Object> result = new HashMap<>();
		List<Map<String, Object>> listUnitRuangan = k3LaporanKecelakaanKerjaDaoCustom.getUnitRuangan();
		if(CommonUtil.isNotNullOrEmpty(listUnitRuangan)){
			result.put("unitRuangan", listUnitRuangan);
		}
		return result;
	}
	
	@Override
	public Map<String, Object> saveDataLkk(K3LaporanKecelakaanKerjaVO vo){
		Map<String, Object> result = new HashMap<>();
		K3LaporanKecelakaanKerja k3LaporanKecelakaanKerja = new K3LaporanKecelakaanKerja();
		
		if(CommonUtil.isNotNullOrEmpty(vo)){
			k3LaporanKecelakaanKerja = k3LaporanKecelakaanKerjaConverter.transferVOToModel(vo, new K3LaporanKecelakaanKerja());
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getPelapor())){
			k3LaporanKecelakaanKerja.setPelapor(pelaporConverter.transferVOToModel(vo.getPelapor(), new Pegawai()));
		}
		
		if(CommonUtil.isNotNullOrEmpty(vo.getLkkIdentifikasiKejadian())){
			LkkIdentifikasiKejadian lkkIdentifikasiKejadian = lkkIdentifikasiKejadianConverter.transferVOToModel(vo.getLkkIdentifikasiKejadian(), new LkkIdentifikasiKejadian());
			
			if(CommonUtil.isNotNullOrEmpty(vo.getLkkIdentifikasiKejadian())){
				lkkIdentifikasiKejadian.setK3LaporanKecelakaanKerja(k3LaporanKecelakaanKerja);
			}
			
			Set<LkkIdentifikasiKorban> lkkIdentifikasiKorbanSet = new HashSet<>();
			if(CommonUtil.isNotNullOrEmpty(vo.getLkkIdentifikasiKejadian().getLkkIdentifikasiKorban())){
				
				for(LkkIdentifikasiKorbanVO modelVO : vo.getLkkIdentifikasiKejadian().getLkkIdentifikasiKorban()){
					LkkIdentifikasiKorban lkkIdentifikasiKorban = lkkIdentifikasiKorbanConverter.transferVOToModel(modelVO, new LkkIdentifikasiKorban());
					
					if(CommonUtil.isNotNullOrEmpty(modelVO)){
						lkkIdentifikasiKorban.setLkkIdentifikasiKejadian(lkkIdentifikasiKejadian);
					}
					if(CommonUtil.isNotNullOrEmpty(modelVO.getUnitRuangan())){
						Ruangan ruangan = ruanganConverter.transferVOToModel(modelVO.getUnitRuangan(), new Ruangan());
						if(ruangan.getId()!=0){
							lkkIdentifikasiKorban.setUnitRuangan(ruangan);
						}
					}
					if(CommonUtil.isNotNullOrEmpty(modelVO.getLkkRencanaTindakLanjut())){
						LkkRencanaTindakLanjut lkkRencanaTindakLanjut = lkkRencanaTindakLanjutConverter.
								transferVOToModel(modelVO.getLkkRencanaTindakLanjut(), new LkkRencanaTindakLanjut());
						
						if(CommonUtil.isNotNullOrEmpty(modelVO.getLkkRencanaTindakLanjut())){
							lkkRencanaTindakLanjut.setLkkIdentifikasiKorban(lkkIdentifikasiKorban);
						}
						if(CommonUtil.isNotNullOrEmpty(lkkRencanaTindakLanjut)){
							lkkIdentifikasiKorban.setLkkRencanaTindakLanjut(lkkRencanaTindakLanjut);
						}
					}
					if(CommonUtil.isNotNullOrEmpty(modelVO.getLkkPerkiraanKerugian())){
						LkkPerkiraanKerugian lkkPerkiraanKerugian = lkkPerkiraanKerugianConverter.
								transferVOToModel(modelVO.getLkkPerkiraanKerugian(), new LkkPerkiraanKerugian());
						
						if(CommonUtil.isNotNullOrEmpty(modelVO.getLkkPerkiraanKerugian())){
							lkkPerkiraanKerugian.setLkkIdentifikasiKorban(lkkIdentifikasiKorban);
						}
						if(CommonUtil.isNotNullOrEmpty(lkkPerkiraanKerugian)){
							lkkIdentifikasiKorban.setLkkPerkiraanKerugian(lkkPerkiraanKerugian);
						}
					}
					if(CommonUtil.isNotNullOrEmpty(lkkIdentifikasiKorban)){
						lkkIdentifikasiKorbanSet.add(lkkIdentifikasiKorban);
					}
				}
				if(CommonUtil.isNotNullOrEmpty(lkkIdentifikasiKorbanSet)){
					lkkIdentifikasiKejadian.setLkkIdentifikasiKorban(lkkIdentifikasiKorbanSet);
				}
			}
			
			Set<LkkSaksiKejadian> lkkSaksiKejadianSet = new HashSet<>();
			if(CommonUtil.isNotNullOrEmpty(vo.getLkkIdentifikasiKejadian().getLkkSaksiKejadian())){
				for(LkkSaksiKejadianVO modelVO : vo.getLkkIdentifikasiKejadian().getLkkSaksiKejadian()){
					LkkSaksiKejadian lkkSaksiKejadian = lkkSaksiKejadianConverter.transferVOToModel(modelVO, new LkkSaksiKejadian());
					
					if(CommonUtil.isNotNullOrEmpty(modelVO)){
						lkkSaksiKejadian.setLkkIdentifikasiKejadian(lkkIdentifikasiKejadian);
					}
					if(CommonUtil.isNotNullOrEmpty(lkkSaksiKejadian)){
						lkkSaksiKejadianSet.add(lkkSaksiKejadian);
					}
				}
				if(CommonUtil.isNotNullOrEmpty(lkkSaksiKejadianSet)){
					lkkIdentifikasiKejadian.setLkkSaksiKejadian(lkkSaksiKejadianSet);
				}
			}
			
			if(CommonUtil.isNotNullOrEmpty(lkkIdentifikasiKejadian)){
				k3LaporanKecelakaanKerja.setLkkIdentifikasiKejadian(lkkIdentifikasiKejadian);
			}
		}
	
		if(CommonUtil.isNotNullOrEmpty(k3LaporanKecelakaanKerja)){
			K3LaporanKecelakaanKerja k3LaporanKecelakaanKerjaResult = k3LaporanKecelakaanKerjaDao.save(k3LaporanKecelakaanKerja);
			result.put("noRec", k3LaporanKecelakaanKerjaResult.noRec);
		}
		return result;
	}
	
	@Override
	public Map<String, Object> getIdentifikasiKejadian(Integer idPegawai){
		Map<String, Object> result = new HashMap<>();
		List<Map<String, Object>> identifikasiKejadian = k3LaporanKecelakaanKerjaDaoCustom.getIdentifikasiKejadian(idPegawai);
		List<Map<String, Object>> listData = new ArrayList<Map<String, Object>>();
		if(CommonUtil.isNotNullOrEmpty(identifikasiKejadian)){
			for (Map<String, Object> temp : identifikasiKejadian) {
				String noRec = (String) temp.get("noRec");
				Map<String, Object> jmlKorban = k3LaporanKecelakaanKerjaDao.getJumlahKorban(noRec);
				if(CommonUtil.isNotNullOrEmpty(jmlKorban)){
					temp.put("jumlahKorban", jmlKorban.get("jmlKorban"));
				}
				listData.add(temp);
			}
		}
		
		if(CommonUtil.isNotNullOrEmpty(listData)){
			result.put("identifikasiKejadian", listData);
		}
		return result;
	}
	
	@Override
	public Map<String, Object> getDataLkkByNoRec(String noRec){
		Map<String, Object> result = new HashMap<>();
		
		List<Map<String, Object>> lkkIdentifikasiKorban = k3LaporanKecelakaanKerjaDaoCustom.getLkkIdentifikasiKorban(noRec);
		if(CommonUtil.isNotNullOrEmpty(lkkIdentifikasiKorban)){
			result.put("lkkIdentifikasiKorban", lkkIdentifikasiKorban);
		}
		
		List<Map<String, Object>> lkkSaksiKejadian = k3LaporanKecelakaanKerjaDaoCustom.getLkkSaksiKejadian(noRec);
		if(CommonUtil.isNotNullOrEmpty(lkkSaksiKejadian)){
			result.put("lkkSaksiKejadian", lkkSaksiKejadian);
		}
		return result;
	}
	
	@Override
	public Integer updateIdentifikasiKejadian(LkkIdentifikasiKejadianVO vo){
		if(CommonUtil.isNotNullOrEmpty(vo)){
			LkkIdentifikasiKejadian model = lkkIdentifikasiKejadianConverter.transferVOToModel(vo, new LkkIdentifikasiKejadian());
			Set<LkkIdentifikasiKorban> lkkIdentifikasiKorbanSet = new HashSet<>();
			List<Map<String, Object>> lkkIdentifikasiKorban = k3LaporanKecelakaanKerjaDaoCustom.getLkkIdentifikasiKorban(model.getNoRec());
			String tindakanLanjutan = "";
			for(LkkIdentifikasiKorbanVO model1 : vo.getLkkIdentifikasiKorban()){
				LkkRencanaTindakLanjut rencana = lkkRencanaTindakLanjutConverter.transferVOToModel(model1.getLkkRencanaTindakLanjut(), new LkkRencanaTindakLanjut());
				tindakanLanjutan = rencana.getTindakanLanjutan();
			}
			
			for(Map<String, Object> model1 : lkkIdentifikasiKorban){
				LkkIdentifikasiKorban identifikasiKorban =  new LkkIdentifikasiKorban(); 
				LkkRencanaTindakLanjut rencana = new LkkRencanaTindakLanjut();
				rencana.setTindakanLanjutan(tindakanLanjutan);
				identifikasiKorban.setLkkRencanaTindakLanjut(rencana);
				identifikasiKorban.setNoRec((String) model1.get("noRec_korban"));
				
				lkkIdentifikasiKorbanSet.add(identifikasiKorban);
			}
			
			model.setLkkIdentifikasiKorban(lkkIdentifikasiKorbanSet);
			
			return k3LaporanKecelakaanKerjaDaoCustom.updateIdentifikasiKejadian(model);
		} else {
			return null;
		}
	}
	
	@Override
	public Integer updateIdentifikasiKorban(LkkIdentifikasiKorbanVO vo){
		if(CommonUtil.isNotNullOrEmpty(vo)){
			LkkIdentifikasiKorban lkkIdentifikasiKorban = lkkIdentifikasiKorbanConverter.transferVOToModel(vo, new LkkIdentifikasiKorban());
			
			if(CommonUtil.isNotNullOrEmpty(vo.getUnitRuangan())){
				lkkIdentifikasiKorban.setUnitRuangan(ruanganConverter.transferVOToModel(vo.getUnitRuangan(), new Ruangan()));
			}
			
			if(CommonUtil.isNotNullOrEmpty(vo.getLkkRencanaTindakLanjut())){
				lkkIdentifikasiKorban.setLkkRencanaTindakLanjut(lkkRencanaTindakLanjutConverter.transferVOToModel(vo.getLkkRencanaTindakLanjut(), new LkkRencanaTindakLanjut()));
			}
			
			if(CommonUtil.isNotNullOrEmpty(vo.getLkkPerkiraanKerugian())){
				lkkIdentifikasiKorban.setLkkPerkiraanKerugian(lkkPerkiraanKerugianConverter.transferVOToModel(vo.getLkkPerkiraanKerugian(), new LkkPerkiraanKerugian()));
			}
			
			return k3LaporanKecelakaanKerjaDaoCustom.updateIdentifikasiKorban(lkkIdentifikasiKorban);
		} else {
			return null;
		}
	}
	
	@Override
	public Integer updateSaksiKejadian(LkkSaksiKejadianVO vo){
		if(CommonUtil.isNotNullOrEmpty(vo)){
			LkkSaksiKejadian model = lkkSaksiKejadianConverter.transferVOToModel(vo, new LkkSaksiKejadian());
			return k3LaporanKecelakaanKerjaDaoCustom.updateSaksiKejadian(model);
		} else {
			return null;
		}
	}
	
	@Override
	public Boolean deleteIdentifikasiKejadian(String noRec){
		if(CommonUtil.isNotNullOrEmpty(noRec)){
			k3LaporanKecelakaanKerjaDaoCustom.deleteIdentifikasiKejadian(noRec);
			return true;
		} else {
			return false;
		}
	}
	
	@Override
	public Boolean deleteIdentifikasiKorban(String noRec){
		LkkIdentifikasiKorban lkkIdentifikasiKorban = lkkIdentifikasiKorbanDao.findOne(noRec);
		if(CommonUtil.isNotNullOrEmpty(lkkIdentifikasiKorban)){
			lkkIdentifikasiKorban.setStatusEnabled(false);
			lkkIdentifikasiKorbanDao.save(lkkIdentifikasiKorban);
			return true;
		}else return false;
		
//		if(CommonUtil.isNotNullOrEmpty(noRec)){
//			k3LaporanKecelakaanKerjaDaoCustom.deleteIdentifikasiKorban(noRec);
//			return true;
//		} else {
//			return false;
//		}
	}
	
	@Override
	public Boolean deleteSaksiKejadian(String noRec){
		if(CommonUtil.isNotNullOrEmpty(noRec)){
			k3LaporanKecelakaanKerjaDaoCustom.deleteSaksiKejadian(noRec);
			return true;
		} else {
			return false;
		}
	}
	
	@Override
	public Integer verifLaporanKecelakaan(K3LaporanKecelakaanKerjaVO vo){
		if(CommonUtil.isNotNullOrEmpty(vo)){
			K3LaporanKecelakaanKerja model = k3LaporanKecelakaanKerjaConverter.transferVOToModel(vo, new K3LaporanKecelakaanKerja());
			return k3LaporanKecelakaanKerjaDaoCustom.verifLaporanKecelakaan(model);
		} else {
			return null;
		}
	}
}
