package com.jasamedika.medifirst2000.service.impl;

import java.sql.Timestamp;
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.RiwayatJabatanConverter;
import com.jasamedika.medifirst2000.dao.HistoryDataPegawaiDao;
import com.jasamedika.medifirst2000.dao.RiwayatJabatanDao;
import com.jasamedika.medifirst2000.entities.HistoryDataPegawai;
import com.jasamedika.medifirst2000.entities.LoginUser;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.RiwayatJabatan;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.LoginUserService;
import com.jasamedika.medifirst2000.service.RiwayatJabatanService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.RiwayatJabatanVO;

/******************
 * @author Shakato
 ******************/
@Service("RiwayatJabatanService")
public class RiwayatJabatanServiceImpl implements RiwayatJabatanService {

	@Autowired
	private RiwayatJabatanDao riwayatJabatanDao;

	@Autowired
	private HistoryDataPegawaiDao historyDataPegawaiDao;

	@Autowired
	private RiwayatJabatanConverter riwayatJabatanConverter;

	@Autowired
	private PegawaiConverter pegawaiConverter;

	@Autowired
	private LoginUserService loginUserService;

	@Override
	public RiwayatJabatanVO add(RiwayatJabatanVO vo) throws JpaSystemException, ServiceVOException {
		RiwayatJabatan model = new RiwayatJabatan();
		model = riwayatJabatanConverter.transferVOToModel(vo, model);

		model.setKdProfile(Master.KODE_PROFILE);

		String perubahan = "";

		if (CommonUtil.isNotNullOrEmpty(vo.getNoRec())) {
			RiwayatJabatan riwayatJabatan = riwayatJabatanDao.findOne(vo.getNoRec());

			if (CommonUtil.isNotNullOrEmpty(riwayatJabatan.getStatusEnabled())
					&& CommonUtil.isNotNullOrEmpty(vo.getStatusEnabled())) {
				if (!riwayatJabatan.getStatusEnabled().equals(vo.getStatusEnabled())) {
					perubahan += "status hapus riwayat jabatan, ";
				}
			} else if (CommonUtil.isNullOrEmpty(riwayatJabatan.getStatusEnabled())
					&& CommonUtil.isNotNullOrEmpty(vo.getStatusEnabled())) {
				perubahan += "status hapus riwayat jabatan, ";
			}

			if (CommonUtil.isNotNullOrEmpty(riwayatJabatan.getNoSK()) && CommonUtil.isNotNullOrEmpty(vo.getNoSK())) {
				if (!riwayatJabatan.getNoSK().equals(vo.getNoSK())) {
					perubahan += "ubah no sk, ";
				}
			} else if (CommonUtil.isNullOrEmpty(riwayatJabatan.getNoSK())
					&& CommonUtil.isNotNullOrEmpty(vo.getNoSK())) {
				perubahan += "no sk, ";
			} else if (CommonUtil.isNotNullOrEmpty(riwayatJabatan.getNoSK())
					&& CommonUtil.isNullOrEmpty(vo.getNoSK())) {
				perubahan += "hapus no sk, ";
			}

			if (CommonUtil.isNotNullOrEmpty(riwayatJabatan.getTglSK()) && CommonUtil.isNotNullOrEmpty(vo.getTglSK())) {
				if (!riwayatJabatan.getTglSK().equals(new Timestamp(vo.getTglSK().getTime()))) {
					perubahan += "ubah tanggal sk, ";
				}
			} else if (CommonUtil.isNullOrEmpty(riwayatJabatan.getTglSK())
					&& CommonUtil.isNotNullOrEmpty(vo.getTglSK())) {
				perubahan += "tanggal sk, ";
			} else if (CommonUtil.isNotNullOrEmpty(riwayatJabatan.getTglSK())
					&& CommonUtil.isNullOrEmpty(vo.getTglSK())) {
				perubahan += "hapus tanggal sk, ";
			}

			if (CommonUtil.isNotNullOrEmpty(riwayatJabatan.getSumberData())
					&& CommonUtil.isNotNullOrEmpty(vo.getSumberData())) {
				if (!riwayatJabatan.getSumberData().equals(vo.getSumberData())) {
					perubahan += "ubah sumber data, ";
				}
			} else if (CommonUtil.isNullOrEmpty(riwayatJabatan.getSumberData())
					&& CommonUtil.isNotNullOrEmpty(vo.getSumberData())) {
				perubahan += "sumber data, ";
			} else if (CommonUtil.isNotNullOrEmpty(riwayatJabatan.getSumberData())
					&& CommonUtil.isNullOrEmpty(vo.getSumberData())) {
				perubahan += "hapus sumber data, ";
			}

			if (CommonUtil.isNotNullOrEmpty(riwayatJabatan.getJabatanId())
					&& CommonUtil.isNotNullOrEmpty(vo.getJabatan())) {
				if (!riwayatJabatan.getJabatanId().equals(vo.getJabatan().getId())) {
					perubahan += "ubah jabatan, ";
				}
			} else if (CommonUtil.isNullOrEmpty(riwayatJabatan.getJabatanId())
					&& CommonUtil.isNotNullOrEmpty(vo.getJabatan())) {
				perubahan += "jabatan, ";
			} else if (CommonUtil.isNotNullOrEmpty(riwayatJabatan.getJabatanId())
					&& CommonUtil.isNullOrEmpty(vo.getJabatan())) {
				perubahan += "hapus jabatan, ";
			}

			if (CommonUtil.isNotNullOrEmpty(riwayatJabatan.getTtdPegawaiSk())
					&& CommonUtil.isNotNullOrEmpty(vo.getTtdPegawaiSk())) {
				if (!riwayatJabatan.getTtdPegawaiSk().equals(vo.getTtdPegawaiSk())) {
					perubahan += "ubah tertanda pegawai sk, ";
				}
			} else if (CommonUtil.isNullOrEmpty(riwayatJabatan.getTtdPegawaiSk())
					&& CommonUtil.isNotNullOrEmpty(vo.getTtdPegawaiSk())) {
				perubahan += "tertanda pegawai sk, ";
			} else if (CommonUtil.isNotNullOrEmpty(riwayatJabatan.getTtdPegawaiSk())
					&& CommonUtil.isNullOrEmpty(vo.getTtdPegawaiSk())) {
				perubahan += "hapus tertanda pegawai sk, ";
			}

			if (CommonUtil.isNotNullOrEmpty(riwayatJabatan.getTtdJabatanSk())
					&& CommonUtil.isNotNullOrEmpty(vo.getTtdJabatanSk())) {
				if (!riwayatJabatan.getTtdJabatanSk().equals(vo.getTtdJabatanSk())) {
					perubahan += "ubah tertanda jabatan sk, ";
				}
			} else if (CommonUtil.isNullOrEmpty(riwayatJabatan.getTtdJabatanSk())
					&& CommonUtil.isNotNullOrEmpty(vo.getTtdJabatanSk())) {
				perubahan += "tertanda jabatan sk, ";
			} else if (CommonUtil.isNotNullOrEmpty(riwayatJabatan.getTtdJabatanSk())
					&& CommonUtil.isNullOrEmpty(vo.getTtdJabatanSk())) {
				perubahan += "hapus tertanda jabatan sk, ";
			}
		} else {
			if (CommonUtil.isNotNullOrEmpty(vo.getNoSK())) {
				perubahan += "no sk, ";
			}

			if (CommonUtil.isNotNullOrEmpty(vo.getTglSK())) {
				perubahan += "tanggal sk, ";
			}

			if (CommonUtil.isNotNullOrEmpty(vo.getSumberData())) {
				perubahan += "sumber data, ";
			}

			if (CommonUtil.isNotNullOrEmpty(vo.getJabatan())) {
				perubahan += "jabatan, ";
			}

			if (CommonUtil.isNotNullOrEmpty(vo.getTtdPegawaiSk())) {
				perubahan += "tertanda pegawai sk, ";
			}

			if (CommonUtil.isNotNullOrEmpty(vo.getTtdJabatanSk())) {
				perubahan += "tertanda jabatan sk, ";
			}
		}

		if (CommonUtil.isNotNullOrEmpty(perubahan)) {
			vo.setKeterangan("");
			this.saveHistoryPegawai(vo, perubahan);
		} else if (CommonUtil.isNullOrEmpty(perubahan)) {
			vo.setKeterangan(Master.TIDAK_ADA_PERUBAHAN_DATA);
		}

		riwayatJabatanDao.save(model);

		return vo;
	}

	@Override
	public void saveHistoryPegawai(RiwayatJabatanVO vo, String perubahan) {
		HistoryDataPegawai historyDataPegawai = new HistoryDataPegawai();
		if (CommonUtil.isNotNullOrEmpty(vo)) {
			LoginUser loginUser = loginUserService.getLoginUser();
			// model = riwayatJabatanDao.findOne(vo.getNoRec());
			if (CommonUtil.isNotNullOrEmpty(loginUser.getPegawai())) {
				historyDataPegawai.setPetugas(loginUser.getPegawai());
			}

			// RiwayatJabatanVO data =
			// riwayatJabatanConverter.transferModelToVO(model, new
			// RiwayatJabatanVO());

			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 RiwayatJabatanVO update(RiwayatJabatanVO vo) throws JpaSystemException, ServiceVOException {
		RiwayatJabatan model = riwayatJabatanDao.findOne(vo.getNoRec());
		RiwayatJabatan resultModel = riwayatJabatanDao.save(model);
		RiwayatJabatanVO resultVo = new RiwayatJabatanVO();
		resultVo = riwayatJabatanConverter.transferModelToVO(resultModel, resultVo);
		return resultVo;
	}

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

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

	@Override
	public List<RiwayatJabatanVO> 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>> findRiwayatJabatan(Integer idPegawai, Integer idJenisJabatan) {
		List<Map<String, Object>> result = riwayatJabatanDao.getRiwayatJabatan(idPegawai, idJenisJabatan);
		if (CommonUtil.isNotNullOrEmpty(result)) {
			return result;
		} else {
			return null;
		}
	}

	@Override
	public List<Map<String, Object>> findDataRiwayatJabatan(Integer idPegawai) {
		List<Map<String, Object>> result = riwayatJabatanDao.getDataRiwayatJabatan(idPegawai);
		if (CommonUtil.isNotNullOrEmpty(result)) {
			return result;
		} else {
			return null;
		}
	}

}
