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.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.orm.jpa.JpaSystemException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.jasamedika.medifirst2000.converter.HistoryLoginModulAplikasiConverter;
import com.jasamedika.medifirst2000.dao.HistoryLoginModulAplikasiDao;
import com.jasamedika.medifirst2000.entities.HistoryLoginModulAplikasi;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.HistoryLoginModulAplikasiService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.HistoryLoginModulAplikasiVO;

@Service("historyLoginModulAplikasiService")
public class HistoryLoginModulAplikasiServiceImpl extends BaseVoServiceImpl implements HistoryLoginModulAplikasiService<HistoryLoginModulAplikasi> {

	@Autowired
	HistoryLoginModulAplikasiDao historyLoginModulAplikasiDao;

	@Autowired
	HistoryLoginModulAplikasiConverter historyLoginModulAplikasiConverter;
	
	@Override
	public Map<String, Object> findByHistoryLoginModulAplikasi(String kdUser) {
		List<HistoryLoginModulAplikasiVO> historyLoginModulAplikasiVOList = new ArrayList<HistoryLoginModulAplikasiVO>();
		List<HistoryLoginModulAplikasi> historyLoginModulAplikasiList = historyLoginModulAplikasiDao.findByKdUser(kdUser);

		historyLoginModulAplikasiConverter.transferListOfModelToListOfVO(historyLoginModulAplikasiList, historyLoginModulAplikasiVOList);

		return constructMapReturn(historyLoginModulAplikasiVOList, 0, 0);
	}
	

	@Override
	public Map<String, Object> findByHistoryLoginModulAplikasi(String kdUser, Integer page, Integer limit, String sort,
			String dir) {
		List<HistoryLoginModulAplikasiVO> historyLoginModulAplikasiVOList = new ArrayList<HistoryLoginModulAplikasiVO>();
		Pageable pageable = new PageRequest(page, limit, getSortBy(sort, dir));
		Page<HistoryLoginModulAplikasi> resultPage = historyLoginModulAplikasiDao.findByKdUser(kdUser, pageable);
		List<HistoryLoginModulAplikasi> historyLoginModulAplikasiList = resultPage.getContent();

		historyLoginModulAplikasiConverter.transferListOfModelToListOfVO(historyLoginModulAplikasiList, historyLoginModulAplikasiVOList);

		return constructMapReturn(historyLoginModulAplikasiVOList, resultPage.getTotalElements(), resultPage.getTotalPages());
	}
	
	@Override
	@Transactional(readOnly = false)
	public HistoryLoginModulAplikasiVO add(HistoryLoginModulAplikasiVO vo) throws JpaSystemException, ServiceVOException {
		HistoryLoginModulAplikasi historyLoginModulAplikasi = historyLoginModulAplikasiConverter.transferVOToModel(vo, new HistoryLoginModulAplikasi());
		HistoryLoginModulAplikasi resultModel = historyLoginModulAplikasiDao.save(historyLoginModulAplikasi);
		HistoryLoginModulAplikasiVO resultVo = new HistoryLoginModulAplikasiVO();
		resultVo = historyLoginModulAplikasiConverter.transferModelToVO(resultModel, resultVo);
		return resultVo;
	}

	@Override
	@Transactional(readOnly = false)
	public HistoryLoginModulAplikasiVO update(HistoryLoginModulAplikasiVO vo) throws JpaSystemException, ServiceVOException {

		HistoryLoginModulAplikasi historyLoginModulAplikasi = historyLoginModulAplikasiDao.findOne(vo.getId());
		historyLoginModulAplikasi = historyLoginModulAplikasiConverter.transferVOToModel(vo, historyLoginModulAplikasi);

		historyLoginModulAplikasiDao.save(historyLoginModulAplikasi);
		return vo;
	}

	@Override
	@Transactional(readOnly = false)
	public Boolean delete(Integer key) throws JpaSystemException {
		if (CommonUtil.isNotNullOrEmpty(key)) {

			HistoryLoginModulAplikasi historyLoginModulAplikasi = historyLoginModulAplikasiDao.findOne(key);
			historyLoginModulAplikasiDao.delete(historyLoginModulAplikasi);
			HistoryLoginModulAplikasiVO historyLoginModulAplikasiVO = historyLoginModulAplikasiConverter.transferModelToVO(historyLoginModulAplikasi, new HistoryLoginModulAplikasiVO());
			historyLoginModulAplikasiVO.setStatusEnabled(false);
			return true;
		} else {
			return false;
		}

	}

	@Override
	@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
	public HistoryLoginModulAplikasiVO findById(Integer key) throws JpaSystemException {
		return historyLoginModulAplikasiConverter.transferModelToVO(historyLoginModulAplikasiDao.findOne(key), null);
	}

	@Override
	@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
	public List<HistoryLoginModulAplikasiVO> findAll() throws JpaSystemException {
		return historyLoginModulAplikasiConverter.transferListOfModelToListOfVO(historyLoginModulAplikasiDao.findAll(), null);
	}

	@Override
	@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
	public Map<String, Object> findAllWithPageAndLimitAndSortByAndDirectionParameter(Integer page, Integer limit,
			String sort, String dir) {
		
		List<HistoryLoginModulAplikasiVO> historyLoginModulAplikasiVOList = new ArrayList<HistoryLoginModulAplikasiVO>();
		Pageable pageable = new PageRequest(page, limit, getSortBy(sort, dir));
		Page<HistoryLoginModulAplikasi> resultPage = historyLoginModulAplikasiDao.findAll(pageable);
		List<HistoryLoginModulAplikasi> historyLoginModulAplikasiList = resultPage.getContent();

		historyLoginModulAplikasiConverter.transferListOfModelToListOfVO(historyLoginModulAplikasiList, historyLoginModulAplikasiVOList);

		return constructMapReturn(historyLoginModulAplikasiVOList, resultPage.getTotalElements(), resultPage.getTotalPages());
	}

	
}
