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.ProfesiDao;
import com.jasamedika.medifirst2000.entities.Profesi;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.ProfesiService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.ProfesiVO;

/**
 * @author salmanoe
 * @since Oct 8, 2021
 */
@Service("profesiService")
public class ProfesiServiceImpl extends BaseVoServiceImpl implements ProfesiService {

	@Autowired
	private BaseConverterImpl<ProfesiVO, Profesi> profesiConverter;

	@Autowired
	private ProfesiDao profesiDao;

	@Override
	public ProfesiVO add(ProfesiVO vo) throws JpaSystemException, ServiceVOException {
		Profesi profesi = profesiConverter.transferVOToModel(vo, new Profesi());

		Profesi resultModel = profesiDao.save(profesi);

		ProfesiVO resultVO = new ProfesiVO();
		resultVO = profesiConverter.transferModelToVO(resultModel, resultVO);

		return resultVO;
	}

	@Override
	public ProfesiVO update(ProfesiVO vo) throws JpaSystemException, ServiceVOException {
		Profesi profesiLama = profesiDao.findOne(vo.getId());

		Profesi profesiBaru = profesiConverter.transferVOToModel(vo, profesiLama);

		Profesi resultModel = profesiDao.save(profesiBaru);

		ProfesiVO resultVO = new ProfesiVO();
		resultVO = profesiConverter.transferModelToVO(resultModel, resultVO);

		return resultVO;
	}

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

		return true;
	}

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

		Profesi profesi = profesiDao.findOne(key);
		if (CommonUtil.isNotNullOrEmpty(profesi)) {
			result = profesiConverter.transferModelToVO(profesi, result);
		}

		return result;
	}

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

		Iterable<Profesi> models = profesiDao.findAll();
		if (CommonUtil.isNotNullOrEmpty(models)) {
			for (Profesi model : models) {
				ProfesiVO vo = new ProfesiVO();
				vo = profesiConverter.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<ProfesiVO> findAllActive() throws JpaSystemException {
		List<ProfesiVO> result = new ArrayList<ProfesiVO>();

		Iterable<Profesi> models = profesiDao.findAllActive();
		if (CommonUtil.isNotNullOrEmpty(models)) {
			for (Profesi model : models) {
				ProfesiVO vo = new ProfesiVO();
				vo = profesiConverter.transferModelToVO(model, vo);
				result.add(vo);
			}
		}

		return result;
	}

	@Override
	public List<Map<String, Object>> findByStatus(Integer idPegawai, Short idJenis) throws JpaSystemException {
		List<Map<String, Object>> result = new ArrayList<>();

		if (CommonUtil.isNotNullOrEmpty(idJenis)) {
			result = profesiDao.findByStatus(idPegawai, idJenis);
			if (CommonUtil.isNullOrEmpty(result)) {
				result = profesiDao.findByStatus(idJenis);
			}
		} else {
			result = profesiDao.findByStatus(idPegawai);
			if (CommonUtil.isNullOrEmpty(result)) {
				result = profesiDao.findByStatus();
			}
		}

		return result;
	}

}
