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 com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.AntrianPasienDiPeriksaDao;
import com.jasamedika.medifirst2000.dao.BatalRegistrasiDao;
import com.jasamedika.medifirst2000.dao.PasienDaftarDao;
import com.jasamedika.medifirst2000.entities.AntrianPasienDiPeriksa;
import com.jasamedika.medifirst2000.entities.BatalRegistrasi;
import com.jasamedika.medifirst2000.entities.PasienDaftar;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.Pembatal;
import com.jasamedika.medifirst2000.service.BatalRegistrasiService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.BatalRegistrasiVO;
import com.jasamedika.medifirst2000.vo.PasienDaftarVO;
import com.jasamedika.medifirst2000.vo.PegawaiVO;
import com.jasamedika.medifirst2000.vo.PembatalVO;

@Service("BatalRegistrasiService")
public class BatalRegistrasiServiceImpl extends BaseVoServiceImpl implements BatalRegistrasiService {

	@Autowired
	private BaseConverterImpl<PegawaiVO, Pegawai> pegawaiConverter;
	
	@Autowired
	private BaseConverterImpl<PasienDaftarVO, PasienDaftar> pasienDaftarConverter;
	
	@Autowired
	private BaseConverterImpl<PembatalVO, Pembatal> pembatalConverter;
	
	@Autowired
	private BaseConverterImpl<BatalRegistrasiVO, BatalRegistrasi> batalRegistrasiConverter;

	@Autowired
	private AntrianPasienDiPeriksaDao antrianPasienDiPeriksaDao;
	
	@Autowired
	private BatalRegistrasiDao batalRegistrasiDao;
	
	@Autowired
	private PasienDaftarDao pasienDaftarDao;
	
	@Override
	public Map<String, Object> saveBatalRegistrasi(BatalRegistrasiVO vo) {
		Map<String, Object> result = new HashMap<String, Object>();
		if(CommonUtil.isNotNullOrEmpty(vo))
		{			
			if(CommonUtil.isNotNullOrEmpty(vo.getPasienDaftar()))
			{
				List<Map<String, Object>> data = batalRegistrasiDao.findPasienInPelayananPasien(vo.getPasienDaftar().getNoRec());
				
				if(CommonUtil.isNullOrEmpty(data))
				{
					result = addBatalRegistrasi(vo);
				}
				else if(CommonUtil.isNotNullOrEmpty(data))
				{
					if(CommonUtil.isNullOrEmpty(data.get(0).get("noStruk")))
					{
						result = addBatalRegistrasi(vo);
					}
					if(CommonUtil.isNotNullOrEmpty(data.get(0).get("noStruk")) && (CommonUtil.isNotNullOrEmpty(data.get(0).get("noSbm"))))
					{
						result.put("message", "Pasien Sudah Melakukan Pembayaran");
					}
					else if (CommonUtil.isNotNullOrEmpty(data.get(0).get("noStruk")))
					{
						result.put("message", "Pelayanan Sudah di Verifikasi");
					}
				}
			}			
		}
		return result;
	}
	
	public Map<String, Object> addBatalRegistrasi(BatalRegistrasiVO vo) {
		Map<String, Object> result = new HashMap<String, Object>();
		BatalRegistrasi batalRegistrasi = batalRegistrasiConverter.transferVOToModel(vo, new BatalRegistrasi());
		PasienDaftar pasien = pasienDaftarConverter.transferVOToModel(vo.getPasienDaftar(), new PasienDaftar());
		batalRegistrasi.setPasienDaftar(pasien);
		if(CommonUtil.isNotNullOrEmpty(vo.getPembatalan()))
		{
			Pembatal pembatal = pembatalConverter.transferVOToModel(vo.getPembatalan(), new Pembatal());
			batalRegistrasi.setPembatalan(pembatal);
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getPegawai()))
		{
			Pegawai pegawai = pegawaiConverter.transferVOToModel(vo.getPegawai(), new Pegawai());
			batalRegistrasi.setPegawai(pegawai);
		}	
		List<String> batal = batalRegistrasiDao.findBatalRegistrasi(vo.getPasienDaftar().getNoRec());
		if(CommonUtil.isNullOrEmpty(batal))
		{
			if(CommonUtil.isNotNullOrEmpty(batalRegistrasi) )
			{
				BatalRegistrasi model = batalRegistrasiDao.save(batalRegistrasi);
				result = updateStatusEnable(vo.getPasienDaftar().getNoRec());
				result.put("norecBatalRegistrasi", model.getNoRec());
			}
		}	
		return result;		
	}
	

	@Override
	public List<Map<String,Object>> getBatalRegistrasi(String startDate, String endDate) {
		List<Map<String,Object>> result = new ArrayList<Map<String,Object>>();
		result = batalRegistrasiDao.findPembatalan(startDate, endDate);
		return result;
	}
	
	@Override
	public Map<String,Object> updateStatusEnable(String noRec)
	{
		Map<String,Object> result =  new HashMap<String,Object>();
		String noRegistrasi = pasienDaftarDao.findNoRegistrasi(noRec);
		List<AntrianPasienDiPeriksa> listAntrian = antrianPasienDiPeriksaDao.findByNoRegister(noRegistrasi);
		for(AntrianPasienDiPeriksa antrian :listAntrian)
		{
			antrian.setStatusEnabled(false);
			AntrianPasienDiPeriksa newModel = antrianPasienDiPeriksaDao.save(antrian);
			result.put(newModel.getNoRec(), newModel.getStatusEnabled());
		}
		
		return result;
	}

}
