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.stereotype.Service;

import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.AntrianPasienDiPeriksaDao;
import com.jasamedika.medifirst2000.dao.OrderPelayananDietDao;
import com.jasamedika.medifirst2000.dao.PapAlergiDao;
import com.jasamedika.medifirst2000.dao.PasienDaftarDao;
import com.jasamedika.medifirst2000.dao.PersetujuanUmumDao;
import com.jasamedika.medifirst2000.dao.RegistrasiPelayananPasienDao;
import com.jasamedika.medifirst2000.entities.AntrianPasienDiPeriksa;
import com.jasamedika.medifirst2000.entities.Kelas;
import com.jasamedika.medifirst2000.entities.KelompokPasien;
import com.jasamedika.medifirst2000.entities.OrderPelayananDiet;
import com.jasamedika.medifirst2000.entities.PasienDaftar;
import com.jasamedika.medifirst2000.entities.PersetujuanUmum;
import com.jasamedika.medifirst2000.entities.RegistrasiPelayananPasien;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.service.PersetujuanUmumService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.DateUtil;
import com.jasamedika.medifirst2000.vo.KelasVO;
import com.jasamedika.medifirst2000.vo.KelompokPasienVO;
import com.jasamedika.medifirst2000.vo.PersetujuanUmumVO;
import com.jasamedika.medifirst2000.vo.RuanganVO;
import com.jasamedika.medifirst2000.dao.RuanganDao;
import com.jasamedika.medifirst2000.dto.EtiketPersetujuanUmum;

/**
 * Implement class for PersetujuanUmumService
 * 
 * @author Generator
 * @param <T>
 */
@Service("persetujuanUmumService")
public class PersetujuanUmumServiceImpl extends BaseVoServiceImpl implements PersetujuanUmumService {
	@Autowired
	private BaseConverterImpl<PersetujuanUmumVO, PersetujuanUmum> persetujuanUmumConverter;
	@Autowired
	private BaseConverterImpl<RuanganVO, Ruangan> ruanganConverter;

	@Autowired
	private BaseConverterImpl<KelasVO, Kelas> kelasConverter;

	@Autowired
	private BaseConverterImpl<KelompokPasienVO, KelompokPasien> kelompokPasienConverter;

	@Autowired
	private PersetujuanUmumDao persetujuanUmumDao;

	@Autowired
	private PasienDaftarDao pasienDaftarDao;
	@Autowired
	private PapAlergiDao papAlergiDao;
	@Autowired
	private RuanganDao ruanganDao;
	@Autowired
	private RegistrasiPelayananPasienDao registrasiPelayananPasienDao;
	@Autowired
	private OrderPelayananDietDao orderPelayananDietDao;
	@Autowired
	private AntrianPasienDiPeriksaDao antrianPasienDiPeriksaDao;
	@Override
	
	public Map<String, Object> savePersetujuanUmum(PersetujuanUmumVO vo) {
		Map<String, Object> result = new HashMap<String, Object>();
		PersetujuanUmum model = new PersetujuanUmum();
		List<AntrianPasienDiPeriksa> list = antrianPasienDiPeriksaDao.finByNoIdAndTglRegistrasiList(Short.parseShort("0"), vo.getPasien().getId(),
				vo.getTglRegistrasi());
		AntrianPasienDiPeriksa listPasien = new AntrianPasienDiPeriksa();
		if (CommonUtil.isNotNullOrEmpty(list)){
			listPasien = list.get(0);
		}
		model.setPasien(listPasien);
		//Shakato 05082016
		if (CommonUtil.isNotNullOrEmpty(vo.getRuanganTujuan())) {
			model.setRuanganTujuan(ruanganConverter.transferVOToModel(vo.getRuanganTujuan(), new Ruangan()));
		}
		else
		{
			
			model.setRuanganTujuan(model.getPasien().getRuangan());
			if(model.getRuanganTujuan()==null)
			{
				model.setRuanganTujuan( ruanganDao.findById(Integer.parseInt(GetSettingDataFixed("KdRuanganLaboratorium"))));	
			}
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getKelasPerawatan())) {
			model.setKelasPerawatan(kelasConverter.transferVOToModel(vo.getKelasPerawatan(), new Kelas()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getJenisPembayaran())) {
			model.setJenisPembayaran(
					kelompokPasienConverter.transferVOToModel(vo.getJenisPembayaran(), new KelompokPasien()));
		}

		PersetujuanUmum resultDomain = persetujuanUmumDao.save(model);
		if (CommonUtil.isNotNullOrEmpty(resultDomain)) {
			result.put("noRec", resultDomain.getNoRec());
		}

		return result;
	}

	@Override
	public void updateStatusRegistrasi(PersetujuanUmumVO persetujuanUmum) {
		PersetujuanUmum model = persetujuanUmumDao.findOne(persetujuanUmum.getNoRec());
		model.setStatusRegistrasi(true);
		persetujuanUmumDao.save(model);
	}

	@Override
	public List <EtiketPersetujuanUmum> findEtiket(String noCm, String tglRegistrasi) {
		Date tgl = new Date();
		EtiketPersetujuanUmum etiketPersetujuanUmum = new EtiketPersetujuanUmum();
		List<Object[]> alergi = papAlergiDao.findPapAlergiByNoCm(noCm);
		/*
		List<Object[]> persetujuanUmum = persetujuanUmumDao.findPersetujuanUmum(noCm, tglRegistrasi);	
		for(Object[] data: persetujuanUmum)
		{
			etiketPersetujuanUmum.setRuangan(((String)data[0]));
			etiketPersetujuanUmum.setJenisKelamin(((String)data[1]));
			etiketPersetujuanUmum.setNama(((String)data[2]));
			etiketPersetujuanUmum.setTglLahir(((String)data[3]));
			if(CommonUtil.isNotNullOrEmpty(((Byte)data[4])))
			{
				etiketPersetujuanUmum.setBed(((Byte)data[4])+" ");
			}
			Byte i = 3;
			System.out.println(i.toString());
		}
		*/
		Map<String,Object> map=persetujuanUmumDao.findPasienByNoCm(noCm);
		String namaPasien=(String) map.get("namaPasien");
		Date tglLahir=(Date) map.get("tglLahir");
		String jenisKelamin=(String) map.get("jenisKelamin");
		etiketPersetujuanUmum.setNama(namaPasien);
		etiketPersetujuanUmum.setTglLahir(DateUtil.formatDate(tglLahir));
		etiketPersetujuanUmum.setJenisKelamin(jenisKelamin);
		etiketPersetujuanUmum.setBed("");
		etiketPersetujuanUmum.setRuangan("");
		String namaAlergi="";
		for(Object[] data : alergi)
		{
			namaAlergi = ((String)data[3]);
		}
		etiketPersetujuanUmum.setAlergi(namaAlergi);
		if (CommonUtil.isNotNullOrEmpty(tglRegistrasi)) {
			tgl = DateUtil.toDate(tglRegistrasi);
		}
		
		OrderPelayananDiet orderPelayananDiet = orderPelayananDietDao.finByNoCmTglRegistrasi(noCm, tgl);
		
		if(CommonUtil.isNotNullOrEmpty(orderPelayananDiet))
		{
			etiketPersetujuanUmum.setOrderPelayananDiet(orderPelayananDiet);
		}		
		List<EtiketPersetujuanUmum> list = new ArrayList<EtiketPersetujuanUmum>();
		list.add(etiketPersetujuanUmum);
		return list;
	}
}