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.orm.jpa.JpaSystemException;
import org.springframework.stereotype.Service;

import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.AnggaranRemunerasiDao;
import com.jasamedika.medifirst2000.dao.LoggingUserDao;
import com.jasamedika.medifirst2000.entities.AnggaranRemunerasi;
import com.jasamedika.medifirst2000.entities.GradeRemunerasi;
import com.jasamedika.medifirst2000.entities.LoggingUser;
import com.jasamedika.medifirst2000.entities.LoginUser;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.AnggaranRemunerasiService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.AnggaranRemunerasiVO;
import com.jasamedika.medifirst2000.vo.GradeRemunerasiVO;

@Service("anggaranRemunerasiService")
public class AnggaranRemunerasiServiceImpl extends BaseVoServiceImpl implements AnggaranRemunerasiService {

	@Autowired
	private BaseConverterImpl<GradeRemunerasiVO, GradeRemunerasi> gradeConverter;

	@Autowired
	private BaseConverterImpl<AnggaranRemunerasiVO, AnggaranRemunerasi> anggaranRemunerasiConverter;

	@Autowired
	private AnggaranRemunerasiDao anggaranRemunerasiDao;

	@Autowired
	private LoggingUserDao loggingUserDao;

	public void addLoggingUser(Integer idLoginUser, String idReferensi, String keterangan) {
		LoggingUser loggingUser = new LoggingUser();
		LoginUser loginUser = new LoginUser();

		loggingUser.setKdProfile((short) 0);
		loggingUser.setStatusEnabled(true);
		loggingUser.setTanggal(new Date());
		loginUser.setId(idLoginUser);
		loggingUser.setLoginUser(loginUser);
		loggingUser.setJenisLog("Anggaran Remunerasi");
		loggingUser.setReferensiId(idReferensi);
		loggingUser.setReferensi("sdm_anggaranremunerasi_t");
		loggingUser.setKeterangan(keterangan);

		loggingUserDao.save(loggingUser);
	}

	public void addAllLoggingUser(List<Map<String, Object>> listLog) {
		List<LoggingUser> listLoggingUser = new ArrayList<>();
		Date now = new Date();

		for (Map<String, Object> mapLog : listLog) {
			LoggingUser loggingUser = new LoggingUser();
			LoginUser loginUser = new LoginUser();

			loggingUser.setKdProfile((short) 0);
			loggingUser.setStatusEnabled(true);
			loggingUser.setTanggal(now);
			loginUser.setId(Integer.valueOf(mapLog.get("idLoginUser").toString()));
			loggingUser.setLoginUser(loginUser);
			loggingUser.setJenisLog("Anggaran Remunerasi");
			loggingUser.setReferensiId(mapLog.get("idReferensi").toString());
			loggingUser.setReferensi("sdm_anggaranremunerasi_t");
			loggingUser.setKeterangan(mapLog.get("keterangan").toString());
			listLoggingUser.add(loggingUser);
		}

		loggingUserDao.save(listLoggingUser);
	}

	@Override
	public AnggaranRemunerasiVO add(AnggaranRemunerasiVO vo) throws JpaSystemException, ServiceVOException {
		GradeRemunerasi grade = gradeConverter.transferVOToModel(vo.getGrade(), new GradeRemunerasi());
		AnggaranRemunerasi anggaranRemunerasi = anggaranRemunerasiConverter.transferVOToModel(vo,
				new AnggaranRemunerasi());

		anggaranRemunerasi.setGrade(grade);
		anggaranRemunerasi.setTanggalPembaharuanData(new Date());
		AnggaranRemunerasi resultModel = anggaranRemunerasiDao.save(anggaranRemunerasi);

		addLoggingUser(vo.getLoginUserId(), resultModel.getNoRec(), "Buat data");

		AnggaranRemunerasiVO resultVO = new AnggaranRemunerasiVO();
		resultVO = anggaranRemunerasiConverter.transferModelToVO(resultModel, resultVO);

		return resultVO;
	}

	@Override
	public List<String> addAll(List<AnggaranRemunerasiVO> listVO, Integer idLoginUser)
			throws JpaSystemException, ServiceVOException {
		List<String> resultListVO = new ArrayList<>();

		List<AnggaranRemunerasi> listAnggaranRemunerasi = new ArrayList<>();
		List<Map<String, Object>> listLog = new ArrayList<>();
		Date now = new Date();

		for (AnggaranRemunerasiVO vo : listVO) {
			GradeRemunerasi grade = gradeConverter.transferVOToModel(vo.getGrade(), new GradeRemunerasi());

			AnggaranRemunerasi anggaranRemunerasi = anggaranRemunerasiConverter.transferVOToModel(vo,
					new AnggaranRemunerasi());
			anggaranRemunerasi.setGrade(grade);
			anggaranRemunerasi.setTanggalPembaharuanData(now);
			listAnggaranRemunerasi.add(anggaranRemunerasi);
		}

		Iterable<AnggaranRemunerasi> listResultModel = anggaranRemunerasiDao.save(listAnggaranRemunerasi);
		for (AnggaranRemunerasi resultModel : listResultModel) {
			Map<String, Object> mapLog = new HashMap<>();
			mapLog.put("idLoginUser", idLoginUser);
			mapLog.put("idReferensi", resultModel.getNoRec());
			mapLog.put("keterangan", "Buat data");
			listLog.add(mapLog);

			AnggaranRemunerasiVO resultVO = new AnggaranRemunerasiVO();
			resultVO = anggaranRemunerasiConverter.transferModelToVO(resultModel, resultVO);

			resultListVO.add(resultVO.getNoRec());
		}

		addAllLoggingUser(listLog);

		return resultListVO;
	}

	@Override
	public AnggaranRemunerasiVO update(AnggaranRemunerasiVO vo) throws JpaSystemException, ServiceVOException {
		AnggaranRemunerasi anggaranRemunerasiLama = anggaranRemunerasiDao.findOne(vo.getNoRec());

		GradeRemunerasi grade = gradeConverter.transferVOToModel(vo.getGrade(), new GradeRemunerasi());
		AnggaranRemunerasi anggaranRemunerasiBaru = anggaranRemunerasiConverter.transferVOToModel(vo,
				anggaranRemunerasiLama);

		anggaranRemunerasiBaru.setGrade(grade);
		anggaranRemunerasiBaru.setTanggalPembaharuanData(new Date());
		AnggaranRemunerasi resultModel = anggaranRemunerasiDao.save(anggaranRemunerasiBaru);

		addLoggingUser(vo.getLoginUserId(), resultModel.getNoRec(), "Edit data");

		AnggaranRemunerasiVO resultVO = new AnggaranRemunerasiVO();
		resultVO = anggaranRemunerasiConverter.transferModelToVO(resultModel, resultVO);

		return resultVO;
	}

	@Override
	public Boolean delete(String key) throws JpaSystemException {
		anggaranRemunerasiDao.delete(key);

		return true;
	}

	@Override
	public AnggaranRemunerasiVO findById(String key) throws JpaSystemException {
		AnggaranRemunerasiVO result = new AnggaranRemunerasiVO();

		AnggaranRemunerasi anggaranRemunerasi = anggaranRemunerasiDao.findOne(key);
		if (CommonUtil.isNotNullOrEmpty(anggaranRemunerasi)) {
			result = anggaranRemunerasiConverter.transferModelToVO(anggaranRemunerasi, result);
		}

		return result;
	}

	@Override
	public List<AnggaranRemunerasiVO> findAll() throws JpaSystemException {
		List<AnggaranRemunerasiVO> result = new ArrayList<AnggaranRemunerasiVO>();

		Iterable<AnggaranRemunerasi> models = anggaranRemunerasiDao.findAll();
		if (CommonUtil.isNotNullOrEmpty(models)) {
			for (AnggaranRemunerasi model : models) {
				AnggaranRemunerasiVO vo = new AnggaranRemunerasiVO();
				vo = anggaranRemunerasiConverter.transferModelToVO(model, vo);
				result.add(vo);
			}
		}

		return result;
	}

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

		return null;
	}

	@Override
	public Map<String, Object> findAnggaranTahunIni() throws JpaSystemException {
		Map<String, Object> result = new HashMap<>();

		List<Map<String, Object>> data = anggaranRemunerasiDao.findTahunIni();
		if (CommonUtil.isNotNullOrEmpty(data)) {
			result = data.get(0);
		}

		return result;
	}

}
