package com.jasamedika.medifirst2000.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;

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.MapJabatanProfesiDao;
import com.jasamedika.medifirst2000.entities.Jabatan;
import com.jasamedika.medifirst2000.entities.MapJabatanProfesi;
import com.jasamedika.medifirst2000.entities.Profesi;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.MapJabatanProfesiService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.JabatanVO;
import com.jasamedika.medifirst2000.vo.MapJabatanProfesiVO;
import com.jasamedika.medifirst2000.vo.ProfesiVO;

/**
 * @author salmanoe
 * @since Dec 31, 2021
 */
@Service("mapProfesiJabatanService")
public class MapJabatanProfesiServiceImpl extends BaseVoServiceImpl implements MapJabatanProfesiService {

	@Autowired
	private BaseConverterImpl<MapJabatanProfesiVO, MapJabatanProfesi> mappingConverter;

	@Autowired
	private BaseConverterImpl<ProfesiVO, Profesi> profesiConverter;

	@Autowired
	private BaseConverterImpl<JabatanVO, Jabatan> jabatanConverter;

	@Autowired
	private MapJabatanProfesiDao mapJabatanProfesiDao;

	@Override
	public MapJabatanProfesiVO add(MapJabatanProfesiVO vo) throws JpaSystemException, ServiceVOException {
		MapJabatanProfesiVO resultVO = null;

		Optional<MapJabatanProfesi> existedModel = mapJabatanProfesiDao.findByJabatan(vo.getJabatan().getId());
		if (CommonUtil.isNullOrEmpty(existedModel)) {
			Jabatan jabatan = jabatanConverter.transferVOToModel(vo.getJabatan(), new Jabatan());
			Profesi profesi = profesiConverter.transferVOToModel(vo.getProfesi(), new Profesi());

			MapJabatanProfesi mapJabatanProfesi = mappingConverter.transferVOToModel(vo, new MapJabatanProfesi());
			mapJabatanProfesi.setJabatan(jabatan);
			mapJabatanProfesi.setProfesi(profesi);
			MapJabatanProfesi resultModel = mapJabatanProfesiDao.save(mapJabatanProfesi);

			resultVO = new MapJabatanProfesiVO();
			resultVO = mappingConverter.transferModelToVO(resultModel, resultVO);
		}

		return resultVO;
	}

	@Override
	public MapJabatanProfesiVO update(MapJabatanProfesiVO vo) throws JpaSystemException, ServiceVOException {
		MapJabatanProfesi mapJabatanProfesiLama = mapJabatanProfesiDao.findOne(vo.getId());

		Jabatan jabatan = jabatanConverter.transferVOToModel(vo.getJabatan(), new Jabatan());
		Profesi profesi = profesiConverter.transferVOToModel(vo.getProfesi(), new Profesi());

		MapJabatanProfesi mapJabatanProfesiBaru = mappingConverter.transferVOToModel(vo, mapJabatanProfesiLama);
		mapJabatanProfesiBaru.setProfesi(profesi);
		mapJabatanProfesiBaru.setJabatan(jabatan);
		MapJabatanProfesi resultModel = mapJabatanProfesiDao.save(mapJabatanProfesiBaru);

		MapJabatanProfesiVO resultVO = new MapJabatanProfesiVO();
		resultVO = mappingConverter.transferModelToVO(resultModel, resultVO);

		return resultVO;
	}

	@Override
	public Boolean delete(Integer key) throws JpaSystemException {
		mapJabatanProfesiDao.delete(key);

		return true;
	}

	@Override
	public MapJabatanProfesiVO findById(Integer key) throws JpaSystemException {
		MapJabatanProfesiVO result = new MapJabatanProfesiVO();

		MapJabatanProfesi mapJabatanProfesi = mapJabatanProfesiDao.findOne(key);
		if (CommonUtil.isNotNullOrEmpty(mapJabatanProfesi)) {
			result = mappingConverter.transferModelToVO(mapJabatanProfesi, result);
		}

		return result;
	}

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

		Iterable<MapJabatanProfesi> models = mapJabatanProfesiDao.findAll();
		if (CommonUtil.isNotNullOrEmpty(models)) {
			for (MapJabatanProfesi model : models) {
				MapJabatanProfesiVO vo = new MapJabatanProfesiVO();
				vo = mappingConverter.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 List<Map<String, Object>> findMapping() throws JpaSystemException {
		List<Map<String, Object>> result = mapJabatanProfesiDao.findMapping();

		return result;
	}

}
