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.RekananConverter;
import com.jasamedika.medifirst2000.converter.RuanganConverter;
import com.jasamedika.medifirst2000.converter.UsulanEvaluasiConverter;
import com.jasamedika.medifirst2000.converter.UsulanEvaluasiKomponenConverter;
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.Rekanan;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.entities.UsulanEvaluasi;
import com.jasamedika.medifirst2000.entities.UsulanEvaluasiKomponen;
import com.jasamedika.medifirst2000.service.EvaluasiRekananService;
import com.jasamedika.medifirst2000.service.LoginUserService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.DateUtil;
import com.jasamedika.medifirst2000.util.StringUtil;
import com.jasamedika.medifirst2000.vo.RuanganVO;
import com.jasamedika.medifirst2000.vo.UsulanEvaluasiKomponenVO;
import com.jasamedika.medifirst2000.vo.UsulanEvaluasiVO;


/**
 * @author Lukman Hakim
 *
 */
@Service("EvaluasiRekananService")
//@EnableCaching
public class EvaluasiRekananServiceImpl extends BaseVoServiceImpl implements EvaluasiRekananService {
	
	private static String SETTING_DATA_FIXED_JENIS="EvaluasiRekananHukor";
	
	@Autowired
	UsulanEvaluasiConverter usulanEvaluasiConverter;
	
	@Autowired
	UsulanEvaluasiKomponenConverter usulanEvaluasiKomponenConverter;
	
	@Autowired
	UsulanEvaluasiDao UsulanEvaluasiDao;
	
	 
	@Autowired
	UsulanEvaluasiKomponenDao usulanEvaluasiKomponenDao;
	
	@Autowired
	LoginUserService loginUserService;
	
	@Autowired
	RuanganConverter ruanganConverter;
	
	@Autowired
	KelompokEvaluasiConverter kelompokEvaluasiConverter;
	
	@Autowired
	RekananConverter rekananConverter;
	
	@Autowired
	KomponenEvaluasiConverter komponenEvaluasiConverter;
	
	@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);
		 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) {
			 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 ruanganId) {
		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.listUsulanEvaluasiByRuanganTujuan(tglAwal, tglAkhir, noUsulan,ruanganId);
		 }else{
			 maps=  UsulanEvaluasiDao.listUsulanEvaluasiByRuanganTujuan(tglAwal, tglAkhir,ruanganId);
		 }
		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 saveEvaluasiRekanan(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));//Set Static dahulu
		
		usulanEvaluasi.setJenisEvaluasi(jenisEvaluasi);
		//Ruangan Pembuat
		usulanEvaluasi.setRuanganPembuat(loginUser.getPegawai().getRuangan());
		
		//Rekanan
		if(CommonUtil.isNotNullOrEmpty(usulanEvaluasiVO.getRekanan())){
			usulanEvaluasi.setRekanan(rekananConverter.transferVOToModel(usulanEvaluasiVO.getRekanan(),new Rekanan()));
		}
		
		//Pegawai Pembuat
		usulanEvaluasi.setPegawaiPembuat(loginUser.getPegawai());
		
		UsulanEvaluasiDao.save(usulanEvaluasi);
		
		if (CommonUtil.isNotNullOrEmpty(usulanEvaluasi.getNoRec())){
			if(CommonUtil.isNotNullOrEmpty(usulanEvaluasiVO.getRuanganTujuan())){
				for (RuanganVO ruanganTujuan : usulanEvaluasiVO.getRuanganTujuan()) {
					Ruangan ruangan= ruanganConverter.transferVOToModel(ruanganTujuan, new Ruangan());
					if(CommonUtil.isNotNullOrEmpty(usulanEvaluasiVO.getUsulanEvaluasiKomponenVO())){
						for (UsulanEvaluasiKomponenVO usulanEvaluasiVOTemp : usulanEvaluasiVO.getUsulanEvaluasiKomponenVO()) {
							UsulanEvaluasiKomponen usulanEvaluasiKomponen = usulanEvaluasiKomponenConverter.transferVOToModel(usulanEvaluasiVOTemp, new UsulanEvaluasiKomponen());
							
							usulanEvaluasiKomponen.setRuanganTujuan(ruangan);
							usulanEvaluasiKomponen.setUsulanEvaluasi(usulanEvaluasi);
							usulanEvaluasiKomponen.setKajian(usulanEvaluasiVOTemp.getKajian());
							
							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 noEvaluasiRekanan() {
		//Rencana Diseminasi
			Long count = UsulanEvaluasiDao.countNoEvaluasi("ER");
			
			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 "ER" + yearNow + monthNow + number;
	}
	
	@Transactional
	@Override
	public Map<String, Object>  saveRekomendasiEvaluasiRekanan(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;
	}
 
}
