package com.jasamedika.medifirst2000.service.impl;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
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.LimbahB3KeluarDao;
import com.jasamedika.medifirst2000.dao.PemakaianAirBersihDao;
import com.jasamedika.medifirst2000.dao.PerlakuanDao;
import com.jasamedika.medifirst2000.dao.RuanganDao;
import com.jasamedika.medifirst2000.dao.custom.LimbahB3KeluarDaoCustom;
import com.jasamedika.medifirst2000.entities.JenisLimbahB3Masuk;
import com.jasamedika.medifirst2000.entities.LimbahB3Keluar;
import com.jasamedika.medifirst2000.entities.PemakaianAirBersih;
import com.jasamedika.medifirst2000.entities.PerizinanLimbah;
import com.jasamedika.medifirst2000.entities.Perlakuan;
import com.jasamedika.medifirst2000.entities.Rekanan;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.LimbahB3KeluarService;
import com.jasamedika.medifirst2000.service.StrukKirimService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.JenisLimbahB3MasukVO;
import com.jasamedika.medifirst2000.vo.LimbahB3KeluarVO;
import com.jasamedika.medifirst2000.vo.PemakaianAirBersihVO;
import com.jasamedika.medifirst2000.vo.PerizinanLimbahVO;
import com.jasamedika.medifirst2000.vo.PerlakuanVO;
import com.jasamedika.medifirst2000.vo.RekananVO;
import com.jasamedika.medifirst2000.vo.RuanganVO;

@Service("LimbahB3KeluarService")
public class LimbahB3KeluarServiceImpl implements LimbahB3KeluarService<LimbahB3KeluarVO>{
	
	@Autowired
	private LimbahB3KeluarDao limbahB3KeluarDao;
	
	@Autowired
	private LimbahB3KeluarDaoCustom limbahB3KeluarDaoCustom;
	
	@Autowired
	private BaseConverterImpl<LimbahB3KeluarVO, LimbahB3Keluar> limbahB3KeluarConverter;
	
	@Autowired
	private BaseConverterImpl<JenisLimbahB3MasukVO, JenisLimbahB3Masuk> JenisLimbahB3MasukVOConverter;
	
	@Autowired
	private BaseConverterImpl<RekananVO, Rekanan> rekananConverter;
	
	@Autowired
	private RuanganDao ruanganDao;

	@Autowired
	private PerlakuanDao perlakuanDao;
	@Override
	public Map<String,Object> addLimbahB3Keluar(LimbahB3KeluarVO vo) {

		LimbahB3Keluar limbahB3Keluar=new LimbahB3Keluar();
				
		if(CommonUtil.isNotNullOrEmpty(vo)){
			limbahB3Keluar=limbahB3KeluarConverter.transferVOToModel(vo, new LimbahB3Keluar());
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getTotal()) && CommonUtil.isNotNullOrEmpty(vo.getJumlahLimbahB3Keluar())){
			limbahB3Keluar.setSisaLimbahB3(vo.getTotal()-vo.getJumlahLimbahB3Keluar());
		}
		
		if(CommonUtil.isNotNullOrEmpty(vo.getJenisLimbahB3Masuk())){
			limbahB3Keluar.setJenisLimbahB3Masuk(JenisLimbahB3MasukVOConverter.transferVOToModel(vo.getJenisLimbahB3Masuk(), new JenisLimbahB3Masuk()));
		}
		
		if(CommonUtil.isNotNullOrEmpty(vo.getRekanan())){
			limbahB3Keluar.setRekanan(rekananConverter.transferVOToModel(vo.getRekanan(),new Rekanan()));
		}
		
		//penambahaan perlakuan limbah keluar
		//date : 21.08.2018
		Perlakuan perlakuan = this.perlakuanDao.findOne(vo.getPerlakuanId());
		limbahB3Keluar.setPerlakuan(perlakuan);
		
		LimbahB3Keluar limbahB3KeluarResult = limbahB3KeluarDao.save(limbahB3Keluar);
		
		//Map<String,Object> StrukKirimResult=strukKirimService.addStrukKirim(limbahB3KeluarResult, vo.getStrukKirim());
		
		Map<String,Object> result=new HashMap<String,Object>();
		
		if (CommonUtil.isNotNullOrEmpty(limbahB3KeluarResult)) {
			result.put("noRec", limbahB3KeluarResult.getNoRec());
		}
		
		return result;
		
	}
	
	
	@Override
	public Map<String,Object> updateLimbahB3Keluar(LimbahB3KeluarVO vo) {
		Map<String,Object> result=new HashMap<String,Object>();
		LimbahB3Keluar limbahB3Keluar=new LimbahB3Keluar();
		limbahB3Keluar = limbahB3KeluarDao.findOne(vo.getNoRec());
		
		if(CommonUtil.isNotNullOrEmpty(limbahB3Keluar)){
//			if(CommonUtil.isNotNullOrEmpty(vo.getTotal()) && CommonUtil.isNotNullOrEmpty(vo.getJumlahLimbahB3Keluar())){
//				limbahB3Keluar.setSisaLimbahB3(vo.getTotal()-vo.getJumlahLimbahB3Keluar());
				limbahB3Keluar.setSisaLimbahB3(vo.getSisaLimbahB3());
//			}
			
			if(CommonUtil.isNotNullOrEmpty(vo.getJenisLimbahB3Masuk())){
				limbahB3Keluar.setJenisLimbahB3Masuk(JenisLimbahB3MasukVOConverter.transferVOToModel(vo.getJenisLimbahB3Masuk(), new JenisLimbahB3Masuk()));
			}
			
			if(CommonUtil.isNotNullOrEmpty(vo.getRekanan())){
				limbahB3Keluar.setRekanan(rekananConverter.transferVOToModel(vo.getRekanan(),new Rekanan()));
			}
			
			
			Perlakuan perlakuan = this.perlakuanDao.findOne(vo.getPerlakuanId());
			limbahB3Keluar.setPerlakuan(perlakuan);
			
			limbahB3Keluar.setTanggal(vo.getTanggal());
			limbahB3Keluar.setJumlahLimbahB3Keluar(vo.getJumlahLimbahB3Keluar());
			limbahB3Keluar.setTujuanPenyerahan(vo.getTujuanPenyerahan());
			limbahB3Keluar.setSisaLimbahB3(vo.getSisaLimbahB3());
			limbahB3Keluar.setMaksimalPenyimpanan(vo.getMaksimalPenyimpanan());
			limbahB3Keluar.setBuktiNomerDokumen(vo.getBuktiNomerDokumen());
			
			LimbahB3Keluar limbahB3KeluarResult = limbahB3KeluarDao.save(limbahB3Keluar);
			
			if (CommonUtil.isNotNullOrEmpty(limbahB3KeluarResult)) {
				result.put("noRec", limbahB3KeluarResult.getNoRec());
			}
		}
		return result;
	}
	
	@Override
	public Map<String,Object> findAllLimbahB3Keluar() {
		Map<String,Object> result=new HashMap<String,Object>();
		List<LimbahB3Keluar> resultModel=(List<LimbahB3Keluar>) limbahB3KeluarDao.findAll();
		if(CommonUtil.isNotNullOrEmpty(resultModel)){
			result.put("limbahB3Keluar", resultModel);
			result.put("dataFound", true);
		}else{
			result.put("dataFound", false);
		}
		return result;
	}
	
	@Override
	public boolean deleteLimbahB3Keluar(String noRec) {
		if (CommonUtil.isNotNullOrEmpty(noRec)){
			LimbahB3Keluar limbahB3Keluar = limbahB3KeluarDao.findOne(noRec);
//			limbahB3KeluarDao.delete(limbahB3Keluar);
			limbahB3Keluar.setStatusEnabled(false);
			
			limbahB3KeluarDao.save(limbahB3Keluar);
			return true;
		}else{
			return false;
		}
	}
	
	@Override
	public Map<String, Object> lisLimbahB3Keluar(Integer page, Integer limit, String sort, String dir, String dateStart,String dateEnd, Integer jenisLimbah) {
		
		int totalRow = limbahB3KeluarDaoCustom.findCount(sort, dateStart, dateEnd, jenisLimbah);
		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", limbahB3KeluarDaoCustom.findList(rowStart, rowEnd, sort, dir, dateStart, dateEnd, jenisLimbah));
		result.put("totalPages", totalPages);
		result.put("totalRow", totalRow);
		return result;
	}
	
	@Override
	public Map<String, Object> limbahB3KeluarByNoRec(String noRec) {
		Map<String, Object> result=new HashMap<String,Object>();
		result = limbahB3KeluarDaoCustom.limbahB3KeluarByNoRec(noRec);

		return result;
	}


	
	@Override
	public Map<String, Object> findLimbahB3KeluarByPeriode(String periodeAwal, String periodeAkhir) {

		Map<String, Object> result = new HashMap<String, Object>();
		List<LimbahB3Keluar> resultModel = limbahB3KeluarDao.findLimbahB3KeluarByPeriode(periodeAwal, periodeAkhir);
		if (CommonUtil.isNotNullOrEmpty(resultModel)) {
			result.put("limbahB3Keluar", resultModel);
			result.put("dataFound", true);
		} else {
			result.put("dataFound", false);
		}
		return result;
	}
	
	

	@Override
	public Map<String, Object> getLimbahB3Keluar(String periodeAwal, String periodeAkhir) {
		Map<String, Object> result = new HashMap<>();
		List<Map<String, Object>> list = this.limbahB3KeluarDao.getLimbahKeluar(periodeAwal, periodeAkhir);
		result.put("data", list);
				
		return result;
	}
	
	@Override
	public Map<String, Object> getRekanan() {
		Map<String, Object> result = new HashMap<>();
		List<Map<String, Object>> list = this.limbahB3KeluarDao.getRekananByJenisRekanan();
		result.put("data", list);
		return result;
	}
	
	@Override
	public Map<String, Object> getSisaLimbahdiTpsByJenisLimbah(Integer jenisLimbah) {
		Map<String, Object> result = new HashMap<>();
		List<Map<String, Object>> data = new ArrayList<>();
		List<Map<String, Object>> list = this.limbahB3KeluarDao.getJenisLimbah(jenisLimbah);
		for(Map<String, Object>item:list){
			Integer idJenisLimbah = (Integer)item.get("jenisLimbah");
			if(idJenisLimbah!=null){
				Map<String, Object> qtyMasukResult = this.limbahB3KeluarDao.getLimbahMasukdiTpsByJenisLimbah((Integer)item.get("jenisLimbah"));
				Double qtyMasukTerus = (Double)qtyMasukResult.get("ttlqtymasuk");
				item.put("qtyMasuk", qtyMasukTerus);

				Map<String, Object> qtyKeluarResult = this.limbahB3KeluarDao.getLimbahKeluardiTpsByJenisLimbah((Integer)item.get("jenisLimbah"));
				Double qtyKeluarTerus = (Double)qtyKeluarResult.get("ttlqtykeluar");
				item.put("qtyKeluar", qtyKeluarTerus);

				Double qtySisaLimbah = qtyMasukTerus - qtyKeluarTerus;
				float qtySisaLimbah1 = (float) Math.round(qtySisaLimbah*100)/100;
				
				item.put("qtySisa", qtySisaLimbah1);
				
				data.add(item);
			}		
		}
		result.put("data", data);
			
		return result;
	}

	@Override
	public LimbahB3KeluarVO add(LimbahB3KeluarVO vo) throws JpaSystemException, ServiceVOException {
		return null;
	}

	@Override
	public LimbahB3KeluarVO update(LimbahB3KeluarVO vo) throws JpaSystemException, ServiceVOException {
		return null;
	}

	@Override
	public Boolean delete(String key) throws JpaSystemException {
		return null;
	}

	@Override
	public LimbahB3KeluarVO findById(String key) throws JpaSystemException {
		return null;
	}

	@Override
	public List<LimbahB3KeluarVO> findAll() throws JpaSystemException {
		return null;
	}

	@Override
	public Map<String, Object> findAllWithPageAndLimitAndSortByAndDirectionParameter(Integer page, Integer limit,
			String sort, String dir) {
		return null;
	}

}
