package com.jasamedika.medifirst2000.service.impl;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
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.google.gson.Gson;
import com.jasamedika.medifirst2000.constants.Master;
import com.jasamedika.medifirst2000.converter.PegawaiConverter;
import com.jasamedika.medifirst2000.converter.RiwayatPendidikanConverter;
import com.jasamedika.medifirst2000.dao.HistoryDataPegawaiDao;
import com.jasamedika.medifirst2000.dao.RiwayatPendidikanDao;
import com.jasamedika.medifirst2000.entities.HistoryDataPegawai;
import com.jasamedika.medifirst2000.entities.LoginUser;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.RiwayatPendidikan;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.LoginUserService;
import com.jasamedika.medifirst2000.service.RiwayatPendidikanService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.RiwayatPendidikanVO;


/******************
 * @author Shakato
 ******************/
@Service("RiwayatPendidikanService")
public class RiwayatPendidikanServiceImpl implements RiwayatPendidikanService {
	
	@Autowired
	private RiwayatPendidikanDao riwayatPendidikanDao;
	
	@Autowired
	private HistoryDataPegawaiDao historyDataPegawaiDao;
	
	@Autowired
	private RiwayatPendidikanConverter riwayatPendidikanConverter;
	
	@Autowired
	private PegawaiConverter pegawaiConverter;
	
	@Autowired
	private LoginUserService loginUserService;
	
	@Override
	public RiwayatPendidikanVO add(RiwayatPendidikanVO vo) throws JpaSystemException, ServiceVOException {
		RiwayatPendidikan model = new RiwayatPendidikan();
		model = riwayatPendidikanConverter.transferVOToModel(vo, model);
		
		model.setKdProfile(Master.KODE_PROFILE);
		
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd");  
		
		String perubahan = "";
		
		if (CommonUtil.isNotNullOrEmpty(vo.getNoRec())) {
			RiwayatPendidikan riwayatPendidikan = riwayatPendidikanDao.findOne(vo.getNoRec());
			
			if (CommonUtil.isNotNullOrEmpty(riwayatPendidikan.getStatusEnabled()) && CommonUtil.isNotNullOrEmpty(vo.getStatusEnabled())) {
				if (!riwayatPendidikan.getStatusEnabled().equals(vo.getStatusEnabled())) {
					perubahan += "status hapus riwayat pendidikan, ";
				}
			} else if (CommonUtil.isNullOrEmpty(riwayatPendidikan.getStatusEnabled()) && CommonUtil.isNotNullOrEmpty(vo.getStatusEnabled())) {
				perubahan += "status hapus riwayat pendidikan, ";
			}
			
			if (CommonUtil.isNotNullOrEmpty(riwayatPendidikan.getPendidikanId()) && CommonUtil.isNotNullOrEmpty(vo.getPendidikan())) {
				if (!riwayatPendidikan.getPendidikanId().equals(vo.getPendidikan().getId())) {
					perubahan += "ubah jenjang pendidikan, ";
				}
			} else if (CommonUtil.isNullOrEmpty(riwayatPendidikan.getPendidikanId()) && CommonUtil.isNotNullOrEmpty(vo.getPendidikan())) {
				perubahan += "jenjang pendidikan, ";
			} else if (CommonUtil.isNotNullOrEmpty(riwayatPendidikan.getPendidikanId()) && CommonUtil.isNullOrEmpty(vo.getPendidikan())) {
				perubahan += "hapus jenjang pendidikan, ";
			}
			
			if (CommonUtil.isNotNullOrEmpty(riwayatPendidikan.getNamaTempatPendidikan()) && CommonUtil.isNotNullOrEmpty(vo.getNamaTempatPendidikan())) {
				if (!riwayatPendidikan.getNamaTempatPendidikan().equals(vo.getNamaTempatPendidikan())) {
					perubahan += "ubah nama institusi pendidikan, ";
				}
			} else if (CommonUtil.isNullOrEmpty(riwayatPendidikan.getNamaTempatPendidikan()) && CommonUtil.isNotNullOrEmpty(vo.getNamaTempatPendidikan())) {
				perubahan += "nama institusi pendidikan, ";
			} else if (CommonUtil.isNotNullOrEmpty(riwayatPendidikan.getNamaTempatPendidikan()) && CommonUtil.isNullOrEmpty(vo.getNamaTempatPendidikan())) {
				perubahan += "hapus nama institusi pendidikan, ";
			}
			
			if (CommonUtil.isNotNullOrEmpty(riwayatPendidikan.getJurusan()) && CommonUtil.isNotNullOrEmpty(vo.getJurusan())) {
				if (!riwayatPendidikan.getJurusan().equals(vo.getJurusan())) {
					perubahan += "ubah jurusan, ";
				}
			} else if (CommonUtil.isNullOrEmpty(riwayatPendidikan.getJurusan()) && CommonUtil.isNotNullOrEmpty(vo.getJurusan())) {
				perubahan += "jurusan, ";
			} else if (CommonUtil.isNotNullOrEmpty(riwayatPendidikan.getJurusan()) && CommonUtil.isNullOrEmpty(vo.getJurusan())) {
				perubahan += "hapus jurusan, ";
			}
			
			if (CommonUtil.isNotNullOrEmpty(riwayatPendidikan.getTglLulus()) && CommonUtil.isNotNullOrEmpty(vo.getTglLulus())) {
				if (!df.format(riwayatPendidikan.getTglLulus()).equals(df.format(vo.getTglLulus()))) {
					perubahan += "ubah tanggal lulus, ";
				}
			} else if (CommonUtil.isNullOrEmpty(riwayatPendidikan.getTglLulus()) && CommonUtil.isNotNullOrEmpty(vo.getTglLulus())) {
				perubahan += "tanggal lulus, ";
			} else if (CommonUtil.isNotNullOrEmpty(riwayatPendidikan.getTglLulus()) && CommonUtil.isNullOrEmpty(vo.getTglLulus())) {
				perubahan += "hapus tanggal lulus, ";
			}
			
			if (CommonUtil.isNotNullOrEmpty(riwayatPendidikan.getNilaiIPK()) && CommonUtil.isNotNullOrEmpty(vo.getNilaiIPK())) {
				if (!riwayatPendidikan.getNilaiIPK().equals(vo.getNilaiIPK())) {
					perubahan += "ubah nilai ipk, ";
				}
			} else if (CommonUtil.isNullOrEmpty(riwayatPendidikan.getNilaiIPK()) && CommonUtil.isNotNullOrEmpty(vo.getNilaiIPK())) {
				perubahan += "nilai ipk, ";
			} else if (CommonUtil.isNotNullOrEmpty(riwayatPendidikan.getNilaiIPK()) && CommonUtil.isNullOrEmpty(vo.getNilaiIPK())) {
				perubahan += "hapus nilai ipk, ";
			}
			
			if (CommonUtil.isNotNullOrEmpty(riwayatPendidikan.getNoIjazah()) && CommonUtil.isNotNullOrEmpty(vo.getNoIjazah())) {
				if (!riwayatPendidikan.getNoIjazah().equals(vo.getNoIjazah())) {
					perubahan += "ubah no ijazah, ";
				}
			} else if (CommonUtil.isNullOrEmpty(riwayatPendidikan.getNoIjazah()) && CommonUtil.isNotNullOrEmpty(vo.getNoIjazah())) {
				perubahan += "no ijazah, ";
			} else if (CommonUtil.isNotNullOrEmpty(riwayatPendidikan.getNoIjazah()) && CommonUtil.isNullOrEmpty(vo.getNoIjazah())) {
				perubahan += "hapus no ijazah, ";
			}
			
			if (CommonUtil.isNotNullOrEmpty(riwayatPendidikan.getTglIjazah()) && CommonUtil.isNotNullOrEmpty(vo.getTglIjazah())) {
				if (!df.format(riwayatPendidikan.getTglIjazah()).equals(df.format(vo.getTglIjazah()))) {
					perubahan += "ubah tanggal ijazah, ";
				}
			} else if (CommonUtil.isNullOrEmpty(riwayatPendidikan.getTglIjazah()) && CommonUtil.isNotNullOrEmpty(vo.getTglIjazah())) {
				perubahan += "tanggal ijazah, ";
			} else if (CommonUtil.isNotNullOrEmpty(riwayatPendidikan.getTglIjazah()) && CommonUtil.isNullOrEmpty(vo.getTglIjazah())) {
				perubahan += " hapus tanggal ijazah, ";
			}
		} else {
			if (CommonUtil.isNotNullOrEmpty(vo.getPendidikan())) {
				perubahan += "jenjang pendidikan, ";
			}
			
			if (CommonUtil.isNotNullOrEmpty(vo.getNamaTempatPendidikan())) {
				perubahan += "nama tempat pendidikan, ";
			}
			
			if (CommonUtil.isNotNullOrEmpty(vo.getJurusan())) {
				perubahan += "jurusan, ";
			}
			
			if (CommonUtil.isNotNullOrEmpty(vo.getTglLulus())) {
				perubahan += "tanggal lulus, ";
			}
			
			if (CommonUtil.isNotNullOrEmpty(vo.getNilaiIPK())) {
				perubahan += "nilai ipk, ";
			}
			
			if (CommonUtil.isNotNullOrEmpty(vo.getNoIjazah())) {
				perubahan += "no ijazah, ";
			}
			
			if (CommonUtil.isNotNullOrEmpty(vo.getTglIjazah())) {
				perubahan += "tanggal ijazah, ";
			}
		}
		
		if (CommonUtil.isNotNullOrEmpty(perubahan)) {
			vo.setKeterangan("");
			this.saveHistoryPegawai(vo, perubahan);
		} else if (CommonUtil.isNullOrEmpty(perubahan)) {
			vo.setKeterangan(Master.TIDAK_ADA_PERUBAHAN_DATA);
		}
		
		riwayatPendidikanDao.save(model);
		
		return vo;
	}
	
	@Override
	public void saveHistoryPegawai(RiwayatPendidikanVO vo, String perubahan) {
		HistoryDataPegawai historyDataPegawai = new HistoryDataPegawai();
		if (CommonUtil.isNotNullOrEmpty(vo)) {
			LoginUser loginUser = loginUserService.getLoginUser();
//			model = riwayatPendidikanDao.findOne(model.getNoRec());
			if (CommonUtil.isNotNullOrEmpty(loginUser.getPegawai())) {
				historyDataPegawai.setPetugas(loginUser.getPegawai());
			}
			
//			RiwayatPendidikanVO data = riwayatPendidikanConverter.transferModelToVO(model, new RiwayatPendidikanVO());

			Gson gson = new Gson();
			String detail = gson.toJson(vo);
			if (CommonUtil.isNotNullOrEmpty(detail)) {
				historyDataPegawai.setDetail(detail);
			}

			historyDataPegawai.setPerubahan(perubahan);
			historyDataPegawai.setTanggal(new Date());
			historyDataPegawai.setPegawai(pegawaiConverter.transferVOToModel(vo.getPegawai(), new Pegawai()));
			if (CommonUtil.isNotNullOrEmpty(historyDataPegawai)) {
				historyDataPegawaiDao.save(historyDataPegawai);
			}
		}
	}

	@Override
	public RiwayatPendidikanVO update(RiwayatPendidikanVO vo) throws JpaSystemException, ServiceVOException {
		RiwayatPendidikan model=riwayatPendidikanDao.findOne(vo.getNoRec());
		RiwayatPendidikan resultModel=riwayatPendidikanDao.save(model);
		RiwayatPendidikanVO resultVo=new RiwayatPendidikanVO();
		resultVo=riwayatPendidikanConverter.transferModelToVO(resultModel, resultVo);
		return resultVo;
	}

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

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

	@Override
	public List<RiwayatPendidikanVO> findAll() throws JpaSystemException {
		return null;
	}

	@Override
	public Map<String, Object> findAllWithPageAndLimitAndSortByAndDirectionParameter(Integer page, Integer limit,
			String sort, String dir) {
		return null;
	}

	@Override
	public List<Map<String, Object>> findDataRiwayatPendidikan(Integer idPegawai) {
		List<Map<String, Object>> result = riwayatPendidikanDao.getDataRiwayatPendidikan(idPegawai);
		if (CommonUtil.isNotNullOrEmpty(result)) {
			return result;
		} else {
			return new ArrayList<>();
		}
	}

	@Override
	public List<Map<String, Object>> findSimpleRiwayatPendidikanByPegawai(Integer idPegawai) {
		List<Map<String, Object>> result = riwayatPendidikanDao.getSimpleRiwayatPendidikanByPegawai(idPegawai);
		if (CommonUtil.isNotNullOrEmpty(result)) {
			return result;
		} else {
			return new ArrayList<>();
		}
	}

}
