package com.jasamedika.medifirst2000.service.impl;

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

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

import com.jasamedika.medifirst2000.converter.AlamatConverter;
import com.jasamedika.medifirst2000.converter.HubunganKeluargaConverter;
import com.jasamedika.medifirst2000.converter.JenisAlamatConverter;
import com.jasamedika.medifirst2000.converter.JenisKelaminConverter;
import com.jasamedika.medifirst2000.converter.JenisPengantarPasienConverter;
import com.jasamedika.medifirst2000.dao.AlamatDao;
import com.jasamedika.medifirst2000.dao.PasienDaftarDao;
import com.jasamedika.medifirst2000.dao.PasienDao;
import com.jasamedika.medifirst2000.dao.PegawaiDao;
import com.jasamedika.medifirst2000.dao.PenanggungJawabPasienDao;
import com.jasamedika.medifirst2000.dao.PropinsiDao;
import com.jasamedika.medifirst2000.dao.StrukPelayananPenjaminDao;
import com.jasamedika.medifirst2000.entities.Alamat;
import com.jasamedika.medifirst2000.entities.HubunganKeluarga;
import com.jasamedika.medifirst2000.entities.JenisAlamat;
import com.jasamedika.medifirst2000.entities.JenisKelamin;
import com.jasamedika.medifirst2000.entities.JenisPengantarPasien;
import com.jasamedika.medifirst2000.entities.Pasien;
import com.jasamedika.medifirst2000.entities.PasienDaftar;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.PenanggungJawabPasien;
import com.jasamedika.medifirst2000.entities.Propinsi;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.service.PenanggungJawabPasienService;
import com.jasamedika.medifirst2000.service.StrukPelayananPenjaminService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.PenanggungJawabPasienVO;
import com.jasamedika.medifirst2000.vo.SuratPernyataanVO;


/**
 * Implement class for PasienService
 * 
 * @author Adik
 * @param <T>
 */
@Service("penanggungJawabPasienService")
public class PenanggungJawabPasienServiceImpl extends BaseVoServiceImpl implements PenanggungJawabPasienService {
	
	@Autowired
	private HubunganKeluargaConverter hubunganKeluargaConverter;
	
	@Autowired
	private JenisAlamatConverter jenisAlamatConverter;
	
	@Autowired
	private JenisKelaminConverter jenisKelaminConverter;
	
	@Autowired
	private AlamatConverter alamatConverter;
	
	@Autowired
	private AlamatDao alamatDao;

	@Autowired
	private JenisPengantarPasienConverter jenisPengantarPasienConverter;
	
	@Autowired
	private PenanggungJawabPasienDao penanggungJawabPasienDao;
	
	@Autowired
	private PasienDao pasienDao;
	
	@Autowired
	private PasienDaftarDao pasienDaftarDao;
	
	@Autowired
	private PegawaiDao pegawaiDao;
	
	@Autowired
	private StrukPelayananPenjaminDao strukPelayananPenjaminDao;
	
	@Autowired
	private StrukPelayananPenjaminService strukPelayananPenjaminService;
	
	@Autowired
	private PropinsiDao propinsiDao;
	
	@Override
	@Transactional
	public Map<String,Object> savePenanggungJawabPasien(SuratPernyataanVO vo) {
		Map<String,Object> result = new HashMap<String,Object>();
		
		if (!vo.getListPenanggungJawabPasien().isEmpty()) {
			for (PenanggungJawabPasienVO pj : vo.getListPenanggungJawabPasien()) {
				PenanggungJawabPasien penanggungJawabPasien = new PenanggungJawabPasien();
				
				if(CommonUtil.isNotNullOrEmpty(pj.getPasien())) {
					Pasien pasien = pasienDao.findPasienByNoCm(pj.getPasien().getNoCm());
					if (pasien != null) {
						penanggungJawabPasien.setPasien(pasien);
					} else {
						throw new ServiceVOException("Pasien(NoCM) tidak valid");
					}
				} 
				
				if(CommonUtil.isNotNullOrEmpty(pj.getPasienDaftar())) {
					List<PasienDaftar> listPasienDaftar = pasienDaftarDao.findAll(pj.getPasienDaftar().getNoRegistrasi());
					if (!listPasienDaftar.isEmpty()) {
						penanggungJawabPasien.setPasienDaftar(listPasienDaftar.get(0));
					} else {
						throw new ServiceVOException("Nomor Registrasi" + pj.getPasienDaftar().getNoRegistrasi() + " tidak valid");
					}
				} 
				
				penanggungJawabPasien.setNamaLengkap(pj.getNamaLengkap());
				penanggungJawabPasien.setNoIdentitas(pj.getNoIdentitas());
				penanggungJawabPasien.setTempatLahir(pj.getTempatLahir());
				penanggungJawabPasien.setTglLahir(pj.getTglLahir());
				
				if(CommonUtil.isNotNullOrEmpty(pj.getJenisKelamin())) {
					penanggungJawabPasien.setJenisKelamin(jenisKelaminConverter.transferVOToModel(pj.getJenisKelamin(), new JenisKelamin()));
				}
				
				if(CommonUtil.isNotNullOrEmpty(pj.getJenisPengantarPasien())) {
					penanggungJawabPasien.setJenisPengantarPasien(jenisPengantarPasienConverter.transferVOToModel(pj.getJenisPengantarPasien(), new JenisPengantarPasien()));
				}
				
				// alamat
				if (CommonUtil.isNotNullOrEmpty(pj.getAlamatLengkap())) {
					Alamat alamatLengkap = alamatConverter.transferVOToModel(pj.getAlamatLengkap(), new Alamat());
					
					// desa kelurahan 
					if (CommonUtil.isNotNullOrEmpty(pj.getAlamatLengkap().getNamaDesaKelurahan())) {
						alamatLengkap.setNamaDesaKelurahan(pj.getAlamatLengkap().getNamaDesaKelurahan());
					}
					
					// kecamatan
					if (CommonUtil.isNotNullOrEmpty(pj.getAlamatLengkap().getNamaKecamatan())) {
						alamatLengkap.setNamaKecamatan(pj.getAlamatLengkap().getNamaKecamatan());
					}
					
					// kota kabupaten
					if (CommonUtil.isNotNullOrEmpty(pj.getAlamatLengkap().getNamaKotaKabupaten())) {
						alamatLengkap.setNamaKotaKabupaten(pj.getAlamatLengkap().getNamaKotaKabupaten());
					}
					
					if (CommonUtil.isNotNullOrEmpty(pj.getAlamatLengkap().getPropinsi())) {
						Propinsi propinsi = propinsiDao.findOne(pj.getAlamatLengkap().getPropinsi().getId());
						if (propinsi != null) {
							alamatLengkap.setPropinsi(propinsi);
							alamatLengkap.setPropinsiId(propinsi.getId());
						}
					}
					
					if(CommonUtil.isNotNullOrEmpty(pj.getAlamatLengkap().getHubunganKeluarga())) {
						HubunganKeluarga hubunganKeluarga = hubunganKeluargaConverter.transferVOToModel(pj.getAlamatLengkap().getHubunganKeluarga(), new HubunganKeluarga());
						alamatLengkap.setHubunganKeluarga(hubunganKeluarga);
					}
					if(CommonUtil.isNotNullOrEmpty(pj.getAlamatLengkap().getJenisAlamat())) {
						JenisAlamat jenisAlamat = jenisAlamatConverter.transferVOToModel(pj.getAlamatLengkap().getJenisAlamat(),new JenisAlamat());
						alamatLengkap.setJenisAlamat(jenisAlamat);
					}
					
					alamatDao.save(alamatLengkap);
					penanggungJawabPasien.setAlamatLengkap(alamatLengkap);
				}
				
				if(CommonUtil.isNotNullOrEmpty(pj.getPegawai())) {
					Pegawai pegawai = pegawaiDao.findOne(pj.getPegawai().getId());
					if (pegawai != null) {
						penanggungJawabPasien.setPegawai(pegawai);
					} else {
						throw new ServiceVOException("Pegawai dengan ID " + pj.getPegawai().getId() + " tidak valid");
					}
				}
				
				penanggungJawabPasien.setKeteranganLainnya(pj.getKeteranganLainnya());
				penanggungJawabPasien.setTglPernyataan(pj.getTglPernyataan());
				
				penanggungJawabPasienDao.save(penanggungJawabPasien);
				
				// display information
				if(CommonUtil.isNotNullOrEmpty(penanggungJawabPasien.getNoRec())) {
					if (pj.getKeteranganLainnya().equalsIgnoreCase("PenanggungJawab")) {
						result.put("noRec.penanggungJawab", penanggungJawabPasien.getNoRec());
					} else {
						result.put("noRec.relasiPenanggungJawab", penanggungJawabPasien.getNoRec());
					}
					result.put("noCm", pj.getPasien().getNoCm());
					result.put("noRegistrasi", pj.getPasienDaftar().getNoRegistrasi());
				}
			}
		} else {
			throw new ServiceVOException("List Penanggung Jawab Pasien tidak boleh kosong");
		}
		
		return result;
	}
	
	@Override
	public Map<String, Object> ambilSuratPernyataanPerNoRegistrasi(String noRegistrasi) {
		Map<String,Object> result = new HashMap<>();
		
		List<Map<String,Object>> penanggungJawab = penanggungJawabPasienDao.findByNoRegistrasi(noRegistrasi);
		if (penanggungJawab != null) {
			if (!penanggungJawab.isEmpty()) {
				result.put("penanggungJawab", penanggungJawab);
				
				Map<String, Object> pasien = pasienDaftarDao.findPasienByNoRegistrasi(noRegistrasi);
				if (pasien != null) {
					result.put("pasien", pasien);
					
					String noCm = pasien.get("noCm").toString();
					Map<String, Object> alamat = pasienDaftarDao.findAlamatPasienByNoCm(noCm);
					if (alamat != null) {
						result.put("alamatPasien", alamat);
					} else {
						throw new ServiceVOException("No. Registrasi " + noRegistrasi + " tidak menemukan alamat pasien");
					}
				} else {
					throw new ServiceVOException("No. Registrasi " + noRegistrasi + " tidak memiliki relasi ke pasien");
				}
				
				Map<String, Object> strukPelayanan = strukPelayananPenjaminDao.findOneByNoRegistrasi(noRegistrasi);
				if (strukPelayanan != null) {
					result.put("strukPelayanan", strukPelayanan);
				} else {
					throw new ServiceVOException("No. Registrasi " + noRegistrasi + " belum memiliki struk pelayanan penjamin");
				}
				
				result.put("verifikator", strukPelayananPenjaminService.getVerifikatorList());
			} else {
				throw new ServiceVOException("No. Registrasi " + noRegistrasi + " belum memiliki surat pernyataan/penanggungjawab pasien");
			}
		}
		
		return result;
	}

	@Override
	public List<Map<String, Object>> daftarSuratPernyataan(Pageable pageable) {
		return penanggungJawabPasienDao.findAllSuratPernyataan(pageable);
	} 

}
