package com.jasamedika.medifirst2000.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import com.jasamedika.medifirst2000.converter.KelompokEvaluasiConverter;
import com.jasamedika.medifirst2000.converter.KomponenEvaluasiConverter;
import com.jasamedika.medifirst2000.converter.PegawaiConverter;
import com.jasamedika.medifirst2000.converter.RuanganConverter;
import com.jasamedika.medifirst2000.converter.UsulanEvaluasiConverter;
import com.jasamedika.medifirst2000.converter.UsulanEvaluasiKomponenConverter;
import com.jasamedika.medifirst2000.dao.PegawaiDao;
import com.jasamedika.medifirst2000.dao.PlanningDiklatHumasMarketDao;
import com.jasamedika.medifirst2000.dao.UsulanEvaluasiDao;
import com.jasamedika.medifirst2000.dao.UsulanEvaluasiKomponenDao;
import com.jasamedika.medifirst2000.entities.JenisEvaluasi;
import com.jasamedika.medifirst2000.entities.KelompokEvaluasi;
import com.jasamedika.medifirst2000.entities.KomponenEvaluasi;
import com.jasamedika.medifirst2000.entities.LoginUser;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.entities.UsulanEvaluasi;
import com.jasamedika.medifirst2000.entities.UsulanEvaluasiKomponen;
import com.jasamedika.medifirst2000.service.LoginUserService;
import com.jasamedika.medifirst2000.service.UsulanEvaluasiService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.DateUtil;
import com.jasamedika.medifirst2000.util.StringUtil;
import com.jasamedika.medifirst2000.vo.PegawaiVO;
import com.jasamedika.medifirst2000.vo.UsulanEvaluasiKomponenVO;
import com.jasamedika.medifirst2000.vo.UsulanEvaluasiVO;


@Service("UsulanEvaluasiService")
//@EnableCaching
public class UsulanEvaluasiServiceImpl extends BaseVoServiceImpl implements UsulanEvaluasiService {
	
	private static String SETTING_DATA_FIXED_JENIS="UsulanEvaluasiHukor";
	
	@Autowired
	UsulanEvaluasiConverter usulanEvaluasiConverter;
	
	@Autowired
	UsulanEvaluasiKomponenConverter usulanEvaluasiKomponenConverter;
	
	@Autowired
	UsulanEvaluasiDao UsulanEvaluasiDao;
	
	@Autowired
	PlanningDiklatHumasMarketDao planningDiklatHumasMarketDao;
	
	@Autowired
	UsulanEvaluasiKomponenDao usulanEvaluasiKomponenDao;
	
	@Autowired
	LoginUserService loginUserService;
	
	@Autowired
	RuanganConverter ruanganConverter;
	
	@Autowired
	PegawaiConverter  pegawaiConverter;
	
	@Autowired
	KelompokEvaluasiConverter kelompokEvaluasiConverter;
	
	@Autowired
	KomponenEvaluasiConverter komponenEvaluasiConverter;
	
	@Autowired
	PegawaiDao pegawaiDao;
	
	@Override
	public List<Map<String, Object>> listUsulanEvaluasiByRuanganPembuat(String tglAwal, String tglAkhir,
			String noUsulan, Integer ruanganId) {
		List<Map<String, Object>> maps = null;
		List<Map<String, Object>> result= new ArrayList<Map<String, Object>>();
		String idJensEvaluasi = GetSettingDataFixed(SETTING_DATA_FIXED_JENIS);
		System.out.println("Usulan Evaluasi Jenis "+ idJensEvaluasi);
		 if (CommonUtil.isNotNullOrEmpty(noUsulan)){
			 maps =  UsulanEvaluasiDao.listUsulanEvaluasiByRuanganPembuat(tglAwal, tglAkhir, noUsulan,ruanganId,Integer.parseInt(idJensEvaluasi));
		 }else{
			 maps= UsulanEvaluasiDao.listUsulanEvaluasiByRuanganPembuat(tglAwal, tglAkhir,ruanganId,Integer.parseInt(idJensEvaluasi));
		 }
		 for (Map<String, Object> map : maps) {
			 System.out.println("NoRec :"+map.get("noRec").toString());
			 List<Map<String, Object>> komponen= UsulanEvaluasiDao.listUsulanEvaluasiKomponenByNoRecEvaluasi(map.get("noRec").toString());
			 map.put("komponen", komponen);
			 result.add(map);
		}
		 return result;
	}

	@Override
	public List<Map<String, Object>> listUsulanEvaluasiByRuanganTujuan(String tglAwal, String tglAkhir, String noUsulan,
			Integer idPegawai) {
		List<Map<String, Object>> maps = null;
		List<Map<String, Object>> result= new ArrayList<Map<String, Object>>();
		String idJensEvaluasi = GetSettingDataFixed(SETTING_DATA_FIXED_JENIS);
		if (CommonUtil.isNotNullOrEmpty(noUsulan)){
			maps= UsulanEvaluasiDao.getUsulanEvaluasiByRuanganTujuan(tglAwal, tglAkhir, noUsulan,idPegawai);
		 }else{
			 maps=  UsulanEvaluasiDao.getUsulanEvaluasiByRuanganTujuan(tglAwal, tglAkhir,idPegawai);
		 }
		for (Map<String, Object> map : maps) {
			 Map<String, Object> komponen= UsulanEvaluasiDao.getUsulanEvaluasiByNoRec(map.get("noRec").toString());
			 komponen.put("komponen", map);
			 result.add(komponen);
		}
		return result;
	}

	@Override
	public Map<String, Object> usulanEvaluasiByNoUsulan(String noUsulan) {
		Map<String,Object> usulanEvaluasi = new HashMap<>();
		 usulanEvaluasi= UsulanEvaluasiDao.getUsulanEvaluasiByNoPlanning(noUsulan);
		List<Map<String,Object>> usulanEvaluasiKomponens= UsulanEvaluasiDao.listUsulanEvaluasiByNoPlanning(usulanEvaluasi.get("noRec").toString());
		String ruanganTujuan= "";
		for (Map<String, Object> map : usulanEvaluasiKomponens) {
			ruanganTujuan = CommonUtil.isNotNullOrEmpty(map.get("namaRuanganTujuan"))?map.get("namaRuanganTujuan").toString() +","+ruanganTujuan :ruanganTujuan;
		}
		usulanEvaluasi.put("ruanganTujuan",ruanganTujuan);
		//map.put("usulanEvaluasi", usulanEvaluasi);
		usulanEvaluasi.put("list",CommonUtil.isNotNullOrEmpty(usulanEvaluasiKomponens)?usulanEvaluasiKomponens:null );
		return usulanEvaluasi;
	}

	@Transactional
	@Override
	public String saveUsulanEvaluasiDanKahianOrganisasi(UsulanEvaluasiVO usulanEvaluasiVO) {
		
		UsulanEvaluasi usulanEvaluasi= usulanEvaluasiConverter.transferVOToModel(usulanEvaluasiVO, new UsulanEvaluasi());
		usulanEvaluasi.setNamaUsulan(usulanEvaluasiVO.getNoUsulan());
		usulanEvaluasi.setNoUsulan(usulanEvaluasiVO.getNoUsulan());
		usulanEvaluasi.setTglUsulan(usulanEvaluasiVO.getTglUsulan());
		LoginUser loginUser = loginUserService.getLoginUser();
		
		//SET JENIS EVALUASI
		String idJensEvaluasi = GetSettingDataFixed(SETTING_DATA_FIXED_JENIS);
		JenisEvaluasi jenisEvaluasi = new JenisEvaluasi();
		jenisEvaluasi.setId(Integer.parseInt(idJensEvaluasi));
		
		usulanEvaluasi.setJenisEvaluasi(jenisEvaluasi);
		//Ruangan Pembuat
		usulanEvaluasi.setRuanganPembuat(loginUser.getPegawai().getRuangan());
		
		
		//Pegawai Pembuat
		usulanEvaluasi.setPegawaiPembuat(loginUser.getPegawai());
		
		UsulanEvaluasiDao.save(usulanEvaluasi);
		
		if (CommonUtil.isNotNullOrEmpty(usulanEvaluasi.getNoRec())){
			if(CommonUtil.isNotNullOrEmpty(usulanEvaluasiVO.getPegawai())){
				for (PegawaiVO pegawaiTujuan : usulanEvaluasiVO.getPegawai()) {
					Pegawai pegawai= pegawaiConverter.transferVOToModel(pegawaiTujuan, new Pegawai());
					pegawai.setId(pegawaiTujuan.getId());
					
					if(CommonUtil.isNotNullOrEmpty(usulanEvaluasiVO.getUsulanEvaluasiKomponenVO())){
						for (UsulanEvaluasiKomponenVO usulanEvaluasiVOTemp : usulanEvaluasiVO.getUsulanEvaluasiKomponenVO()) {
							UsulanEvaluasiKomponen usulanEvaluasiKomponen = usulanEvaluasiKomponenConverter.transferVOToModel(usulanEvaluasiVOTemp, new UsulanEvaluasiKomponen());
							
							//Ruangan tujuan
							Integer idRuangan= pegawaiDao.findIdRuanganByIdPegawai(pegawaiTujuan.getId());
							Ruangan ruangan= new Ruangan();
							ruangan.setId(idRuangan);
							
							//Pegawai
							usulanEvaluasiKomponen.setPegawaiRekomendasi(pegawai);
							
							usulanEvaluasiKomponen.setRuanganTujuan(ruangan);
							usulanEvaluasiKomponen.setUsulanEvaluasi(usulanEvaluasi);
							
							if(CommonUtil.isNotNullOrEmpty(usulanEvaluasiVOTemp.getKelompokEvaluasi())){
								usulanEvaluasiKomponen.setKelompokEvaluasi(kelompokEvaluasiConverter.transferVOToModel(usulanEvaluasiVOTemp.getKelompokEvaluasi(), new KelompokEvaluasi()));
							}
							
							if(CommonUtil.isNotNullOrEmpty(usulanEvaluasiVOTemp.getKomponenEvaluasi())){
								usulanEvaluasiKomponen.setKomponenEvaluasi(komponenEvaluasiConverter.transferVOToModel(usulanEvaluasiVOTemp.getKomponenEvaluasi(), new KomponenEvaluasi()));
							}
							
							usulanEvaluasiKomponenDao.save(usulanEvaluasiKomponen);
						}
						
					}
				}
			}
			 
		}
		
		return usulanEvaluasi.getNoRec();
	}

	@Override
	public String noUsulanDanKajianOrganisasi() {
		//Rencana Diseminasi
		Long count = UsulanEvaluasiDao.countNoEvaluasi("UE");
			
			String monthNow = String.valueOf(DateUtil.getMonthFromDate(new Date()));
			String yearNow = String.valueOf(DateUtil.getYear(new Date())).substring(2, 4);
			String digit = null;
			
			count++;
			
			 String number= StringUtil.formatNumber(count.toString(), 4);
			
			return "UE" + yearNow + monthNow + number;
	}
	@Transactional
	@Override
	public Map<String, Object>  saveRekomendasiUsulanEvaluasi(UsulanEvaluasiVO usulanEvaluasiVO) {
		Map<String, Object> result= new HashMap<String, Object>();
		Integer i=1;
		for (UsulanEvaluasiKomponenVO usulanEvaluasiKomponenVO : usulanEvaluasiVO.getUsulanEvaluasiKomponenVO()) {
			UsulanEvaluasiKomponen usulanEvaluasiKomponen= usulanEvaluasiKomponenDao.findOne(usulanEvaluasiKomponenVO.getNoRec());
			usulanEvaluasiKomponen.setRekomendasi(usulanEvaluasiKomponenVO.getRekomendasi());
			
			usulanEvaluasiKomponenDao.save(usulanEvaluasiKomponen);
			result.put("noRec-"+i, usulanEvaluasiKomponen.getNoRec());
			i++;
			
		}
		return result;
	}
}
