package com.jasamedika.medifirst2000.service.impl;

import java.util.ArrayList;
import java.util.Date;
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 org.springframework.transaction.annotation.Transactional;

import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.AntrianPasienDiPeriksaDao;
import com.jasamedika.medifirst2000.dao.PelayananCytotoxicDao;
import com.jasamedika.medifirst2000.dao.ProduksiDetailDao;
import com.jasamedika.medifirst2000.dao.RunningNumberDao;
import com.jasamedika.medifirst2000.entities.PelayananProduksi;
import com.jasamedika.medifirst2000.entities.ProduksiDetail;
import com.jasamedika.medifirst2000.entities.RunningNumber;
import com.jasamedika.medifirst2000.entities.Storage;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.PasienDaftarService;
import com.jasamedika.medifirst2000.service.PelayananCytotoxicService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.StringUtil;
import com.jasamedika.medifirst2000.vo.ProduksiDetailVO;
import com.jasamedika.medifirst2000.vo.StorageVO;
import com.jasamedika.medifirst2000.vo.PelayananProduksiVO;

@Service("pelayananCytotoxicService")
public class PelayananCytotoxicServiceImpl implements PelayananCytotoxicService {

	@Autowired
	private PasienDaftarService pasienDaftarService;

	@Autowired
	private PelayananCytotoxicDao pelayananCytotoxicDao;

	@Autowired
	private ProduksiDetailDao produksiDetailDao;

	@Autowired
	private BaseConverterImpl<ProduksiDetailVO, ProduksiDetail> produksiDetailConverter;

	@Autowired
	private BaseConverterImpl<StorageVO, Storage> storageConverter;

	@Autowired
	private BaseConverterImpl<PelayananProduksiVO, PelayananProduksi> pelayananProduksiConverter;

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

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

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

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

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

	@Override
	public Map<String, Object> findAllWithPageAndLimitAndSortByAndDirectionParameter(Integer page, Integer limit,
			String sort, String dir) {
		return null;
	}
	@Autowired
	private RunningNumberDao runningNumberDao;
	@Autowired
	private AntrianPasienDiPeriksaDao antrianPasienDiPeriksaDao;
	@Override
	@Transactional
	public Map<String, Object> save(PelayananProduksiVO vo) {
		Map<String, Object> result = new HashMap<String, Object>();
		PelayananProduksi pelayananProduksi = pelayananProduksiConverter.transferVOToModel(vo, new PelayananProduksi());
		List<ProduksiDetail> listProduksiDetail = new ArrayList<ProduksiDetail>();
		RunningNumber runningNumber = runningNumberDao.findByResetAndKegunaan("0", "Produksi");
		if(runningNumber==null)
		{
			runningNumber = new RunningNumber();
			runningNumber.setKegunaan("Pasien");
			runningNumber.setReset("0");
			runningNumber.setNomerTerbaru((Integer)0);
		}
		Integer number=(runningNumber.getNomerTerbaru()+(Integer)1);
		runningNumber.setNomerTerbaru(runningNumber.getNomerTerbaru()+(Integer)1);
		String noProduksi = StringUtil.formatNumber(number.toString(), 10); 
		
		pelayananProduksi.setNoProduksi(noProduksi);
		for (ProduksiDetailVO vos : vo.getPelayananCytotoxic()) {
			ProduksiDetail produksiDetail = produksiDetailConverter.transferVOToModel(vos, new ProduksiDetail());
			produksiDetail.setPelayananCytotoxic(pelayananProduksi);
			produksiDetail.setSubTotal(produksiDetail.getHarga() * produksiDetail.getQty());
			listProduksiDetail.add(produksiDetail);
		}
		if (CommonUtil.isNotNullOrEmpty(pelayananProduksi.getPelayananCytotoxic())) {
			pelayananProduksi.getPelayananCytotoxic().clear();
		}
		pelayananProduksi.setNoProduksi(StringUtil
				.formatNumber(String.valueOf(pelayananCytotoxicDao.getCountByMonthAndYear(new Date()) + 1), 10));
		pelayananProduksi.setPasien(
				antrianPasienDiPeriksaDao.findbyNoCmAndTglRegistrasi(vo.getPasien().getId(), vo.getTglRegistrasi()));
		pelayananProduksi.getPelayananCytotoxic().addAll(listProduksiDetail);
		pelayananProduksi.setStorage(storageConverter.transferVOToModel(vo.getStorage(), new Storage()));
		PelayananProduksi resultModel = pelayananCytotoxicDao.save(pelayananProduksi);
		if (CommonUtil.isNotNullOrEmpty(resultModel)) {
			result.put("id", resultModel.getNoRec());
			result.put("noProduksi", noProduksi);
		}
		return result;
	}

	@Override
	public Map<String, Object> edit(PelayananProduksiVO vo) {
		Map<String, Object> result = new HashMap<String, Object>();
		PelayananProduksi pelayananProduksi = pelayananProduksiConverter.transferVOToModel(vo, new PelayananProduksi());
		List<ProduksiDetail> modelProduksiDetail = produksiDetailDao.findCytotoxicByNoRec(vo.getNoRec());
		if (CommonUtil.isNotNullOrEmpty(modelProduksiDetail)) {
			produksiDetailDao.delete(modelProduksiDetail);
		}
		List<ProduksiDetail> listProduksiDetail = new ArrayList<ProduksiDetail>();
		for (ProduksiDetailVO vos : vo.getPelayananCytotoxic()) {
			ProduksiDetail produksiDetail = produksiDetailConverter.transferVOToModel(vos, new ProduksiDetail());
			produksiDetail.setPelayananCytotoxic(pelayananProduksi);
			produksiDetail.setSubTotal(produksiDetail.getHarga() * produksiDetail.getQty());
			listProduksiDetail.add(produksiDetail);
		}
		if (CommonUtil.isNotNullOrEmpty(pelayananProduksi.getPelayananCytotoxic())) {
			pelayananProduksi.getPelayananCytotoxic().clear();
		}
		pelayananProduksi.setNoProduksi(StringUtil
				.formatNumber(String.valueOf(pelayananCytotoxicDao.getCountByMonthAndYear(new Date()) + 1), 10));
		pelayananProduksi.setPasien(
				antrianPasienDiPeriksaDao.findbyNoCmAndTglRegistrasi(vo.getPasien().getId(), vo.getTglRegistrasi()));
		pelayananProduksi.getPelayananCytotoxic().addAll(listProduksiDetail);
		pelayananProduksi.setStorage(storageConverter.transferVOToModel(vo.getStorage(), new Storage()));
		PelayananProduksi resultModel = pelayananCytotoxicDao.save(pelayananProduksi);
		if (CommonUtil.isNotNullOrEmpty(resultModel)) {
			result.put("id", resultModel.getNoRec());
		}
		return result;
	}

}
