package com.jasamedika.medifirst2000.service.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.PemeriksaanAngkaKumanUdaraDao;
import com.jasamedika.medifirst2000.entities.BakuMutu;
import com.jasamedika.medifirst2000.entities.PemeriksaanAngkaKumanUdara;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.entities.SwabAlatPermukaan;
import com.jasamedika.medifirst2000.service.PemeriksaanAngkaKumanUdaraService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.BakuMutuVO;
import com.jasamedika.medifirst2000.vo.PemeriksaanAngkaKumanUdaraVO;
import com.jasamedika.medifirst2000.vo.RuanganVO;
import com.jasamedika.medifirst2000.vo.SwabAlatPermukaanVO;

@Service("pemeriksaanAngkaKumanUdaraService")
public class PemeriksaanAngkaKumanUdaraServiceImpl implements PemeriksaanAngkaKumanUdaraService{

	@Autowired
	private PemeriksaanAngkaKumanUdaraDao pemeriksaanAngkaKumanUdaraDao;
	
	@Autowired
	private BaseConverterImpl<PemeriksaanAngkaKumanUdaraVO, PemeriksaanAngkaKumanUdara> pemeriksaanAngkaKumanUdaraConverter;
	
	@Autowired
	private BaseConverterImpl<RuanganVO, Ruangan> ruanganConverter;
	
	@Autowired
	private BaseConverterImpl<BakuMutuVO, BakuMutu> bakuMutuConverter;
	
	@Override
	public Map<String, Object> getUnitRuangan(){
		Map<String, Object> result = new HashMap<>();
		List<Map<String, Object>> listData = pemeriksaanAngkaKumanUdaraDao.getUnitRuangan();
		if(CommonUtil.isNotNullOrEmpty(listData)){
			result.put("unitRuangan", listData);
		}
		return result;
		
	}
	
	@Override
	public Map<String, Object> getBakuMutu(){
		Map<String, Object> result = new HashMap<>();
		List<Map<String, Object>> listData = pemeriksaanAngkaKumanUdaraDao.getBakuMutu();
		if(CommonUtil.isNotNullOrEmpty(listData)){
			result.put("bakuMutu", listData);
		}
		return result;
		
	}
	
	@Override
	public Map<String, Object> savePemeriksaanAngkaKumanUdara(PemeriksaanAngkaKumanUdaraVO vo){
		Map<String, Object> result = new HashMap<>();
		PemeriksaanAngkaKumanUdara pemeriksaanAngkaKumanUdara = pemeriksaanAngkaKumanUdaraConverter.transferVOToModel(vo, new PemeriksaanAngkaKumanUdara());
		
		//date : 18.09.2018
		//by : iwankasan
		//ruangan di gandi, diinput
		//permintaan oleh user K3KL,
		//bakumutu tdk dibutuhkan
		//if(CommonUtil.isNotNullOrEmpty(vo.getNamaRuangan())){
		//	pemeriksaanAngkaKumanUdara.setNamaRuangan(ruanganConverter.transferVOToModel(vo.getNamaRuangan(), new Ruangan()));
		//}
		//if(CommonUtil.isNotNullOrEmpty(vo.getBakuMutu())){
		//	pemeriksaanAngkaKumanUdara.setBakuMutu(bakuMutuConverter.transferVOToModel(vo.getBakuMutu(), new BakuMutu()));
		//}
		
		if(CommonUtil.isNotNullOrEmpty(vo.getUploadDokumen())){
			try{
				byte[] decodedBytes = Base64.decodeBase64(vo.getUploadDokumen());
				pemeriksaanAngkaKumanUdara.setFile(decodedBytes);
			}catch (Exception ex){
				ex.printStackTrace();
			}
		}
		if(CommonUtil.isNotNullOrEmpty(pemeriksaanAngkaKumanUdara)){
			PemeriksaanAngkaKumanUdara pemeriksaanAngkaKumanUdaraResult = pemeriksaanAngkaKumanUdaraDao.save(pemeriksaanAngkaKumanUdara);
			result.put("id", pemeriksaanAngkaKumanUdaraResult.getId());
		}
		
		return result;
	}
	
	@Override
	public Map<String, Object> getPemeriksaanAngkaKumanUdara(){
		Map<String, Object> result = new HashMap<>();
		List<Map<String, Object>> listData = pemeriksaanAngkaKumanUdaraDao.getPemeriksaanAngkaKumanUdara();
		if(CommonUtil.isNotNullOrEmpty(listData)){
			result.put("listtPemeriksaanAngkaKumanUdara", listData);
		}
		return result;
	}
	
	@Override
	public Boolean updatePemeriksaanAngkaKumanUdara(PemeriksaanAngkaKumanUdaraVO vo){
		if(CommonUtil.isNotNullOrEmpty(vo)){
			PemeriksaanAngkaKumanUdara pemeriksaanAngkaKumanUdara = pemeriksaanAngkaKumanUdaraConverter.transferVOToModel(vo, new PemeriksaanAngkaKumanUdara());
			
			if(CommonUtil.isNotNullOrEmpty(vo.getBakuMutu())){
				pemeriksaanAngkaKumanUdara.setBakuMutu(bakuMutuConverter.transferVOToModel(vo.getBakuMutu(), new BakuMutu()));
			}
			if(CommonUtil.isNotNullOrEmpty(vo.getNamaRuangan())){
				pemeriksaanAngkaKumanUdara.setNamaRuangan(ruanganConverter.transferVOToModel(vo.getNamaRuangan(), new Ruangan()));
			}
			if(CommonUtil.isNotNullOrEmpty(pemeriksaanAngkaKumanUdara)){
				pemeriksaanAngkaKumanUdaraDao.save(pemeriksaanAngkaKumanUdara);
			}
			return true;
		} else{
			return false;
		}
	}
	
	@Override
	public Boolean deletePemeriksaanAngkaKumanUdara(Integer id){
		if(CommonUtil.isNotNullOrEmpty(id)){
			PemeriksaanAngkaKumanUdara pemeriksaanAngkaKumanUdara = pemeriksaanAngkaKumanUdaraDao.findOne(id);
			pemeriksaanAngkaKumanUdaraDao.delete(pemeriksaanAngkaKumanUdara);
			return true;
		} else{
			return false;
		}
	}

	@Override
	public Map<String, Object> getRepotingPemeriksaanAngkaKumanUdaraByPeriode(String startDate, String endDate) {
		Map<String, Object> result = new HashMap<>();
		
		Map<String, Object> header = new HashMap<>();
		
		header.put("startDate", startDate);
		header.put("endDate", endDate);
		
		List<Map<String, Object>> listData = this.pemeriksaanAngkaKumanUdaraDao.getRepotingPemeriksaanAngkaKumanUdaraByPeriode(startDate, endDate);
		
		result.put("header", header);
		result.put("listData", listData);
		
		return result;
	}
	
	@Override
	public Map<String, Object> downloadFileHasilPemantauan(Integer id){
		Map<String, Object> result = new HashMap<>();
		
		if(CommonUtil.isNotNullOrEmpty(id)){
			result = pemeriksaanAngkaKumanUdaraDao.downloadFileHasilPemantauan(id);
			byte[] encodeBytes = Base64.encodeBase64((byte[])result.get("file"));
			result.put("file",encodeBytes);
			return pemeriksaanAngkaKumanUdaraDao.downloadFileHasilPemantauan(id);
		} else {
			return null;
		}
	}
	
	
}
