package com.jasamedika.medifirst2000.service.impl;

import java.util.ArrayList;
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.IndeksKinerjaDokterDao;
import com.jasamedika.medifirst2000.entities.IndeksKinerjaDokter;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.SubUnitKerjaPegawai;
import com.jasamedika.medifirst2000.entities.UnitKerjaPegawai;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.IndeksKinerjaDokterService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.IndeksKinerjaDokterVO;
import com.jasamedika.medifirst2000.vo.PegawaiVO;
import com.jasamedika.medifirst2000.vo.SubUnitKerjaPegawaiVO;
import com.jasamedika.medifirst2000.vo.UnitKerjaPegawaiVO;

/**
 * @author salmanoe
 * @since Nov 29, 2021
 */
@Service("indeksKinerjaDokterService")
public class IndeksKinerjaDokterServiceImpl extends BaseVoServiceImpl implements IndeksKinerjaDokterService {

	@Autowired
	private BaseConverterImpl<IndeksKinerjaDokterVO, IndeksKinerjaDokter> indeksKinerjaDokterConverter;

	@Autowired
	private BaseConverterImpl<UnitKerjaPegawaiVO, UnitKerjaPegawai> unitKerjaConverter;

	@Autowired
	private BaseConverterImpl<SubUnitKerjaPegawaiVO, SubUnitKerjaPegawai> subunitKerjaConverter;

	@Autowired
	private BaseConverterImpl<PegawaiVO, Pegawai> pegawaiConverter;

	@Autowired
	private IndeksKinerjaDokterDao indeksKinerjaDokterDao;

	@Override
	public IndeksKinerjaDokterVO add(IndeksKinerjaDokterVO vo) throws JpaSystemException, ServiceVOException {
		UnitKerjaPegawai unitKerja = unitKerjaConverter.transferVOToModel(vo.getUnitKerja(), new UnitKerjaPegawai());
		SubUnitKerjaPegawai subunitKerja = subunitKerjaConverter.transferVOToModel(vo.getSubunitKerja(),
				new SubUnitKerjaPegawai());
		Pegawai pegawai = pegawaiConverter.transferVOToModel(vo.getPegawai(), new Pegawai());
		IndeksKinerjaDokter ikiDokter = indeksKinerjaDokterConverter.transferVOToModel(vo, new IndeksKinerjaDokter());

		ikiDokter.setUnitKerja(unitKerja);
		ikiDokter.setSubunitKerja(subunitKerja);
		ikiDokter.setPegawai(pegawai);
		IndeksKinerjaDokter resultModel = indeksKinerjaDokterDao.save(ikiDokter);

		IndeksKinerjaDokterVO resultVO = new IndeksKinerjaDokterVO();
		resultVO = indeksKinerjaDokterConverter.transferModelToVO(resultModel, resultVO);

		return resultVO;
	}

	@Override
	public List<String> addAll(List<IndeksKinerjaDokterVO> vos) throws JpaSystemException, ServiceVOException {
		List<String> result = new ArrayList<>();

		List<IndeksKinerjaDokter> ikiAllDokter = new ArrayList<>();
		for (IndeksKinerjaDokterVO vo : vos) {
			UnitKerjaPegawai unitKerja = unitKerjaConverter.transferVOToModel(vo.getUnitKerja(),
					new UnitKerjaPegawai());
			SubUnitKerjaPegawai subunitKerja = subunitKerjaConverter.transferVOToModel(vo.getSubunitKerja(),
					new SubUnitKerjaPegawai());
			Pegawai pegawai = pegawaiConverter.transferVOToModel(vo.getPegawai(), new Pegawai());
			IndeksKinerjaDokter ikiDokter = indeksKinerjaDokterConverter.transferVOToModel(vo,
					new IndeksKinerjaDokter());

			ikiDokter.setUnitKerja(unitKerja);
			ikiDokter.setSubunitKerja(subunitKerja);
			ikiDokter.setPegawai(pegawai);

			ikiAllDokter.add(ikiDokter);
		}

		Iterable<IndeksKinerjaDokter> resultModels = indeksKinerjaDokterDao.save(ikiAllDokter);
		if (CommonUtil.isNotNullOrEmpty(resultModels)) {
			for (IndeksKinerjaDokter resultModel : resultModels) {
				result.add(resultModel.getNoRec());
			}
		}

		return result;
	}

	@Override
	public IndeksKinerjaDokterVO update(IndeksKinerjaDokterVO vo) throws JpaSystemException, ServiceVOException {
		IndeksKinerjaDokter ikiLamaDokter = indeksKinerjaDokterDao.findOne(vo.getNoRec());

		UnitKerjaPegawai unitKerja = unitKerjaConverter.transferVOToModel(vo.getUnitKerja(), new UnitKerjaPegawai());
		SubUnitKerjaPegawai subunitKerja = subunitKerjaConverter.transferVOToModel(vo.getSubunitKerja(),
				new SubUnitKerjaPegawai());
		Pegawai pegawai = pegawaiConverter.transferVOToModel(vo.getPegawai(), new Pegawai());
		IndeksKinerjaDokter ikiBaruDokter = indeksKinerjaDokterConverter.transferVOToModel(vo, ikiLamaDokter);

		ikiBaruDokter.setUnitKerja(unitKerja);
		ikiBaruDokter.setSubunitKerja(subunitKerja);
		ikiBaruDokter.setPegawai(pegawai);
		IndeksKinerjaDokter resultModel = indeksKinerjaDokterDao.save(ikiBaruDokter);

		IndeksKinerjaDokterVO resultVO = new IndeksKinerjaDokterVO();
		resultVO = indeksKinerjaDokterConverter.transferModelToVO(resultModel, resultVO);

		return resultVO;
	}

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

		return true;
	}

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

		IndeksKinerjaDokter ikiDokter = indeksKinerjaDokterDao.findOne(key);
		if (CommonUtil.isNotNullOrEmpty(ikiDokter)) {
			result = indeksKinerjaDokterConverter.transferModelToVO(ikiDokter, result);
		}

		return result;
	}

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

		Iterable<IndeksKinerjaDokter> models = indeksKinerjaDokterDao.findAll();
		if (CommonUtil.isNotNullOrEmpty(models)) {
			for (IndeksKinerjaDokter model : models) {
				IndeksKinerjaDokterVO vo = new IndeksKinerjaDokterVO();
				vo = indeksKinerjaDokterConverter.transferModelToVO(model, vo);
				result.add(vo);
			}
		}

		return result;
	}

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

}
