package com.jasamedika.medifirst2000.service.impl;

import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.MapPelatihanPaketToJabatanDao;
import com.jasamedika.medifirst2000.dao.PelatihanJplDao;
import com.jasamedika.medifirst2000.dao.PelatihanKreditAkreditasiDao;
import com.jasamedika.medifirst2000.dao.PelatihanPaketDao;
import com.jasamedika.medifirst2000.dao.PlanningDiklatHumasMarketBiayaDao;
import com.jasamedika.medifirst2000.dao.PlanningDiklatHumasMarketDao;
import com.jasamedika.medifirst2000.dao.ProdukDao;
import com.jasamedika.medifirst2000.dao.StrukPlanningDao;
import com.jasamedika.medifirst2000.dao.custom.PelatihanPaketDaoCustom;
import com.jasamedika.medifirst2000.entities.DetailJenisProduk;
import com.jasamedika.medifirst2000.entities.Eselon;
import com.jasamedika.medifirst2000.entities.Golongan;
import com.jasamedika.medifirst2000.entities.GolonganPegawai;
import com.jasamedika.medifirst2000.entities.HeadAnggaran;
import com.jasamedika.medifirst2000.entities.Jabatan;
import com.jasamedika.medifirst2000.entities.JenisPelatihan;
import com.jasamedika.medifirst2000.entities.MapPelatihanPaketToJabatan;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.PelatihanJpl;
import com.jasamedika.medifirst2000.entities.PelatihanKreditAkreditasi;
import com.jasamedika.medifirst2000.entities.PelatihanPaket;
import com.jasamedika.medifirst2000.entities.PlanningDiklatHumasMarket;
import com.jasamedika.medifirst2000.entities.PlanningDiklatHumasMarketBiaya;
import com.jasamedika.medifirst2000.entities.Produk;
import com.jasamedika.medifirst2000.entities.SatuanStandar;
import com.jasamedika.medifirst2000.entities.StatusPekerjaan;
import com.jasamedika.medifirst2000.entities.StrukPlanning;
import com.jasamedika.medifirst2000.service.PelatihanPaketService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.StringUtil;
import com.jasamedika.medifirst2000.vo.CssdBmhpHeaderVO;
import com.jasamedika.medifirst2000.vo.EselonVO;
import com.jasamedika.medifirst2000.vo.GolonganVO;
import com.jasamedika.medifirst2000.vo.HeadAnggaranVO;
import com.jasamedika.medifirst2000.vo.JabatanVO;
import com.jasamedika.medifirst2000.vo.JenisPelatihanVO;
import com.jasamedika.medifirst2000.vo.PegawaiVO;
import com.jasamedika.medifirst2000.vo.PelatihanBiayaDiklatVO;
import com.jasamedika.medifirst2000.vo.PelatihanJplVO;
import com.jasamedika.medifirst2000.vo.PelatihanKreditAkreditasiVO;
import com.jasamedika.medifirst2000.vo.PelatihanPaketBiayaVO;
import com.jasamedika.medifirst2000.vo.PelatihanPaketVO;
import com.jasamedika.medifirst2000.vo.ProdukVO;
import com.jasamedika.medifirst2000.vo.SatuanStandarVO;

@Service("pelatihanPaketService")
public class PelatihanPaketServiceImpl extends BaseAngaranServiceImpl implements PelatihanPaketService {

	@Autowired
	private StrukPlanningDao strukPlanningDao;

	@Autowired
	private PelatihanKreditAkreditasiDao pelatihanKreditAkreditasiDao;

	@Autowired
	private PelatihanPaketDaoCustom pelatihanPaketDaoCustom;

	@Autowired
	private BaseConverterImpl<JenisPelatihanVO, JenisPelatihan> jenisPelatihanConverter;

	@Autowired
	private PlanningDiklatHumasMarketDao planningDiklatHumasMarketDao;

	@Autowired
	private BaseConverterImpl<PegawaiVO, Pegawai> pegawaiConverter;

	@Autowired
	private BaseConverterImpl<ProdukVO, Produk> produkConverter;

	@Autowired
	private BaseConverterImpl<JabatanVO, Jabatan> jabatanConverter;

	@Autowired
	private BaseConverterImpl<GolonganVO, Golongan> golonganConverter;

	@Autowired
	private BaseConverterImpl<EselonVO, Eselon> eselonConverter;

	@Autowired
	private ProdukDao produkDao;

	@Autowired
	private PelatihanPaketDao pelatihanPaketDao;

	@Autowired
	private MapPelatihanPaketToJabatanDao mapPelatihanPaketToJabatanDao;

	@Autowired
	private PelatihanJplDao pelatihanJplDao;

	@Autowired
	private PlanningDiklatHumasMarketBiayaDao planningDiklatHumasMarketBiayaDao;

	@Override
	public Map<String, Object> savePelatihanPaket(PelatihanPaketVO vo) {

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

		Produk produk = new Produk();
		DetailJenisProduk detailJenisProduk = new DetailJenisProduk();
		detailJenisProduk.setId(1337);
		detailJenisProduk.setKdProfile((short) 0);
		produk.setDetailJenisProduk(detailJenisProduk);
		produk.setNamaProduk(vo.getNamaPaketPelatihan());
		produk.setNilaiNormal((short) 0);
		produk.setqProduk(1);
		produk.setQtyJualTerkecil((double) 0);
		produk.setQtySatuKemasan(0);
		produk.setQtyTerkecil((double) 0);
		produk.setKdProduk(StringUtil.formatNumber(String.valueOf(produkDao.getCount() + 1), 6));
		produk.setKdProdukIntern(StringUtil.formatNumber(String.valueOf(produkDao.getCount() + 1), 6));
		produk.setVerifikasiAnggaran(false);
		Produk produkResult = produkDao.save(produk);

		PelatihanPaket pelatihanPaket = new PelatihanPaket();
		if (CommonUtil.isNotNullOrEmpty(vo.getJenisPelatihan())) {
			pelatihanPaket.setJenisPelatihan(
					jenisPelatihanConverter.transferVOToModel(vo.getJenisPelatihan(), new JenisPelatihan()));
		}
		pelatihanPaket.setProduk(produkResult);
		pelatihanPaket.setStatusEnabled(true);
		pelatihanPaket.setJumlahNarasumber(vo.getJumlahNarasumber());
		pelatihanPaket.setKapasitasPeserta(vo.getKapasitasPeserta());
		pelatihanPaket.setNamaPaketPelatihan(vo.getNamaPaketPelatihan());
		if (CommonUtil.isNotNullOrEmpty(vo.getPegawai())) {
			pelatihanPaket.setPegawai(pegawaiConverter.transferVOToModel(vo.getPegawai(), new Pegawai()));
		}
		pelatihanPaket.setPenyelenggara(vo.getPenyelenggara());
		pelatihanPaket.setTanggalAhir(vo.getTanggalAhir());
		pelatihanPaket.setTanggalAwal(vo.getTanggalAwal());
		pelatihanPaket.setTanggalAkreditasi(vo.getTanggalAkreditasi());
		pelatihanPaket.setTempat(vo.getTempat());
		pelatihanPaketDao.save(pelatihanPaket);

		for (JabatanVO jabatan : vo.getJabatan()) {
			MapPelatihanPaketToJabatan mapPelatihanPaketToJabatan = new MapPelatihanPaketToJabatan();
			mapPelatihanPaketToJabatan.setJabatan(jabatanConverter.transferVOToModel(jabatan, new Jabatan()));
			mapPelatihanPaketToJabatan.setKdProfile((short) 0);
			mapPelatihanPaketToJabatan.setPelatihanPaket(pelatihanPaket);
			mapPelatihanPaketToJabatan.setStatusEnabled(true);
			mapPelatihanPaketToJabatanDao.save(mapPelatihanPaketToJabatan);
		}

		for (PelatihanJplVO pelatihanJpl : vo.getPelatihanJpl()) {
			PelatihanJpl entity = new PelatihanJpl();
			entity.setKdProfile((short) 0);
			if (CommonUtil.isNotNullOrEmpty(pelatihanJpl.getEselon())) {
				entity.setEselon(eselonConverter.transferVOToModel(pelatihanJpl.getEselon(), new Eselon()));
			}
			if (CommonUtil.isNotNullOrEmpty(pelatihanJpl.getGolongan())) {
				GolonganPegawai golPeg = new GolonganPegawai();
				try {
					BeanUtils.copyProperties(pelatihanJpl.getGolongan(), golPeg);
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					e.printStackTrace();
				}
				entity.setGolonganPegawai(golPeg);
				// entity.setGolongan(golonganConverter.transferVOToModel(pelatihanJpl.getGolongan(),new
				// Golongan()));
			}
			entity.setPelatihanPaket(pelatihanPaket);
			entity.setJpl(pelatihanJpl.getJpl());
			pelatihanJplDao.save(entity);
		}

		for (PelatihanKreditAkreditasiVO pelatihanKreditAkreditasiVO : vo.getPelatihanKreditAkreditsi()) {
			PelatihanKreditAkreditasi pelatihanKreditAkreditasi = new PelatihanKreditAkreditasi();
			pelatihanKreditAkreditasi.setJenisKepersetaan(pelatihanKreditAkreditasiVO.getJenisKepersetaan());
			pelatihanKreditAkreditasi.setSkp(pelatihanKreditAkreditasiVO.getSkp());
			pelatihanKreditAkreditasi.setPelatihanPaket(pelatihanPaket);
			pelatihanKreditAkreditasiDao.save(pelatihanKreditAkreditasi);
		}

		StrukPlanning strukPlanning = new StrukPlanning();
		if (CommonUtil.isNotNullOrEmpty(vo.getNoRec())) {
			strukPlanning = strukPlanningDao.findOne(vo.getNoRec());
		}
		strukPlanning.setKdruanganasal(getRuanganByUserLogin());
		strukPlanning.setKdruangan(getRuanganByUserLogin());
		strukPlanning.setDeskripsiplanning("Paket Pelatihan");
		strukPlanning.setNamaplanning("Paket Pelatihan");
		strukPlanning.setTglplanning(new Date());
		strukPlanning.setKdalamattujuan(null);
		strukPlanning.setKdasalanggaran(null);
		strukPlanning.setKddokumensk(null);
		strukPlanning.setKdjenisanggaran(null);
		strukPlanning.setKdjenistempat(null);
		strukPlanning.setKdkelompoktransaksi(null);
		strukPlanning.setKdpegawaipjawab(null);
		strukPlanning.setKdpegawaipjawabevaluasi(null);
		strukPlanning.setKdperiodeaccount(null);
		strukPlanning.setKdProfile((short) 0);
		strukPlanning.setTglsiklusawal(vo.getTanggalAwal());
		strukPlanning.setTglsiklusakhir(vo.getTanggalAhir());
		strukPlanning.setTglpegajuan(new Date());
		strukPlanning.setKdrekanan(null);
		StatusPekerjaan statusPekerjaan = new StatusPekerjaan();
		statusPekerjaan.setId(3);
		strukPlanning.setStatusPekerjaan(statusPekerjaan);
		strukPlanning = strukPlanningDao.save(strukPlanning);

		PlanningDiklatHumasMarket planningDiklatHumasMarket = new PlanningDiklatHumasMarket();
		planningDiklatHumasMarket.setDeskripsiDetail("Paket Pelatihan");
		planningDiklatHumasMarket.setStrukPlaning(strukPlanning);
		planningDiklatHumasMarket.setKdProdukDHM("-");
		planningDiklatHumasMarket.setProduk(produkResult);
		planningDiklatHumasMarket.setQtyPeserta(vo.getKapasitasPeserta());
		planningDiklatHumasMarket.setTglPlanning(new Date());
		planningDiklatHumasMarket.setTglPlanningAkhir(new Date());
		planningDiklatHumasMarket = planningDiklatHumasMarketDao.save(planningDiklatHumasMarket);

		for (PelatihanPaketBiayaVO pelatihanPaketBiaya : vo.getPelatihanPaketBiaya()) {

			Double persenPpn = 0.0;
			Double persenDiskon = 0.0;
			Double ppn = 0.0;
			Double diskon = 0.0;
			Double hargaSatuan = 0.0;

			if (CommonUtil.isNotNullOrEmpty(pelatihanPaketBiaya.getHargaSatuan())) {
				hargaSatuan = pelatihanPaketBiaya.getHargaSatuan();
			}

			ppn = ((persenDiskon / hargaSatuan) * 100);
			diskon = ((persenPpn / hargaSatuan) * 100);
			Double hargaNetto1 = hargaSatuan + ppn;
			Double hargaNetto2 = hargaNetto1 - diskon;
			PlanningDiklatHumasMarketBiaya planningDiklatHumasMarketBiaya = new PlanningDiklatHumasMarketBiaya();
			planningDiklatHumasMarketBiaya.setHargaDiskon(hargaSatuan);
			planningDiklatHumasMarketBiaya.setHargaPPH(hargaSatuan);
			planningDiklatHumasMarketBiaya.setHargaPPN(hargaSatuan);
			planningDiklatHumasMarketBiaya.setHargaSatuan(hargaSatuan);
			planningDiklatHumasMarketBiaya.setHargaTambahan(0.0);
			planningDiklatHumasMarketBiaya.setNoPlanning("-");
			planningDiklatHumasMarketBiaya.setIsSetBiayaPeserta(pelatihanPaketBiaya.getSetBiayaPeserta());
			if (CommonUtil.isNotNullOrEmpty(pelatihanPaketBiaya.getKomponen())) {
				planningDiklatHumasMarketBiaya
						.setProduk(produkConverter.transferVOToModel(pelatihanPaketBiaya.getKomponen(), new Produk()));
			}
			planningDiklatHumasMarketBiaya.setQtyProduk(pelatihanPaketBiaya.getQtyProduk());
			planningDiklatHumasMarketBiaya.setStrukPlanning(strukPlanning);
			planningDiklatHumasMarketBiaya.setProduk(produkResult);
			planningDiklatHumasMarketBiayaDao.save(planningDiklatHumasMarketBiaya);
			data.put("noRec", planningDiklatHumasMarketBiaya.getNoRec());
		}
		return data;
	}

	@Override
	public Map<String, Object> daftarKomponen() {
		Map<String, Object> result = new HashMap<String, Object>();
		result.put("data", pelatihanPaketDaoCustom.daftarKomponen());
		return result;
	}

	@Override
	public Map<String, Object> listPelatihanPaket(Integer page, Integer limit, String sort, String dir,
			String tanggalAwal, String tanggalAhir) {
		Map<String, Object> result = new HashMap<String, Object>();
		result.put("data", pelatihanPaketDaoCustom.listPelatihanPaket(tanggalAwal, tanggalAhir));
		return result;
	}

	@Override
	public Map<String, Object> detailPelatihanPaket(String strukPlanningId, Integer produkId) {
		Map<String, Object> result = new HashMap<String, Object>();
		result.put("data", pelatihanPaketDaoCustom.detailPelatihanPaket(produkId));
		result.put("jabatan", pelatihanPaketDaoCustom.jabatan(produkId));
		result.put("jpl", pelatihanPaketDaoCustom.jpl(produkId));
		result.put("kreditAkreditasi", pelatihanPaketDaoCustom.kreditAkreditasi(produkId));
		result.put("biaya", pelatihanPaketDaoCustom.biaya(produkId));
		return result;
	}

}
