package com.jasamedika.medifirst2000.service.impl;

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.DokumenRekamMedisDao;
import com.jasamedika.medifirst2000.dao.KelompokTransaksiDao;
import com.jasamedika.medifirst2000.dao.RuanganDao;
import com.jasamedika.medifirst2000.dao.RunningNumberDao;
import com.jasamedika.medifirst2000.dao.StrukKirimDao;
import com.jasamedika.medifirst2000.dao.StrukPelayananDao;
import com.jasamedika.medifirst2000.dao.custom.KirimDokumenPasienDaoCustom;
import com.jasamedika.medifirst2000.entities.AntrianPasienDiPeriksa;
import com.jasamedika.medifirst2000.entities.Dokumen;
import com.jasamedika.medifirst2000.entities.DokumenRekamMedis;
import com.jasamedika.medifirst2000.entities.KelompokTransaksi;
import com.jasamedika.medifirst2000.entities.LoginUser;
import com.jasamedika.medifirst2000.entities.MappingKirimDokumenPasien;
import com.jasamedika.medifirst2000.entities.Pasien;
import com.jasamedika.medifirst2000.entities.PasienDaftar;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.entities.RunningNumber;
import com.jasamedika.medifirst2000.entities.StrukKirim;
import com.jasamedika.medifirst2000.entities.StrukPelayanan;
import com.jasamedika.medifirst2000.service.KirimDokumenPasienService;
import com.jasamedika.medifirst2000.service.LoginUserService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.DateUtil;
import com.jasamedika.medifirst2000.util.StringUtil;
import com.jasamedika.medifirst2000.vo.AntrianPasienDiPeriksaVO;
import com.jasamedika.medifirst2000.vo.DokumenRekamMedisVO;
import com.jasamedika.medifirst2000.vo.DokumenVO;
import com.jasamedika.medifirst2000.vo.MappingKirimDokumenPasienVO;
import com.jasamedika.medifirst2000.vo.PasienDaftarVO;
import com.jasamedika.medifirst2000.vo.PasienVO;
import com.jasamedika.medifirst2000.vo.RuanganVO;
import com.jasamedika.medifirst2000.vo.StrukKirimVO;
import com.jasamedika.medifirst2000.vo.StrukPelayananVO;

@Service("KirimDokumenPasienService")
public class KirimDokumenPasienServiceImpl extends BaseVoServiceImpl implements KirimDokumenPasienService {

	@Autowired
	private StrukKirimDao daoStrukKirim;

	@Autowired
	private DokumenRekamMedisDao daoDokumen;

	@Autowired
	private RunningNumberDao runningNumberDao;

	@Autowired
	private KelompokTransaksiDao kelompokTransaksiDao;

	@Autowired
	private StrukPelayananDao daoStrukPelayanan;

	@Autowired
	private KirimDokumenPasienDaoCustom daoCustom;

	@Autowired
	private RuanganDao daoRuangan;

	@Autowired
	private BaseConverterImpl<StrukKirimVO, StrukKirim> strukKirimConverter;

	@Autowired
	private BaseConverterImpl<DokumenRekamMedisVO, DokumenRekamMedis> dokumenRekamMedisConverter;

	@Autowired
	private BaseConverterImpl<MappingKirimDokumenPasienVO, MappingKirimDokumenPasien> mappingKirimDokumenPasienConverter;

	@Autowired
	private BaseConverterImpl<RuanganVO, Ruangan> ruanganConverter;

	@Autowired
	private BaseConverterImpl<PasienVO, Pasien> pasienConveter;

	@Autowired
	private BaseConverterImpl<DokumenVO, Dokumen> dokumenConveter;

	@Autowired
	private BaseConverterImpl<StrukPelayananVO, StrukPelayanan> strukPelayananConverter;

	// @Autowired
	// private BaseConverterImpl<PegawaiVO, Pegawai> pegawaiConveter;

	@Autowired
	private BaseConverterImpl<PasienDaftarVO, PasienDaftar> pasienDaftarConveter;

	@Autowired
	private BaseConverterImpl<AntrianPasienDiPeriksaVO, AntrianPasienDiPeriksa> pasienDiPeriksaConverter;

	@Autowired
	private LoginUserService loginUserService;

	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 Map<String, Object> saveKirimDokumenPasien(MappingKirimDokumenPasienVO vo) {
		Map<String, Object> result = new HashMap<String, Object>();
		try {
			System.out.println("=======START SAVE KIRIM DOKUMEN PASIEN=======");

			if (CommonUtil.isNotNullOrEmpty(vo.getStrukKirim())) {
				Ruangan kdRuanganAsal = new Ruangan();
				kdRuanganAsal.setId(loginUserService.getLoginUser().getPegawai().getRuangan().getId());
				
				if (CommonUtil.isNotNullOrEmpty(vo.getDokumenRekamMedis())) {
					DokumenRekamMedis dokumenRekamMedis = dokumenRekamMedisConverter.transferVOToModel(vo.getDokumenRekamMedis(), new DokumenRekamMedis());

					if(CommonUtil.isNotNullOrEmpty(vo.getDokumenRekamMedis().getRuanganTujuan())) {
						dokumenRekamMedis.setRuanganTujuan(ruanganConverter.transferVOToModel(vo.getDokumenRekamMedis().getRuanganTujuan(), new Ruangan()));
					}
					if(CommonUtil.isNotNullOrEmpty(kdRuanganAsal)) {
						dokumenRekamMedis.setRuanganAsal(kdRuanganAsal);
						dokumenRekamMedis.setStatus("Dokumen Terkirim");
					}
					if(CommonUtil.isNotNullOrEmpty(vo.getDokumenRekamMedis().getMapKirimDokumenPasien())) {
						Set<MappingKirimDokumenPasien> list = new HashSet<MappingKirimDokumenPasien>();
						
						for (MappingKirimDokumenPasienVO modelDokRekamMedis : vo.getDokumenRekamMedis().getMapKirimDokumenPasien()) {
							Ruangan ruanganTujuan = ruanganConverter.transferVOToModel(modelDokRekamMedis.getRuanganTujuan(), new Ruangan());
							
							StrukKirim strukKirim = strukKirimConverter.transferVOToModel(vo.getStrukKirim(), new StrukKirim());
							String noKirim = "DRM" + getRunningNumber("KRIM");
							strukKirim.setTglkirim(DateUtil.getShortDate());
							strukKirim.setNokirim(noKirim);
							strukKirim.setKeteranganlainnyakirim("Pengiriman Dokumen Rekam Medis");
							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.setKdruangan(kdRuanganAsal);
							strukKirim.setKdruanganasal(kdRuanganAsal);
							strukKirim.setKdruangantujuan(ruanganTujuan);
							
							//----------------------------------------------------------------------------------------------------
							KelompokTransaksi kelompokTransaksi = new KelompokTransaksi();
							kelompokTransaksi.setId(Integer.parseInt(GetSettingDataFixed("KdKelompokTransaksiDokumenRekamMedis")));
							
							strukKirim.setKelompokTransaksi(kelompokTransaksi);
							StrukKirim resultStrukKirim = daoStrukKirim.save(strukKirim);
							//-----------------------------------------------------------------------------------------------------
							
							MappingKirimDokumenPasien mapDokRekamPasien = new MappingKirimDokumenPasien();
							if(CommonUtil.isNotNullOrEmpty(resultStrukKirim)) {
								mapDokRekamPasien = mappingKirimDokumenPasienConverter.transferVOToModel(modelDokRekamMedis, new MappingKirimDokumenPasien());
								
								if(CommonUtil.isNotNullOrEmpty(resultStrukKirim)) {
									mapDokRekamPasien.setStrukKirim(resultStrukKirim);
								}
								if(CommonUtil.isNotNullOrEmpty(dokumenRekamMedis)) {
									mapDokRekamPasien.setDokumenRekamMedis(dokumenRekamMedis);
								}
								if(CommonUtil.isNotNullOrEmpty(kdRuanganAsal)) {
									mapDokRekamPasien.setKdruangantujuanlast(kdRuanganAsal);
								}
								if(CommonUtil.isNotNullOrEmpty(ruanganTujuan)) {
									mapDokRekamPasien.setRuanganTujuan(ruanganTujuan);
								}
								if(CommonUtil.isNotNullOrEmpty(modelDokRekamMedis.getPasien())) {
									mapDokRekamPasien.setPasien(pasienConveter.transferVOToModel(modelDokRekamMedis.getPasien(), new Pasien()));
								}
								if(CommonUtil.isNotNullOrEmpty(modelDokRekamMedis.getDokumen())) {
									mapDokRekamPasien.setDokumen(dokumenConveter.transferVOToModel(modelDokRekamMedis.getDokumen(), new Dokumen()));
								}
								if(CommonUtil.isNotNullOrEmpty(modelDokRekamMedis.getPasienDaftar())) {
									mapDokRekamPasien.setPasienDaftar(pasienDaftarConveter.transferVOToModel(modelDokRekamMedis.getPasienDaftar(), new PasienDaftar()));
								}
							}
							
							if(CommonUtil.isNotNullOrEmpty(mapDokRekamPasien)) {
								list.add(mapDokRekamPasien);
							}
						}
						if(CommonUtil.isNotNullOrEmpty(list)) {
							dokumenRekamMedis.setMapKirimDokumenPasien(list);
						}
					}
					if(CommonUtil.isNotNullOrEmpty(dokumenRekamMedis)) {
						DokumenRekamMedis resultDokumen = daoDokumen.save(dokumenRekamMedis);
						result.put("noRecDokumenRekamMedis", resultDokumen.getNoRec());
					}
				}
			}
			System.out.println("=======END SAVE KIRIM DOKUMEN PASIEN=======");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	@Override
	@Transactional(readOnly = false)
	public Map<String, Object> saveTerimaDokumenPasien(MappingKirimDokumenPasienVO vo, String noRec) {

		Map<String, Object> result = new HashMap<String, Object>();

		try {
			System.out.println("=======SAVE TERIMA DOKUMEN PASIEN=======");

			List<DokumenRekamMedis> list = daoDokumen.findDokumenTerkirim();

			StrukPelayanan strukPelayanan = strukPelayananConverter.transferVOToModel(vo.getStrukPelayanan(),
					new StrukPelayanan());

			DokumenRekamMedis dokumenRekamMedis = dokumenRekamMedisConverter
					.transferVOToModel(vo.getDokumenRekamMedis(), new DokumenRekamMedis());

			strukPelayanan.setKdkelompoktransaksi(kelompokTransaksiDao.findById(
					Integer.parseInt((String) this.GetSettingDataFixed("KdKelompokTransaksiDokumenRekamMedis"))));
			strukPelayanan.setNostruk(getRunningNumber("DokumenRekamMedis"));
			strukPelayanan.setTglstruk(DateUtil.getShortDate());
			strukPelayanan.setTglterimakiriman(DateUtil.getShortDate());

			if (CommonUtil.isNotNullOrEmpty(loginUserService.getLoginUser())) {
				strukPelayanan.setKdpegawaipenerima(loginUserService.getLoginUser().getPegawai());
			}

			for (DokumenRekamMedis dok : list) {
				dokumenRekamMedis.setNoRec(dok.getNoRec());
				dokumenRekamMedis.setNoKirim(dok.getNoKirim());
				dokumenRekamMedis.setNoTerima(strukPelayanan);
				dokumenRekamMedis.setRuanganAsal(dok.getRuanganAsal());
				dokumenRekamMedis.setRuanganTujuan(dok.getRuanganTujuan());
				dokumenRekamMedis.setStatus("Sukses DiTerima");
			}

			StrukPelayanan resultStrukPelayanan = daoStrukPelayanan.save(strukPelayanan);
			result.put("noRecStrukPelayanan", resultStrukPelayanan.getNoRec());

			DokumenRekamMedis resultDokRekamMedis = daoDokumen.save(dokumenRekamMedis);
			result.put("noRecDokRekamMedis", resultDokRekamMedis.getNoRec());

			System.out.println("=======END SAVE TERIMA DOKUMEN PASIEN=======");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;

	}

	@Override
	public Ruangan getRuanganByUserLogin() {

		LoginUser loginUser = loginUserService.getLoginUser();
		Ruangan r = new Ruangan();
		if (CommonUtil.isNotNullOrEmpty(loginUser.getPegawai())) {
			if (CommonUtil.isNotNullOrEmpty(loginUser.getPegawai().getRuangan())) {
				r = loginUser.getPegawai().getRuangan();
			}
		}
		return r;
	}

	@Override
	public LoginUser getLoginUser() {
		LoginUser loginUser = loginUserService.getLoginUser();
		return loginUser;
	}

	@Override
	public List<Integer> getRuanganByUserLoginList() {
		List<Integer> listUser = daoRuangan.getRuanganByUserLogin(getLoginUser().getId());
		return listUser;
	}

	@Override
	public Map<String, Object> getDaftarDokumenRekamMedisPasien(Integer page, Integer limit, String sort, String dir,
			String dateStartMasuk, String dateEndMasuk, String dateStartPulang, String dateEndPulang,
			String ruanganPelayanan, Integer idRuangan, Integer idPasien, String namaPasien, String noCm,
			String ruanganPasien) {

		Map<String, Object> result = new HashMap<String, Object>();
		try {
			System.out.println("=======START GET DAFTAR DOKUMEN REKAM MEDIS PASIEN=======");
			result.put("result",
					daoCustom.getDaftarDokumenRekamMedisPasien(sort, dir, dateStartMasuk, dateEndMasuk, dateStartPulang,
							dateEndPulang, ruanganPelayanan, idRuangan, idPasien, namaPasien, noCm, ruanganPasien));
			System.out.println("=======END GET DAFTAR DOKUMEN REKAM MEDIS PASIEN=======");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}
	
	@Override
	public Map<String, Object> getDaftarDokumenRekamMedisPasienTerima(Integer page, Integer limit, String sort, String dir,
			String dateStartMasuk, String dateEndMasuk, String dateStartPulang, String dateEndPulang,
			String ruanganPelayanan, Integer idRuangan, Integer idPasien, String namaPasien, String noCm,
			String ruanganPasien) {

		Map<String, Object> result = new HashMap<String, Object>();
		try {
			System.out.println("=======START GET DAFTAR DOKUMEN REKAM MEDIS PASIEN=======");
			List<Map<String, Object>> listDokumen = daoCustom.getDaftarDokumenRekamMedisPasienTerima(sort, dir, dateStartMasuk, dateEndMasuk, dateStartPulang,
					dateEndPulang, ruanganPelayanan, idRuangan, idPasien, namaPasien, noCm, ruanganPasien);
			result.put("result",listDokumen);
			System.out.println("=======END GET DAFTAR DOKUMEN REKAM MEDIS PASIEN=======");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}
	

	@Override
	public Map<String, Object> saveKirimBalikDokumenPasien(MappingKirimDokumenPasienVO vo, String noRec) {
		return null;
	}

	@Override
	public Map<String, Object> getDaftarKirimDokumenRekamMedisPasien(Integer page, Integer limit, String sort,
			String dir, String dateStartMasuk, String dateEndMasuk, String dateStartPulang, String dateEndPulang,
			String dateStartKirim, String dateEndKirim, String ruanganPelayanan, String ruanganAsal, Integer idRuangan,
			Integer idPasien, String namaPasien, String noCm, String ruanganPasien) {

		Map<String, Object> result = new HashMap<String, Object>();
		try {
			System.out.println("=======START GET DAFTAR KIRIM DOKUMEN REKAM MEDIS PASIEN=======");
			result.put("result",
					daoCustom.getDaftarKirimDokumenRekamMedisPasien(sort, dir, dateStartMasuk, dateEndMasuk,
							dateStartPulang, dateEndPulang, dateStartKirim, dateEndKirim, ruanganPelayanan, ruanganAsal,
							idRuangan, idPasien, namaPasien, noCm, ruanganPasien));
			System.out.println("=======END GET DAFTAR KIRIM DOKUMEN REKAM MEDIS PASIEN=======");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

}
