package com.jasamedika.medifirst2000.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;

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.vo.PasienVO;
import com.jasamedika.medifirst2000.vo.StrukKirimVO;
import com.jasamedika.medifirst2000.vo.StrukPelayananVO;
import com.jasamedika.medifirst2000.vo.DokumenVO;
import com.jasamedika.medifirst2000.vo.MappingKirimDokumenPasienVO;
import com.jasamedika.medifirst2000.vo.RuanganVO;

import com.jasamedika.medifirst2000.entities.Pasien;
import com.jasamedika.medifirst2000.entities.PasienDaftar;
import com.jasamedika.medifirst2000.entities.StrukKirim;
import com.jasamedika.medifirst2000.entities.StrukPelayanan;
import com.jasamedika.medifirst2000.entities.Dokumen;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.entities.RunningNumber;
import com.jasamedika.medifirst2000.entities.SatuanWaktuKesling;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.DokumenRekamMedisService;
import com.jasamedika.medifirst2000.service.LoginUserService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.StringUtil;
import com.jasamedika.medifirst2000.entities.DokumenRekamMedis;
import com.jasamedika.medifirst2000.entities.JenisLimbahB3Masuk;
import com.jasamedika.medifirst2000.entities.KelompokTransaksi;
import com.jasamedika.medifirst2000.entities.MappingKirimDokumenPasien;
import com.jasamedika.medifirst2000.vo.DokumenRekamMedisVO;
import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.DokumenRekamMedisDao;
import com.jasamedika.medifirst2000.dao.KelompokTransaksiDao;
import com.jasamedika.medifirst2000.dao.MappingKirimDokumenPasienDao;
import com.jasamedika.medifirst2000.dao.PasienDaftarDao;
import com.jasamedika.medifirst2000.dao.RunningNumberDao;
import com.jasamedika.medifirst2000.dao.StrukKirimDao;
import com.jasamedika.medifirst2000.dao.StrukPelayananDao;

/**
 * Implement class for DokumenRekamMedisService
 * 
 * @author Generator
 * @param <T>
 */
@Service("dokumenRekamMedisService")
public class DokumenRekamMedisServiceImpl extends BaseVoServiceImpl implements DokumenRekamMedisService {
	@Autowired
	private BaseConverterImpl<DokumenRekamMedisVO, DokumenRekamMedis> dokumenRekamMedisConverter;
	@Autowired
	private BaseConverterImpl<PasienVO, Pasien> pasienConverter;
	
	@Autowired
	private BaseConverterImpl<MappingKirimDokumenPasienVO, MappingKirimDokumenPasien> mappingKirimDokumenPasienConverter;

	@Autowired
	private BaseConverterImpl<StrukKirimVO, StrukKirim> strukKirimConverter;

	@Autowired
	private BaseConverterImpl<StrukPelayananVO, StrukPelayanan> strukPelayananConverter;

	@Autowired
	private BaseConverterImpl<DokumenVO, Dokumen> dokumenConverter;

	@Autowired
	private BaseConverterImpl<RuanganVO, Ruangan> ruanganConverter;

	@Autowired
	private DokumenRekamMedisDao dokumenRekamMedisDao;
	
	@Autowired
	private PasienDaftarDao pasienDaftarDao;

	@Override
	public Map<String, Object> saveDokumenRekamMedis(DokumenRekamMedisVO vo) {
		Map<String, Object> result = new HashMap<String, Object>();
		DokumenRekamMedis model = new DokumenRekamMedis();
		model = dokumenRekamMedisConverter.transferVOToModel(vo, model);
		Set<MappingKirimDokumenPasien> setMappingKirimDokumenPasien = new HashSet<MappingKirimDokumenPasien>();
		if (CommonUtil.isNotNullOrEmpty(vo.getNoCM())) {
			model.setNoCM(pasienConverter.transferVOToModel(vo.getNoCM(), new Pasien()));
		}		
		
		if (CommonUtil.isNotNullOrEmpty(vo.getNoTerima())) {
			model.setNoTerima(strukPelayananConverter.transferVOToModel(vo.getNoTerima(), new StrukPelayanan()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getNoDokumen())) {
			model.setNoDokumen(dokumenConverter.transferVOToModel(vo.getNoDokumen(), new Dokumen()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getRuanganTujuan())) {
			model.setRuanganTujuan(ruanganConverter.transferVOToModel(vo.getRuanganTujuan(), new Ruangan()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getRuanganAsal())) {
			model.setRuanganAsal(ruanganConverter.transferVOToModel(vo.getRuanganAsal(), new Ruangan()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getNoKirim())) {
			model.setNoKirim(strukKirimConverter.transferVOToModel(vo.getNoKirim(), new StrukKirim()));			
			MappingKirimDokumenPasien mapDokRekamPasien = new MappingKirimDokumenPasien();
			if(CommonUtil.isNotNullOrEmpty(model.getNoKirim())) {
				mapDokRekamPasien.setStrukKirim(model.getNoKirim());
			}
			if(CommonUtil.isNotNullOrEmpty(model)) {
				mapDokRekamPasien.setDokumenRekamMedis(model);
			}
			if(CommonUtil.isNotNullOrEmpty(model.getRuanganAsal())) {
				mapDokRekamPasien.setKdruangantujuanlast(model.getRuanganAsal());
			}
			if(CommonUtil.isNotNullOrEmpty(model.getRuanganTujuan())) {
				mapDokRekamPasien.setRuanganTujuan(model.getRuanganTujuan());
			}
			if(CommonUtil.isNotNullOrEmpty(model.getNoCM())) {
				mapDokRekamPasien.setPasien(model.getNoCM());
			}
			if(CommonUtil.isNotNullOrEmpty(model.getNoDokumen())) {
				mapDokRekamPasien.setDokumen(model.getNoDokumen());
			}
			if(CommonUtil.isNotNullOrEmpty(vo.getNoRecPasienDaftar())) {
				PasienDaftar pasienDaftar = pasienDaftarDao.findByNoRec(vo.getNoRecPasienDaftar());
				mapDokRekamPasien.setPasienDaftar(pasienDaftar);
			}
			setMappingKirimDokumenPasien.add(mapDokRekamPasien);
		}
		model.setMapKirimDokumenPasien(setMappingKirimDokumenPasien);
		DokumenRekamMedis resultDomain = dokumenRekamMedisDao.save(model);
		if (CommonUtil.isNotNullOrEmpty(resultDomain)) {
			result.put("noRec", resultDomain.getNoRec());
			System.out.println(resultDomain.getNoRec());
		}

		return result;
	}
	@Autowired
	private LoginUserService loginUserService;
	@Override
	public List<DokumenRekamMedis> getByRuangan(Integer idRuangan, Date startDate, Date untilDate,String namaPasien) {
		return dokumenRekamMedisDao.findByRuanganTujuanIdOrRuanganAsalId(idRuangan,startDate,untilDate,namaPasien);
	}
@Autowired
private KelompokTransaksiDao kelompokTransaksiDao;

@Autowired
private RunningNumberDao runningNumberDao;
@Autowired
private StrukPelayananDao strukPelayananDao;

@Autowired
private MappingKirimDokumenPasienDao mappingKirimDokumenPasienDao;

private String getRunningNumber(String kegunaan) {
	RunningNumber runningNumber = runningNumberDao.findByResetAndKegunaan("0", kegunaan);
	if(runningNumber==null)
	{
		runningNumber = new RunningNumber();
		runningNumber.setKegunaan(kegunaan);
		runningNumber.setReset("0");
		runningNumber.setNomerTerbaru((Integer)0);
	}
	Integer number=(runningNumber.getNomerTerbaru()+(Integer)1);
	runningNumber.setNomerTerbaru(runningNumber.getNomerTerbaru()+(Integer)1);
	String noOrderIntern = StringUtil.formatNumber(number.toString(), 7);
	return noOrderIntern;
}
	@Override
	@Transactional(readOnly=false)
	public List<MappingKirimDokumenPasien> terimaDokumen(String[] dokumens) {
		List<MappingKirimDokumenPasien> list = new ArrayList<>();
		StrukPelayanan strukPelayananDetail = new StrukPelayanan();
		strukPelayananConverter.setUseGson(true);
		
		strukPelayananDetail.setKdkelompoktransaksi(kelompokTransaksiDao.findById(Integer.parseInt((String) this.GetSettingDataFixed("KdKelompokTransaksiDokumenRekamMedis"))));
	
		Ruangan kdruangan = new Ruangan();	
		strukPelayananDetail.setNostruk(getRunningNumber("DokumenRekamMedis"));		
		kdruangan.setId(loginUserService.getLoginUser().getPegawai().getRuangan().getId());
		strukPelayananDetail.setKdruangan(kdruangan);
		Ruangan kdruanganasal = new Ruangan();
		kdruanganasal.setId(loginUserService.getLoginUser().getPegawai().getRuangan().getId());
		strukPelayananDetail.setKdruanganasal(kdruanganasal);
		if(CommonUtil.isNotNullOrEmpty(loginUserService.getLoginUser())){
			strukPelayananDetail.setKdpegawaipenerima(loginUserService.getLoginUser().getPegawai());
		}
		strukPelayananDetail=	strukPelayananDao.save(strukPelayananDetail);
		for (String string : dokumens) {
			
			MappingKirimDokumenPasien mappingKirimDokumenPasien = mappingKirimDokumenPasienDao.findOne(string);
			//DokumenRekamMedis dokumen =dokumenRekamMedisDao.findOne(string);
			mappingKirimDokumenPasien.setStatus("Dokumen telah diterima oleh "+loginUserService.getLoginUser().getPegawai().getNamaLengkap());
			mappingKirimDokumenPasien.setNoTerima(strukPelayananDetail);
			mappingKirimDokumenPasienDao.save(mappingKirimDokumenPasien);
			list.add(mappingKirimDokumenPasien);
		}
		return list;
	}
	
	@Override
	@Transactional(readOnly=false)
	public Map<String, Object> kirimDokumen(List<DokumenRekamMedisVO> dokumens) {
		dokumenRekamMedisConverter.setUseGson(true);
		for (DokumenRekamMedisVO dokumenRekamMedisVO : dokumens) {
			RuanganVO asal = dokumenRekamMedisVO.getRuanganAsal();
			RuanganVO tujuan = dokumenRekamMedisVO.getRuanganTujuan();
			dokumenRekamMedisVO.setRuanganAsal(tujuan);
			dokumenRekamMedisVO.setRuanganTujuan(asal);
			
			StrukKirim strukKirim = new StrukKirim();
			String noKirim = "DRM" + getRunningNumber("KRIM");

			strukKirim.setNokirim(noKirim);

			strukKirim.setNokirim_intern(noKirim);
			strukKirim.setTglkirim(new Date());
			strukKirim.setQtydetailjenisproduk(0.0);
			strukKirim.setQtyproduk(0.0);
			strukKirim.setTotalbeamaterai(0.0);
			strukKirim.setTotalhargasatuan(0.0);
			strukKirim.setTotalbiayakirim(0.0);
			strukKirim.setTotalbiayatambahan(0.0);
			strukKirim.setTotaldiscount(0.0);
			strukKirim.setTotalharusdibayar(0.0);
			strukKirim.setTotalpph(0.0);
			strukKirim.setTotalppn(0.0);
			strukKirim.setPegawaiPengirim(loginUserService.getLoginUser().getPegawai());

			strukKirim.setKeteranganlainnyakirim("Pengiriman dokumen rekammedis");
			KelompokTransaksi kelompokTransaksi = new KelompokTransaksi();
			kelompokTransaksi.setId(Integer.parseInt(GetSettingDataFixed("KdKelompokTransaksiDokumenRekamMedis")));
			strukKirim.setKelompokTransaksi(kelompokTransaksi);

			strukKirim.setKdruanganasal(ruanganConverter.transferVOToModel(asal, new Ruangan()));

			
			strukKirim = strukKirimDao.save(strukKirim);
			dokumenRekamMedisVO.setNoKirim(strukKirimConverter.transferModelToVO(strukKirim, new StrukKirimVO()));
			dokumenRekamMedisVO.setNoRec(null);
			dokumenRekamMedisVO.setNoTerima(null);
			dokumenRekamMedisVO.setStatus("Belum diterima ruangan tujuan");
			saveDokumenRekamMedis(dokumenRekamMedisVO);
		}
		return null;
	}
	
	

	@Autowired
	private StrukKirimDao strukKirimDao;
	
	
	
}