package com.jasamedika.medifirst2000.service.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.IpsrsPemakaianMesinDao;
import com.jasamedika.medifirst2000.dao.MesinDao;
import com.jasamedika.medifirst2000.dao.custom.IpsrsPemakaianMesinDaoCustom;
import com.jasamedika.medifirst2000.entities.IpsrsMesinBoiler;
import com.jasamedika.medifirst2000.entities.IpsrsMesinGenset;
import com.jasamedika.medifirst2000.entities.IpsrsPemakaianMesin;
import com.jasamedika.medifirst2000.entities.LoginUser;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.Produk;
import com.jasamedika.medifirst2000.service.IpsrsPemakaianMesinService;
import com.jasamedika.medifirst2000.service.LoginUserService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.IpsrsMesinBoilerVO;
import com.jasamedika.medifirst2000.vo.IpsrsMesinGensetVO;
import com.jasamedika.medifirst2000.vo.IpsrsPemakaianMesinVO;
import com.jasamedika.medifirst2000.vo.PegawaiVO;
import com.jasamedika.medifirst2000.vo.ProdukVO;

@Service("ipsrsPemakaianMesinService")
public class IpsrsPemakaianMesinServiceImpl implements IpsrsPemakaianMesinService{

	@Autowired
	private IpsrsPemakaianMesinDao ipsrsPemakaianMesinDao;
	
	@Autowired
	private MesinDao mesinDao;
	
	@Autowired
	private IpsrsPemakaianMesinDao ipsrsPemakaianBoilerDao;
	
	@Autowired
	private IpsrsPemakaianMesinDaoCustom ipsrsPemakaianBoilerDaoCustom;
	
	@Autowired
	private BaseConverterImpl <PegawaiVO, Pegawai> pegawaiConverter;
	
	@Autowired
	private BaseConverterImpl <ProdukVO, Produk> produkConverter;
	
	@Autowired
	private BaseConverterImpl <IpsrsPemakaianMesinVO, IpsrsPemakaianMesin> ipsrsPemakaianBoilerConverter;
	
	@Autowired
	private BaseConverterImpl <IpsrsMesinBoilerVO, IpsrsMesinBoiler> ipsrsMesinBoilerConverter;
	
	@Autowired
	private BaseConverterImpl <IpsrsMesinGensetVO, IpsrsMesinGenset> ipsrsMesinGensetConverter;
	
	@Autowired
	private LoginUserService loginUserService;
	
	
	@Override
	public Map<String, Object> getUserLogin() {
		Map<String, Object> result = new HashMap<String,Object>();
		Pegawai pegawai = loginUserService.getLoginUser().getPegawai();
		if(CommonUtil.isNotNullOrEmpty(pegawai)){
			result.put("name", pegawai.getNamaLengkap());
			result.put("idPegawai", pegawai.getId());
			result.put("idRuangan", pegawai.getRuangan().getId());
		}
		return result;
	}
	
	@Override
	public Map<String, Object> getJenisMesin(){
		Map<String, Object> result = new HashMap<>();
		List<Map<String, Object>> jenisMesin = mesinDao.getJenisMesin();
		result.put("jenisMesin", jenisMesin);
		return result;
		
	}
	
	@Override
	public Map<String, Object> getDataMesin(Integer id){
		Map<String, Object> result = new HashMap<>();
		List<Map<String, Object>> dataMesin = mesinDao.getDataMesin(id);
		result.put("dataMesin", dataMesin);
		return result;
		
	}

	@Override
	public Map<String, Object> savePemakaianMesin(IpsrsPemakaianMesinVO vo){
		Map<String, Object> result = new HashMap<>();
		IpsrsPemakaianMesin ipsrsPemakaianMesin = new IpsrsPemakaianMesin();
		if(CommonUtil.isNotNullOrEmpty(vo)){
			ipsrsPemakaianMesin = ipsrsPemakaianBoilerConverter.transferVOToModel(vo, new IpsrsPemakaianMesin());
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getPegawai())){
			ipsrsPemakaianMesin.setPegawai(pegawaiConverter.transferVOToModel(vo.getPegawai(), new Pegawai()));
		}
		IpsrsMesinBoilerVO ipsrsMesinBoilerVO = vo.getIpsrsMesinBoiler();
		if(CommonUtil.isNotNullOrEmpty(vo.getIpsrsMesinBoiler()) && ipsrsMesinBoilerVO.getMesin().getId()!=0){
			IpsrsMesinBoiler ipsrsMesinBoiler = new IpsrsMesinBoiler();
			
			if(CommonUtil.isNotNullOrEmpty(ipsrsMesinBoilerVO)){
				ipsrsMesinBoiler = ipsrsMesinBoilerConverter.transferVOToModel(ipsrsMesinBoilerVO, new IpsrsMesinBoiler());
				ipsrsMesinBoiler.setIpsrsPemakaianMesin(ipsrsPemakaianMesin);
			}
			if(CommonUtil.isNotNullOrEmpty(ipsrsMesinBoilerVO.getMesin())){
				ipsrsMesinBoiler.setMesin(produkConverter.transferVOToModel(ipsrsMesinBoilerVO.getMesin(), new Produk()));
			}
			if(CommonUtil.isNotNullOrEmpty(ipsrsMesinBoiler)){
				ipsrsPemakaianMesin.setIpsrsMesinBoiler(ipsrsMesinBoiler);
			}
		}
		IpsrsMesinGensetVO ipsrsMesinGensetVO = vo.getIpsrsMesinGenset();
		if(CommonUtil.isNotNullOrEmpty(vo.getIpsrsMesinGenset()) && ipsrsMesinGensetVO.getMesin().getId()!=0){
			IpsrsMesinGenset ipsrsMesinGenset = new IpsrsMesinGenset();
			
			if(CommonUtil.isNotNullOrEmpty(ipsrsMesinGensetVO)){
				ipsrsMesinGenset = ipsrsMesinGensetConverter.transferVOToModel(ipsrsMesinGensetVO, new IpsrsMesinGenset());
				ipsrsMesinGenset.setIpsrsPemakaianMesin(ipsrsPemakaianMesin);
			}
			if(CommonUtil.isNotNullOrEmpty(ipsrsMesinGensetVO.getMesin())){
				ipsrsMesinGenset.setMesin(produkConverter.transferVOToModel(ipsrsMesinGensetVO.getMesin(), new Produk()));
			}
			if(CommonUtil.isNotNullOrEmpty(ipsrsMesinGenset)){
				ipsrsPemakaianMesin.setIpsrsMesinGenset(ipsrsMesinGenset);
			}
		}
		if(CommonUtil.isNotNullOrEmpty(ipsrsPemakaianMesin)){
			IpsrsPemakaianMesin ipsrsPemakaianMesinResult = ipsrsPemakaianBoilerDao.save(ipsrsPemakaianMesin);
			result.put("noRec", ipsrsPemakaianMesinResult.noRec);
		}
		return result;
	}
	
	@Override
	public Map<String, Object> getAllPemakaianBoiler(){
		Map<String, Object> result = new HashMap<>();
		List<Map<String, Object>> listIpsrsMesinBoiler = ipsrsPemakaianMesinDao.getAllPemakaianBoiler();
		if(CommonUtil.isNotNullOrEmpty(listIpsrsMesinBoiler)){
			result.put("listIpsrsMesinBoiler", listIpsrsMesinBoiler);
		}
		return result;
	}
	
	@Override
	public Map<String, Object> getAllPemakaianGenset(){
		Map<String, Object> result = new HashMap<>();
		List<Map<String, Object>> listIpsrsMesinGenset = ipsrsPemakaianMesinDao.getAllPemakaianGenset();
		if(CommonUtil.isNotNullOrEmpty(listIpsrsMesinGenset)){
			result.put("listIpsrsMesinGenset", listIpsrsMesinGenset);
		}
		return result;
	}
	
	@Override
	public Boolean deletePemakaianMesin(String noRec){
		IpsrsPemakaianMesin ipsrsPemakaianMesin = new IpsrsPemakaianMesin();
		if(CommonUtil.isNotNullOrEmpty(noRec)){
			ipsrsPemakaianMesin = ipsrsPemakaianBoilerDao.findOne(noRec);
			ipsrsPemakaianBoilerDao.delete(ipsrsPemakaianMesin);
			return true;
		} else{
			return false;
		}
	}
	
	@Override
	public Map<String, Object> pemakaianBoiler(Integer page, Integer limit, String sort, String dir, String tanggalAwal,String tanggalAhir) {
		
		int totalRow = ipsrsPemakaianBoilerDaoCustom.findCountBoiler( tanggalAwal, tanggalAhir);
		int totalPages = 0;

		int pageRequested = page;

		if (totalRow > 0) {
			totalPages = (int) Math.ceil((double) totalRow / (double) limit);
		} else {
			totalPages = 0;
		}

		if (pageRequested > totalPages)
			pageRequested = totalPages;
		int rowStart = pageRequested * limit - limit;
		if (rowStart < 0) {
			rowStart = 0;
		}
		int rowEnd = limit;
		Map<String, Object> result=new HashMap<String,Object>();
		result.put("data", ipsrsPemakaianBoilerDaoCustom.findListBoiler(rowStart, rowEnd, sort, dir, tanggalAwal, tanggalAhir));
		result.put("totalPages", totalPages);
		result.put("totalRow", totalRow);
		return result;
	}
	
	
	@Override
	public Map<String, Object> pemakaianGenset(Integer page, Integer limit, String sort, String dir, String tanggalAwal,String tanggalAhir) {
		
		int totalRow = ipsrsPemakaianBoilerDaoCustom.findCountGenset( tanggalAwal, tanggalAhir);
		int totalPages = 0;

		int pageRequested = page;

		if (totalRow > 0) {
			totalPages = (int) Math.ceil((double) totalRow / (double) limit);
		} else {
			totalPages = 0;
		}

		if (pageRequested > totalPages)
			pageRequested = totalPages;
		int rowStart = pageRequested * limit - limit;
		if (rowStart < 0) {
			rowStart = 0;
		}
		int rowEnd = limit;
		Map<String, Object> result=new HashMap<String,Object>();
		result.put("data", ipsrsPemakaianBoilerDaoCustom.findListGenset(rowStart, rowEnd, sort, dir, tanggalAwal, tanggalAhir));
		result.put("totalPages", totalPages);
		result.put("totalRow", totalRow);
		return result;
	}
}
