package com.jasamedika.medifirst2000.service.impl;

import java.util.ArrayList;
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 org.springframework.transaction.annotation.Transactional;

import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.converter.HubunganKeluargaConverter;
import com.jasamedika.medifirst2000.converter.JenisKelaminConverter;
import com.jasamedika.medifirst2000.converter.PegawaiConverter;
import com.jasamedika.medifirst2000.converter.PekerjaanConverter;
import com.jasamedika.medifirst2000.converter.PendidikanConverter;
import com.jasamedika.medifirst2000.converter.StatusPerkawinanPegawaiConverter;
import com.jasamedika.medifirst2000.converter.TanggunganConverter;
import com.jasamedika.medifirst2000.dao.KeluargaPegawaiDao;
import com.jasamedika.medifirst2000.entities.HubunganKeluarga;
import com.jasamedika.medifirst2000.entities.JenisKelamin;
import com.jasamedika.medifirst2000.entities.KeluargaPegawai;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.Pekerjaan;
import com.jasamedika.medifirst2000.entities.Pendidikan;
import com.jasamedika.medifirst2000.entities.StatusPerkawinanPegawai;
import com.jasamedika.medifirst2000.entities.Tanggungan;
import com.jasamedika.medifirst2000.service.KeluargaPegawaiService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.KeluargaPegawaiVO;

/**
 * Implement class for KeluargaPegawaiServiceImpl
 * 
 * @author Lukman Hakim (Lukman.uki@gmail.com
 * @param <T>
 * @
 */
@Service("keluargaPegawaiService")
public class KeluargaPegawaiServiceImpl extends BaseVoServiceImpl implements KeluargaPegawaiService {

	@Autowired
	private KeluargaPegawaiDao keluargaPegawaiDao;

	@Autowired
	private PegawaiConverter pegawaiConverter;

	@Autowired
	private HubunganKeluargaConverter hubunganKeluargaConverter;

	@Autowired
	private JenisKelaminConverter jenisKelaminConverter;

	@Autowired
	private PendidikanConverter pendidikanConverter;

	@Autowired
	private StatusPerkawinanPegawaiConverter statusPerkawinanPegawaiConverter;

	@Autowired
	private TanggunganConverter tanggunganConverter;

	@Autowired
	private PekerjaanConverter pekerjaanConverter;

	@Autowired
	private BaseConverterImpl<KeluargaPegawaiVO, KeluargaPegawai> keluargaPegawaiConverter;

	@Override
	@Transactional(readOnly = false)
	public KeluargaPegawaiVO add(KeluargaPegawaiVO vo) {
		KeluargaPegawai keluargaPegawai = keluargaPegawaiConverter.transferVOToModel(vo, new KeluargaPegawai());
		if (CommonUtil.isNotNullOrEmpty(vo.getPegawai())) {
			keluargaPegawai.setPegawai(pegawaiConverter.transferVOToModel(vo.getPegawai(), new Pegawai()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getHubunganKeluarga())) {
			keluargaPegawai.setHubunganKeluarga(
					hubunganKeluargaConverter.transferVOToModel(vo.getHubunganKeluarga(), new HubunganKeluarga()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getJenisKelamin())) {
			keluargaPegawai
					.setJenisKelamin(jenisKelaminConverter.transferVOToModel(vo.getJenisKelamin(), new JenisKelamin()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getPendidikan())) {
			keluargaPegawai.setPendidikan(pendidikanConverter.transferVOToModel(vo.getPendidikan(), new Pendidikan()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getPekerjaan())) {
			keluargaPegawai.setPekerjaan(pekerjaanConverter.transferVOToModel(vo.getPekerjaan(), new Pekerjaan()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getStatusPerkawinanPegawai())) {
			keluargaPegawai.setStatusPerkawinanPegawai(statusPerkawinanPegawaiConverter
					.transferVOToModel(vo.getStatusPerkawinanPegawai(), new StatusPerkawinanPegawai()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getStatusTanggungan())) {
			keluargaPegawai.setStatusTanggungan(
					tanggunganConverter.transferVOToModel(vo.getStatusTanggungan(), new Tanggungan()));
		}
		KeluargaPegawai resultModel = keluargaPegawaiDao.save(keluargaPegawai);
		KeluargaPegawaiVO resultVo = new KeluargaPegawaiVO();
		resultVo = keluargaPegawaiConverter.transferModelToVO(resultModel, resultVo);
		return resultVo;
	}

	@Override
	@Transactional(readOnly = false)
	public KeluargaPegawaiVO update(KeluargaPegawaiVO vo) {
		KeluargaPegawai pasien = keluargaPegawaiDao.findOne(vo.getId());
		keluargaPegawaiConverter.transferVOToModel(vo, pasien);
		keluargaPegawaiDao.save(pasien);
		return vo;
	}

	@Override
	public KeluargaPegawaiVO findById(Integer key) {
		KeluargaPegawai pegawai = keluargaPegawaiDao.findById(key);
		if (pegawai == null) {
			return null;
		}
		KeluargaPegawaiVO pegawaiVO = new KeluargaPegawaiVO();
		pegawaiVO = keluargaPegawaiConverter.transferModelToVO(pegawai, pegawaiVO);
		return pegawaiVO;
	}

	@Override
	public List<KeluargaPegawaiVO> findAll() {
		List<KeluargaPegawaiVO> vos = new ArrayList<>();
		List<KeluargaPegawai> keluarga = (List<KeluargaPegawai>) keluargaPegawaiDao.findAll();
		for (KeluargaPegawai model : keluarga) {
			KeluargaPegawaiVO keluargaVO = keluargaPegawaiConverter.transferModelToVO(model, new KeluargaPegawaiVO());
			vos.add(keluargaVO);
		}
		return vos;
	}

	@Override
	public Map<String, Object> findAllDataKeluargaPegawai(Integer id) {
		Map<String, Object> result = new HashMap<String, Object>();
		List<Map<String, Object>> resultModel = keluargaPegawaiDao.findAllDataKeluarga(id);
		if (CommonUtil.isNotNullOrEmpty(resultModel)) {
			result.put("keluargaPegawai", resultModel);
			result.put("dataFound", true);
		} else {
			result.put("dataFound", false);
		}
		return result;
	}

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

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

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

}
