package com.jasamedika.medifirst2000.service.impl;

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.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.PemeriksaanLimbahDao;
import com.jasamedika.medifirst2000.dao.PemeriksaanLimbahDetailDao;
import com.jasamedika.medifirst2000.dao.custom.PemeriksaanLimbahDaoCustom;
import com.jasamedika.medifirst2000.entities.JenisPemeriksaan;
import com.jasamedika.medifirst2000.entities.PemeriksaanLimbah;
import com.jasamedika.medifirst2000.entities.PemeriksaanLimbahDetail;
import com.jasamedika.medifirst2000.entities.ProdukKeslingNilaiNormal;
import com.jasamedika.medifirst2000.service.PemeriksaanLimbahService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.JenisPemeriksaanVO;
import com.jasamedika.medifirst2000.vo.PemeriksaanLimbahDetailVO;
import com.jasamedika.medifirst2000.vo.PemeriksaanLimbahVO;
import com.jasamedika.medifirst2000.vo.ProdukKeslingNilaiNormalVO;

@Service("pemeriksaanLimbahService")
public class PemeriksaanLimbahServiceImpl extends BaseVoServiceImpl implements PemeriksaanLimbahService {
	
	@Autowired
	private PemeriksaanLimbahDao pemeriksaanLimbahDao;
	
	@Autowired
	private PemeriksaanLimbahDaoCustom pemeriksaanLimbahDaoCustom;
	
	@Autowired
	private PemeriksaanLimbahDetailDao pemeriksaanLimbahDetailDao;
	
	@Autowired
	private BaseConverterImpl<PemeriksaanLimbahVO, PemeriksaanLimbah> pemeriksaanLimbahCoonverter;
	
	@Autowired
	private BaseConverterImpl<JenisPemeriksaanVO, JenisPemeriksaan> jenisPemeriksaanCoonverter;
	
	@Autowired
	private BaseConverterImpl<PemeriksaanLimbahDetailVO, PemeriksaanLimbahDetail> pemeriksaanLimbahDetailCoonverter;
	
	@Autowired
	private BaseConverterImpl<ProdukKeslingNilaiNormalVO, ProdukKeslingNilaiNormal> ProdukKeslingNilaiNormalCoonverter;

	@Override
	@Transactional(readOnly=false)
	public Map<String, Object> save(PemeriksaanLimbahVO vo) {
		PemeriksaanLimbah pemeriksaanLimbah=new PemeriksaanLimbah();
		pemeriksaanLimbah=pemeriksaanLimbahCoonverter.transferVOToModelData(vo, new PemeriksaanLimbah());
		List<PemeriksaanLimbahDetail> listPeme=new ArrayList<PemeriksaanLimbahDetail>();
		
		if(CommonUtil.isNotNullOrEmpty(vo.getPemeriksaanLimbahDetail())){
			for(PemeriksaanLimbahDetailVO pemeriksaanLimbahDetailVO:vo.getPemeriksaanLimbahDetail()){
				PemeriksaanLimbahDetail p=new PemeriksaanLimbahDetail();
				p.setPemeriksaanLimbah(pemeriksaanLimbah);
				if(CommonUtil.isNotNullOrEmpty(pemeriksaanLimbahDetailVO.getProdukKeslingNilaiNormal())){
					p.setProdukKeslingNilaiNormal(ProdukKeslingNilaiNormalCoonverter.transferVOToModel(pemeriksaanLimbahDetailVO.getProdukKeslingNilaiNormal(), new ProdukKeslingNilaiNormal()));
				}
				p.setKeterangan(pemeriksaanLimbahDetailVO.getKeterangan());
				p.setNilai(pemeriksaanLimbahDetailVO.getNilai());
				listPeme.add(p);
			}
		}
		pemeriksaanLimbah.getPemeriksaanLimbahDetail().clear();
		pemeriksaanLimbah.getPemeriksaanLimbahDetail().addAll(listPeme);
		
		pemeriksaanLimbah=pemeriksaanLimbahDao.save(pemeriksaanLimbah);
		
		Map<String,Object> result=new HashMap<String,Object>();
		result.put("noRec", pemeriksaanLimbah.getNoRec());
		
		return result;
	}
	
	@Override
	public Map<String, Object> pemeriksaanLimbah(Integer page, Integer limit, String sort, String dir, String tanggalAwal,String tanggalAhir,Integer jenisPemeriksaanId) {
		
		int totalRow = pemeriksaanLimbahDaoCustom.findCountPemeriksaanLimbah(tanggalAwal, tanggalAhir, jenisPemeriksaanId);
		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", pemeriksaanLimbahDaoCustom.findListPemeriksaanLimbah(rowStart, rowEnd, sort, dir, tanggalAwal, tanggalAhir, jenisPemeriksaanId));
		result.put("totalPages", totalPages);
		result.put("totalRow", totalRow);
		return result;
	}

	@Override
	public Map<String, Object> getPemeriksaanLimbahDetail(String noRec) {
		Map<String,Object> result=new HashMap<String,Object>();
		result.put("pemeriksaanLimbah", pemeriksaanLimbahDao.findByParent(noRec));
		result.put("pemeriksaanLimbahDetail",pemeriksaanLimbahDetailDao.findByParent(noRec));
		return result;
	}
	
	
}
