package com.jasamedika.medifirst2000.service.impl;

import java.text.SimpleDateFormat;
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.converter.PapInstruksiPerjanjianConverter;
import com.jasamedika.medifirst2000.dao.AntrianPasienDiPeriksaDao;
import com.jasamedika.medifirst2000.dao.PapInstruksiPerjanjianDao;
import com.jasamedika.medifirst2000.dao.PasienDaftarDao;
import com.jasamedika.medifirst2000.dao.PasienInstruksiDao;
import com.jasamedika.medifirst2000.dao.PasienInstruksiPerjanjianDao;
import com.jasamedika.medifirst2000.dao.RegistrasiPelayananPasienDao;
import com.jasamedika.medifirst2000.dao.RunningNumberDao;
import com.jasamedika.medifirst2000.entities.AntrianPasienDiPeriksa;
import com.jasamedika.medifirst2000.entities.AntrianPasienRegistrasi;
import com.jasamedika.medifirst2000.entities.PapInstruksiPerjanjian;
import com.jasamedika.medifirst2000.entities.PapKeluhanUtama;
import com.jasamedika.medifirst2000.entities.Pasien;
import com.jasamedika.medifirst2000.entities.PasienDaftar;
import com.jasamedika.medifirst2000.entities.PasienInstruksiPerjanjian;
import com.jasamedika.medifirst2000.entities.PasienInstruksiPerjanjianT;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.RegistrasiPelayananPasien;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.entities.RunningNumber;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.AntrianPasienRegistrasiService;
import com.jasamedika.medifirst2000.service.PapInstruksiPerjanjianService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.StringUtil;
import com.jasamedika.medifirst2000.vo.PapInstruksiPerjanjianVO;
import com.jasamedika.medifirst2000.vo.PasienInstruksiPerjanjianVO;
import com.jasamedika.medifirst2000.vo.PasienVO;
import com.jasamedika.medifirst2000.vo.PegawaiVO;
import com.jasamedika.medifirst2000.vo.RuanganVO;

/**
 * Implement class for PapInstruksiPerjanjianService
 * 
 * @author Askur
 */
@Service("PapInstruksiPerjanjianService")
public class PapInstruksiPerjanjianServiceImpl extends BaseVoServiceImpl implements PapInstruksiPerjanjianService {
	@Autowired
	private PapInstruksiPerjanjianDao PapInstruksiPerjanjianDao;
	
	@Autowired
	private PapInstruksiPerjanjianConverter PapInstruksiPerjanjianConverter;
	
	@Autowired
	private AntrianPasienRegistrasiService antrianPasienRegistrasiService;
	
	@Autowired
	private PasienInstruksiPerjanjianDao pasienInstruksiPerjanjianDao;
	
	@Autowired
	private PasienInstruksiDao pasienInstruksiDao;
	
	@Autowired
	private BaseConverterImpl<RuanganVO, Ruangan> ruanganConverter;
	
	@Autowired
	private BaseConverterImpl<PasienInstruksiPerjanjianVO, PasienInstruksiPerjanjianT> pasienInstruksiPerjanjianConverter;
	
	@Autowired
	private BaseConverterImpl<PasienVO,Pasien> pasienConverter;
	
	@Autowired
	private BaseConverterImpl<PegawaiVO,Pegawai> pegawaiConverter;
	
	@Autowired
	private PasienDaftarDao pasienDaftarDao;
	
	@Autowired
	private RunningNumberDao runningNumberDao;
	
	@Autowired
	private AntrianPasienDiPeriksaDao antrianPasienDiPeriksaDao;
	
	@Override
	@Transactional(readOnly=false)
	public Map<String,Object> addInstruksiPerjanjian(PasienInstruksiPerjanjianVO vo) throws JpaSystemException, ServiceVOException {
		Map<String,Object> result=new HashMap<String,Object>();
		if(CommonUtil.isNotNullOrEmpty(vo))
		{
			PasienInstruksiPerjanjianT pasienInstruksiPerjanjian = pasienInstruksiPerjanjianConverter.transferVOToModel(vo, new PasienInstruksiPerjanjianT());
			
			if(CommonUtil.isNotNullOrEmpty(vo.getDokter()))
			{
				pasienInstruksiPerjanjian.setDokter(pegawaiConverter.transferVOToModel(vo.getDokter(), new Pegawai()));
			}
			if(CommonUtil.isNotNullOrEmpty(vo.getPasien()))
			{
				pasienInstruksiPerjanjian.setPasien(pasienConverter.transferVOToModel(vo.getPasien(), new Pasien()));
			}	
			if(CommonUtil.isNotNullOrEmpty(vo.getRuangan()))
			{
				pasienInstruksiPerjanjian.setRuangan(ruanganConverter.transferVOToModel(vo.getRuangan(), new Ruangan()));
			}
			pasienInstruksiPerjanjian.setNoPerjanjian(generateNoPerjanjian());
			if(CommonUtil.isNotNullOrEmpty(pasienInstruksiPerjanjian))
			{
				PasienInstruksiPerjanjianT temp = pasienInstruksiDao.findPapInstruksiPerjanjianByNoCm(pasienInstruksiPerjanjian.getPasien().getId());
				if(CommonUtil.isNotNullOrEmpty(temp))
				{
					pasienInstruksiPerjanjian.setNoRec(temp.getNoRec());
				}
				PasienInstruksiPerjanjianT model = pasienInstruksiDao.save(pasienInstruksiPerjanjian);
				if(CommonUtil.isNotNullOrEmpty(model))
				{
					if(CommonUtil.isNotNullOrEmpty(model.getJumlahKunjungan()))
					{
						result.put("norec", model.getNoRec());
					}
				}
			}
		}
		
		return result;
	}
	
	public String generateNoPerjanjian()
	{
		String noPerjanjian = new SimpleDateFormat("ddMMyy").format(new Date());
		RunningNumber runningNumber = runningNumberDao.findByResetAndKegunaan("0", "NoPerjanjian");
		if(runningNumber==null)
		{
			runningNumber = new RunningNumber();
			runningNumber.setKegunaan("NoPerjanjian");
			runningNumber.setReset("0");
			runningNumber.setNomerTerbaru((Integer)0);
		}
		Integer number=(runningNumber.getNomerTerbaru()+(Integer)1);
		runningNumber.setNomerTerbaru(runningNumber.getNomerTerbaru()+(Integer)1);
		noPerjanjian += StringUtil.formatNumber(number.toString(), 6); 
		
		return noPerjanjian;
	}
	
	
	@Override
	@Transactional(readOnly=false)
	public Map<String,Object> updateJadwal(PapInstruksiPerjanjianVO vo) throws JpaSystemException, ServiceVOException {
		Map<String,Object> result=new HashMap<String,Object>();
		PapInstruksiPerjanjian model=PapInstruksiPerjanjianConverter.transferVOToModel(vo, new PapInstruksiPerjanjian());
		List<PasienDaftar> pasienDaftarList=new ArrayList<PasienDaftar>();
		if(CommonUtil.isNotNullOrEmpty(vo.getPasien()) && CommonUtil.isNotNullOrEmpty(vo.getTglInput())){
			pasienDaftarList=pasienDaftarDao.finByPasienIdAndDate(vo.getPasien().getId(), vo.getTglInput());
		}
		else {
			
		}
		if(CommonUtil.isNotNullOrEmpty(pasienDaftarList)){
			model.setPasienDaftar(pasienDaftarList.get(0));
		}
		
		if(CommonUtil.isNotNullOrEmpty(vo.getDokter())){
			model.setDokter(pegawaiConverter.transferVOToModel(vo.getDokter(), new Pegawai()));
		}
		
		PapInstruksiPerjanjian resultModel=model;
		
		if(CommonUtil.isNotNullOrEmpty(pasienDaftarList)){
			PasienDaftar pasienDaftar =model.getPasienDaftar();				
			pasienDaftar.setStatusSchedule("Selesai");
			pasienDaftarDao.save(pasienDaftar);
			for (Date jadwal : vo.getJadwal()) {
				vo.setTglInput(jadwal);
				vo.setTglPerjanjian(jadwal);
				Map<String,Object> saveAntrianPasienRegistrasi=antrianPasienRegistrasiService.saveAntrianPasienRegFromPerjanjian(resultModel.getPasienDaftar(), vo, resultModel.getRuangan());
				String noReservasi=(String) saveAntrianPasienRegistrasi.get("noReservasi");		
			}
				
		}
		
		if(CommonUtil.isNotNullOrEmpty(resultModel)){
			result.put("noRec", resultModel.getNoRec());
			result.put("tglInput", resultModel.getTglInput());
			if(CommonUtil.isNotNullOrEmpty(resultModel.getPasien().getId())){
				result.put("pasien.noCm", resultModel.getPasien().getNoCm());
			}
		}					
		return result;
	}

	@Override
	public Map<String,Object> updateInstruksiPerjanjian(PapInstruksiPerjanjianVO vo) throws JpaSystemException, ServiceVOException {
		Map<String,Object> result=new HashMap<String,Object>();
		PapInstruksiPerjanjian model=PapInstruksiPerjanjianDao.findOne(vo.getNoRec());
		PapInstruksiPerjanjian resultModel=PapInstruksiPerjanjianDao.save(model);
		if(CommonUtil.isNotNullOrEmpty(resultModel)){
			result.put("noRec", resultModel.getNoRec());
			result.put("tglInput", resultModel.getTglInput());
			result.put("dataFound", true);
			if(CommonUtil.isNotNullOrEmpty(resultModel.getPasien().getId())){
				result.put("pasien.noCm", resultModel.getPasien().getNoCm());
			}
		}else{
			result.put("dataFound", false);
		}
		return result;
	}

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

	@Override
	public Map<String,Object> findByNoCmAndTglInput(String noCm, Date tglInput) {
		Map<String,Object> result=new HashMap<String,Object>();
		PapInstruksiPerjanjian resultModel=PapInstruksiPerjanjianDao.findPapInstruksiPerjanjianByNoCmAndTglInput(noCm, tglInput);
		if(CommonUtil.isNotNullOrEmpty(resultModel)){
			result.put("noRec", resultModel.getNoRec());
			result.put("tglInput", resultModel.getTglInput());
			result.put("dataFound", true);
			if(CommonUtil.isNotNullOrEmpty(resultModel.getPasien().getId())){
				result.put("pasien.noCm", resultModel.getPasien().getNoCm());
				result.put("pasien.namaPasien", resultModel.getPasien().getNamaPasien());
				result.put("pasien.alamat", resultModel.getPasien().getAlamats().iterator().next());
				result.put("pasien.jenisKelamin", resultModel.getPasien().getJenisKelamin().getNamaExternal());
				result.put("pasien.statusPerkawinan", resultModel.getPasien().getStatusPerkawinan().getNamaExternal());
			}
			if(CommonUtil.isNotNullOrEmpty(resultModel.getKasusPenyakit().getId())){
				result.put("kasusPenyakit.namaExternal", resultModel.getKasusPenyakit().getNamaExternal());
			}
		}else{
			result.put("dataFound", false);
		}
		return result;
	}
	
	@Override
	public Map<String, Object> getInformasiPerjanjian(Integer pasienId, Integer ruanganId) {
		PasienInstruksiPerjanjian model=pasienInstruksiPerjanjianDao.checkInstruksiPerjanjian(pasienId, ruanganId);
		Map<String,Object>result=new HashMap<String,Object>();
		if(CommonUtil.isNotNullOrEmpty(model)){
			result.put("dataFound", true);
			//result.put("current",model.getCurrent());
			result.put("jumlahKunjungan",model.getJumlahKunjungan());
		}else{
			result.put("dataFound", false);
			result.put("current",0);
			result.put("jumlahKunjungan",0);
		}
		
		return result;
	}

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

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

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

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

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

	

}
