package com.jasamedika.medifirst2000.service.impl;

import java.util.ArrayList;
import java.util.Calendar;
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 org.springframework.transaction.annotation.Transactional;

import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.converter.PegawaiConverter;
import com.jasamedika.medifirst2000.dao.DokumenDao;
import com.jasamedika.medifirst2000.dao.DokumenInternalDao;
import com.jasamedika.medifirst2000.dao.DokumenKeluarDao;
import com.jasamedika.medifirst2000.dao.RunningNumberDao;
import com.jasamedika.medifirst2000.dao.StrukKirimDao;
import com.jasamedika.medifirst2000.entities.Dokumen;
import com.jasamedika.medifirst2000.entities.DokumenInternal;
import com.jasamedika.medifirst2000.entities.DokumenKeluar;
import com.jasamedika.medifirst2000.entities.JenisArsip;
import com.jasamedika.medifirst2000.entities.JenisDokumen;
import com.jasamedika.medifirst2000.entities.JenisSurat;
import com.jasamedika.medifirst2000.entities.KlasifikasiArsip;
import com.jasamedika.medifirst2000.entities.KonseptorPemeriksaSurat;
import com.jasamedika.medifirst2000.entities.MetodeKirim;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.entities.RunningNumber;
import com.jasamedika.medifirst2000.entities.SifatSurat;
import com.jasamedika.medifirst2000.entities.StatusBerkas;
import com.jasamedika.medifirst2000.entities.StrukKirim;
import com.jasamedika.medifirst2000.entities.SubKlasifikasiArsip;
import com.jasamedika.medifirst2000.entities.TipePengirimSurat;
import com.jasamedika.medifirst2000.service.DokumenKeluarService;
import com.jasamedika.medifirst2000.service.LoginUserService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.StringUtil;
import com.jasamedika.medifirst2000.vo.DokumenKeluarVO;
import com.jasamedika.medifirst2000.vo.JenisArsipVO;
import com.jasamedika.medifirst2000.vo.JenisSuratVO;
import com.jasamedika.medifirst2000.vo.KlasifikasiArsipVO;
import com.jasamedika.medifirst2000.vo.MetodeKirimVO;
import com.jasamedika.medifirst2000.vo.PegawaiVO;
import com.jasamedika.medifirst2000.vo.SifatSuratVO;
import com.jasamedika.medifirst2000.vo.StatusBerkasVO;
import com.jasamedika.medifirst2000.vo.SubKlasifikasiArsipVO;
import com.jasamedika.medifirst2000.vo.SuratKeluarVO;

@Service("DokumenKeluarService")
public class DokumenKeluarServiceImpl extends BaseVoServiceImpl implements DokumenKeluarService {
	
	@Autowired
	private DokumenKeluarDao dokumenKeluarDao;
	
	@Autowired
	private StrukKirimDao strukKirimDao;
	
	@Autowired
	private DokumenInternalDao dokumenInternalDao;
	
	@Autowired
	private DokumenDao dokumenDao;
	
	@Autowired
	private RunningNumberDao runningNumberDao;
	
	@Autowired
	private LoginUserService loginUserService;
	
	@Autowired
	private BaseConverterImpl<SifatSuratVO, SifatSurat> sifatSuratConverter;
	
	@Autowired
	private BaseConverterImpl<JenisArsipVO, JenisArsip> jenisArsipConverter;
	
	@Autowired
	private BaseConverterImpl<StatusBerkasVO, StatusBerkas> statusBerkasConverter;
	
	@Autowired
	private BaseConverterImpl<KlasifikasiArsipVO, KlasifikasiArsip> klasifikasiArsipConverter;
	
	@Autowired
	private BaseConverterImpl<SubKlasifikasiArsipVO, SubKlasifikasiArsip> subKlasifikasiArsipConverter;
	
	@Autowired
	private BaseConverterImpl<JenisSuratVO, JenisSurat> jenisSuratConverter;
	
	@Autowired
	private BaseConverterImpl<PegawaiVO, Pegawai> pegawaiConverter;
	
	@Autowired
	private BaseConverterImpl<MetodeKirimVO, MetodeKirim> metodeKirimConverter;
	
	@Override
	public Map<String, Object> addDokumenKeluar(DokumenKeluarVO vo) {
		return null;
	}

	@Override
	public Map<String, Object> updateDokumenKeluar(DokumenKeluarVO vo) {
		return null;
	}
	
	// KetataUsahaan - Sarana Prasarana
	@Override
	@Transactional
	public Map<String, Object> addSuratKeluar(SuratKeluarVO vo) {
		Map<String, Object> result = new HashMap<String, Object>();
		// Save Dokumen
		Dokumen dokumen = new Dokumen();
		dokumen = getDokumenFromSuratKeluarVO(vo);
		Dokumen resultDokumen = new Dokumen();
		if(CommonUtil.isNotNullOrEmpty(dokumen)){
			resultDokumen = dokumenDao.save(dokumen);
			result.put("dokumen", resultDokumen.getId());
		}
		
		// Save Struk Kirim
		StrukKirim strukKirim = new StrukKirim();
		strukKirim = getStrukKirimFromSuratKeluarVO(vo);
		if(CommonUtil.isNotNullOrEmpty(dokumen.getNoDokumen())){
			strukKirim.setNokirim_intern(dokumen.getNoDokumen());
		}
		StrukKirim resultStrukKirim = new StrukKirim();
		if(CommonUtil.isNotNullOrEmpty(strukKirim)){
			resultStrukKirim = strukKirimDao.save(strukKirim);
		}
		if(CommonUtil.isNotNullOrEmpty(resultStrukKirim)){
			result.put("strukKirim", strukKirim.getNoRec());
		}
		
		// Save Dokumen Internal
//		DokumenInternal dokumenInternal = new DokumenInternal();
//		dokumenInternal = getDokumenInternalFromSuratKeluar(vo);
//		dokumenInternal.setKddokumen(resultDokumen);
//		dokumenInternal.setNokirim(resultStrukKirim);
//		DokumenInternal resultDokumenInternal = new DokumenInternal();
//		if(CommonUtil.isNotNullOrEmpty(dokumenInternal)){
//			resultDokumenInternal = dokumenInternalDao.save(dokumenInternal);
//			result.put("dokumenInternal", resultDokumenInternal.getNoRec());
//		}
		
		// Save Dokumen Keluar
		DokumenKeluar dokumenKeluar = new DokumenKeluar();
		dokumenKeluar = getDokumenKeluarFromSuratKeluar(vo);
		Dokumen dokumenDomain = new Dokumen();
		dokumenDomain = dokumenDao.findOne(resultDokumen.getId());
		if(CommonUtil.isNotNullOrEmpty(dokumenDomain)){
			dokumenKeluar.setKddokumen(dokumenDomain);
		}
		if(CommonUtil.isNotNullOrEmpty(resultStrukKirim)){
			dokumenKeluar.setNokirim(resultStrukKirim);
		}
		DokumenKeluar resultDokumenKeluar = new DokumenKeluar();
		if(CommonUtil.isNotNullOrEmpty(dokumenKeluar)){
			resultDokumenKeluar = dokumenKeluarDao.save(dokumenKeluar);
			result.put("dokumenKeluar", resultDokumenKeluar.getNoRec());
		}
		
		return result;
	}
	
	private DokumenKeluar getDokumenKeluarFromSuratKeluar(SuratKeluarVO vo){
		DokumenKeluar dokumenKeluar = new DokumenKeluar();
		if(CommonUtil.isNotNullOrEmpty(vo.getNoSurat())){
			dokumenKeluar.setNodokumen_intern(vo.getNoSurat());
			dokumenKeluar.setNodokumen_intern(vo.getNoSurat());
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getNamaPenerimaTujuan())){
			dokumenKeluar.setNamapenerimatujuan(vo.getNamaPenerimaTujuan());
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getSifatSurat())){
			dokumenKeluar.setSifatSurat(sifatSuratConverter.transferVOToModel(vo.getSifatSurat(), new SifatSurat()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getStatusBerkas())){
			dokumenKeluar.setStatusBerkas(statusBerkasConverter.transferVOToModel(vo.getStatusBerkas(), new StatusBerkas()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getJenisSurat())){
			dokumenKeluar.setJenisSurat(jenisSuratConverter.transferVOToModel(vo.getJenisSurat(), new JenisSurat()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getJenisArsip())){
			dokumenKeluar.setJenisArsip(jenisArsipConverter.transferVOToModel(vo.getJenisArsip(), new JenisArsip()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getKlasifikasiArsip())){
			dokumenKeluar.setKlasifikasiArsip(klasifikasiArsipConverter.transferVOToModel(vo.getKlasifikasiArsip(),  new KlasifikasiArsip()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getSubKlasifikasiArsip())){
			dokumenKeluar.setSubKlasifikasiArsip(subKlasifikasiArsipConverter.transferVOToModel(vo.getSubKlasifikasiArsip(), new SubKlasifikasiArsip()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getAtasNamaPegawaiPengirim())){
			dokumenKeluar.setPegawaiAtasNama(pegawaiConverter.transferVOToModel(vo.getAtasNamaPegawaiPengirim(), new Pegawai()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getPegawaiPenandatangan())){
			dokumenKeluar.setPegawaiPenandaTangan(pegawaiConverter.transferVOToModel(vo.getPegawaiPenandatangan(), new Pegawai()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getMetodeKirim())){
			dokumenKeluar.setMetodeKirim(metodeKirimConverter.transferVOToModel(vo.getMetodeKirim(), new MetodeKirim()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getPegawaiKirim())){
			dokumenKeluar.setPegawaiPengirim(pegawaiConverter.transferVOToModel(vo.getPegawaiKirim(), new Pegawai()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getLampiran())){
			dokumenKeluar.setLampiran(vo.getLampiran());
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getPerihal())){
			dokumenKeluar.setPerihal(vo.getPerihal());
		}
		List<KonseptorPemeriksaSurat> listKonseptor = new ArrayList<KonseptorPemeriksaSurat>();
		if(CommonUtil.isNotNullOrEmpty(vo.getPegawai())){
			for(PegawaiVO pegawaiVO : vo.getPegawai()){
				KonseptorPemeriksaSurat konseptorPemeriksaSurat = new KonseptorPemeriksaSurat();
				konseptorPemeriksaSurat.setDokumenKeluar(dokumenKeluar);
				konseptorPemeriksaSurat.setPegawai(pegawaiConverter.transferVOToModel(pegawaiVO, new Pegawai()));
				listKonseptor.add(konseptorPemeriksaSurat);
			}
			
			if(CommonUtil.isNotNullOrEmpty(dokumenKeluar.getKonseptorPemeriksaSuratSet())){
				dokumenKeluar.getKonseptorPemeriksaSuratSet().clear();
			}
			if(CommonUtil.isNotNullOrEmpty(listKonseptor)){
				dokumenKeluar.getKonseptorPemeriksaSuratSet().addAll(listKonseptor);
			}
		}
		
		return dokumenKeluar;
	}
	
	private DokumenInternal getDokumenInternalFromSuratKeluar(SuratKeluarVO vo){
		DokumenInternal dokumenInternal = new DokumenInternal();
		dokumenInternal.setNodokumen_intern(vo.getNoSurat());
		Ruangan ruangan = new Ruangan();
		ruangan.setId(304);
		dokumenInternal.setRuanganPengirim(ruangan);
		TipePengirimSurat tipePengirimSurat = new TipePengirimSurat();
		tipePengirimSurat.setId(2);
		dokumenInternal.setTipePengirimSurat(tipePengirimSurat);
		if(CommonUtil.isNotNullOrEmpty(vo.getPerihal())){
			dokumenInternal.setPerihal(vo.getPerihal());
		}
		dokumenInternal.setUserPengirimSurat(loginUserService.getLoginUser().getPegawai());
		if(CommonUtil.isNotNullOrEmpty(vo.getSifatSurat())){
			dokumenInternal.setSifatSurat(sifatSuratConverter.transferVOToModel(vo.getSifatSurat(), new SifatSurat()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getStatusBerkas())){
			dokumenInternal.setStatusBerkas(statusBerkasConverter.transferVOToModel(vo.getStatusBerkas(), new StatusBerkas()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getJenisArsip())){
			dokumenInternal.setJenisArsip(jenisArsipConverter.transferVOToModel(vo.getJenisArsip(), new JenisArsip()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getKlasifikasiArsip())){
			dokumenInternal.setKlasifikasiArsip(klasifikasiArsipConverter.transferVOToModel(vo.getKlasifikasiArsip(), new KlasifikasiArsip()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getSubKlasifikasiArsip())){
			dokumenInternal.setSubKlasifikasiArsip(subKlasifikasiArsipConverter.transferVOToModel(vo.getSubKlasifikasiArsip(), new SubKlasifikasiArsip()));
		}
		
		return dokumenInternal;
		
	}
	
	private StrukKirim getStrukKirimFromSuratKeluarVO(SuratKeluarVO vo){
		StrukKirim strukKirim = new StrukKirim();
		strukKirim.setPegawaiPengirim(loginUserService.getLoginUser().getPegawai());
		strukKirim.setKdruangan(loginUserService.getLoginUser().getPegawai().getRuangan());
		if(CommonUtil.isNotNullOrEmpty(vo.getNamaPenerimaTujuan())){
			strukKirim.setNamapenerima(vo.getNamaPenerimaTujuan());
		}
		if(CommonUtil.isNotNullOrEmpty(getRunningNumber("KirimProduk"))){
			strukKirim.setNokirim(getRunningNumber("KirimProduk"));
		}
		Ruangan ruanganTataUsaha = new Ruangan();
		ruanganTataUsaha.setId(304);
		strukKirim.setKdruanganasal(ruanganTataUsaha);
		strukKirim.setKdruangan(ruanganTataUsaha);
		strukKirim.setQtyproduk(0.0);
		strukKirim.setTglkirim(new Date());
		strukKirim.setTotalbeamaterai(0.0);
		strukKirim.setTotalberatkg(0.0);
		strukKirim.setTotalbiayakirim(0.0);
		strukKirim.setTotalbiayatambahan(0.0);
		strukKirim.setTotaldiscount(0.0);
		strukKirim.setTotalhargasatuan(0.0);
		strukKirim.setTotalharusdibayar(0.0);
		strukKirim.setTotalpph(0.0);
		strukKirim.setTotalppn(0.0);
		return strukKirim;
	}
	
	private Dokumen getDokumenFromSuratKeluarVO(SuratKeluarVO vo){
		Dokumen dokumen = new Dokumen();
		dokumen.setIsDokumenInOutInt((byte) 1);
		if(CommonUtil.isNotNullOrEmpty(vo.getPerihal())){
			dokumen.setNamaJudulDokumen(vo.getPerihal());
		}
		dokumen.setKdDokumen(0);
		JenisDokumen jenisDokumen = new JenisDokumen();
		jenisDokumen.setId(8);
		if(CommonUtil.isNotNullOrEmpty(jenisDokumen)){
			dokumen.setJenisDokumen(jenisDokumen);
		}
		
		dokumen.setPegawaiPembuat(loginUserService.getLoginUser().getPegawai());
		dokumen.setNamaPegawaiPembuat(loginUserService.getLoginUser().getPegawai().getNamaLengkap());
		dokumen.setNoDokumen(getNoDokumen());
		if(CommonUtil.isNotNullOrEmpty(vo.getPathFile())){
			dokumen.setPathFile(vo.getPathFile());
		}
		dokumen.setqDokumen(0);
		if(CommonUtil.isNotNullOrEmpty(vo.getLampiran())){
			dokumen.setQtyLampiran(vo.getLampiran());
		}
		dokumen.setTglDokumen(new Date());
		return dokumen;
	}
	
	private String getNoDokumen(){
		String currentDate = null;
		if (CommonUtil.isNotNullOrEmpty(Calendar.getInstance())) {
			Calendar calendar = Calendar.getInstance();
			Integer date = calendar.get(Calendar.DATE);
			String dateString = StringUtil.formatNumber(String.valueOf(date), 2);
			Integer month = calendar.get(Calendar.MONTH);
			String monthString = StringUtil.formatNumber(String.valueOf(month), 2);
			Integer year = calendar.get(Calendar.YEAR);
			String stringKdTerima = StringUtil.formatNumber(String.valueOf(dokumenKeluarDao.getCount() + 1), 6);
			currentDate = "DOKKELUAR" + year.toString() + monthString + dateString + stringKdTerima;
		}
		return currentDate;
	}
	
	@Transactional
	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);
		runningNumberDao.save(runningNumber);
		String noOrderIntern = StringUtil.formatNumber(number.toString(), 10);
		return noOrderIntern;
	}
	
}
