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.ProdukPerawatDao;
import com.jasamedika.medifirst2000.dao.SettingDataFixedDao;
import com.jasamedika.medifirst2000.entities.ProdukPerawat;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.ProdukPerawatService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.ProdukPerawatVO;

/**
 * @author salmanoe
 * @since Oct 8, 2021
 */
@Service("produkPerawatService")
public class ProdukPerawatServiceImpl extends BaseVoServiceImpl implements ProdukPerawatService {

	@Autowired
	private BaseConverterImpl<ProdukPerawatVO, ProdukPerawat> produkPerawatConverter;

	@Autowired
	private ProdukPerawatDao produkPerawatDao;

	@Autowired
	private SettingDataFixedDao settingDataFixedDao;

	@Override
	public ProdukPerawatVO add(ProdukPerawatVO vo) throws JpaSystemException, ServiceVOException {
		ProdukPerawat produkPerawat = produkPerawatConverter.transferVOToModel(vo, new ProdukPerawat());

		ProdukPerawat resultModel = produkPerawatDao.save(produkPerawat);

		ProdukPerawatVO resultVO = new ProdukPerawatVO();
		resultVO = produkPerawatConverter.transferModelToVO(resultModel, resultVO);

		return resultVO;
	}

	@Override
	public ProdukPerawatVO update(ProdukPerawatVO vo) throws JpaSystemException, ServiceVOException {
		ProdukPerawat produkPerawatLama = produkPerawatDao.findOne(vo.getId());

		ProdukPerawat produkPerawatBaru = produkPerawatConverter.transferVOToModel(vo, produkPerawatLama);

		ProdukPerawat resultModel = produkPerawatDao.save(produkPerawatBaru);

		ProdukPerawatVO resultVO = new ProdukPerawatVO();
		resultVO = produkPerawatConverter.transferModelToVO(resultModel, resultVO);

		return resultVO;
	}

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

		return true;
	}

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

		ProdukPerawat produkPerawat = produkPerawatDao.findOne(key);
		if (CommonUtil.isNotNullOrEmpty(produkPerawat)) {
			result = produkPerawatConverter.transferModelToVO(produkPerawat, result);
		}

		return result;
	}

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

		Iterable<ProdukPerawat> models = produkPerawatDao.findAll();
		if (CommonUtil.isNotNullOrEmpty(models)) {
			for (ProdukPerawat model : models) {
				ProdukPerawatVO vo = new ProdukPerawatVO();
				vo = produkPerawatConverter.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>> findAllActive(String namaProduk, Short kdKlasif) throws JpaSystemException {
		List<Map<String, Object>> result = new ArrayList<>();

		if (CommonUtil.isNotNullOrEmpty(namaProduk) && CommonUtil.isNullOrEmpty(kdKlasif)) {
			result = produkPerawatDao.findAllActive(namaProduk.toLowerCase());
		} else if (CommonUtil.isNullOrEmpty(namaProduk) && CommonUtil.isNotNullOrEmpty(kdKlasif)) {
			result = produkPerawatDao.findAllActive(kdKlasif);
		} else if (CommonUtil.isNotNullOrEmpty(namaProduk) && CommonUtil.isNotNullOrEmpty(kdKlasif)) {
			result = produkPerawatDao.findAllActive(namaProduk.toLowerCase(), kdKlasif);
		} else {
			result = produkPerawatDao.findAllActive();
		}

		return result;
	}

	@Override
	public List<Map<String, Object>> findDupProdukPerawat(String namaProduk, Short kdKlasif, Integer idProduk)
			throws JpaSystemException {
		List<Map<String, Object>> result = new ArrayList<>();
		List<Integer> listId = new ArrayList<>();

		String patternText = settingDataFixedDao.getSettingDataFixed("patternTextDuplicate");
		String replacedNamaProduk = namaProduk.replaceAll(patternText, "").toLowerCase();
		if (CommonUtil.isNotNullOrEmpty(idProduk)) {
			listId = produkPerawatDao.findDupProduk(patternText, replacedNamaProduk, kdKlasif, idProduk);
		} else {
			listId = produkPerawatDao.findDupProduk(patternText, replacedNamaProduk, kdKlasif);
		}

		if (CommonUtil.isNotNullOrEmpty(listId)) {
			result = produkPerawatDao.findProdukPerawat(listId);
		}

		return result;
	}

}
