package com.jasamedika.medifirst2000.service.impl;

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

import org.springframework.beans.factory.annotation.Autowired;

import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.AsalProdukDao;
import com.jasamedika.medifirst2000.dao.DetailSpekAnggaranDao;
import com.jasamedika.medifirst2000.dao.MapPengendaliToJabatanDao;
import com.jasamedika.medifirst2000.dao.MataAnggaranDao;
import com.jasamedika.medifirst2000.dao.PegawaiDao;
import com.jasamedika.medifirst2000.dao.PengendaliDao;
import com.jasamedika.medifirst2000.dao.RuanganDao;
import com.jasamedika.medifirst2000.dao.custom.DetailRupDaoCustom;
import com.jasamedika.medifirst2000.dto.DetailRupDto;
import com.jasamedika.medifirst2000.entities.AsalProduk;
import com.jasamedika.medifirst2000.entities.ChartOfAccount;
import com.jasamedika.medifirst2000.entities.DetailAnggaran;
import com.jasamedika.medifirst2000.entities.DetailSpekAnggaran;
import com.jasamedika.medifirst2000.entities.HeadAnggaran;
import com.jasamedika.medifirst2000.entities.Jabatan;
import com.jasamedika.medifirst2000.entities.KegiatanAnggaran;
import com.jasamedika.medifirst2000.entities.KelompokUser;
import com.jasamedika.medifirst2000.entities.Komponen;
import com.jasamedika.medifirst2000.entities.LoginUser;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.Pengendali;
import com.jasamedika.medifirst2000.entities.Produk;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.service.BaseAnggaranService;
import com.jasamedika.medifirst2000.service.LoginUserService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.AsalProdukVO;
import com.jasamedika.medifirst2000.vo.ChartOfAccountVO;
import com.jasamedika.medifirst2000.vo.DetailAnggaranVO;
import com.jasamedika.medifirst2000.vo.DetailSpekAnggaranVO;
import com.jasamedika.medifirst2000.vo.HeadAnggaranVO;
import com.jasamedika.medifirst2000.vo.KegiatanAnggaranVO;
import com.jasamedika.medifirst2000.vo.KomponenVO;
import com.jasamedika.medifirst2000.vo.ProdukVO;
import com.jasamedika.medifirst2000.vo.RuanganVO;

public abstract class BaseAngaranServiceImpl extends BaseVoServiceImpl implements BaseAnggaranService{
	
	@Autowired 
	private DetailSpekAnggaranDao detailSpekAnggaranDao;
	
	@Autowired 
	private LoginUserService loginUserService;
	
	@Autowired 
	private RuanganDao ruanganDao;
	
	@Autowired 
	private DetailRupDaoCustom detailRupDaoCustom;
	
	@Autowired 
	private PegawaiDao pegawaiDao;
	
	
	@Autowired
	private BaseConverterImpl<RuanganVO, Ruangan> ruanganConverter;
	
	@Autowired
	private BaseConverterImpl<KegiatanAnggaranVO, KegiatanAnggaran> kegiatanAnggaranConverter;
	
	
	@Autowired
	private BaseConverterImpl<KomponenVO, Komponen> komponenConverter;
	
	@Autowired
	private BaseConverterImpl<DetailAnggaranVO, DetailAnggaran> detailAnggaranConverter;
	
	
	@Autowired
	private BaseConverterImpl<ChartOfAccountVO, ChartOfAccount> akunConverter;
	
	@Autowired
	private BaseConverterImpl<AsalProdukVO, AsalProduk> asalProdukConverter;
	
	@Autowired
	private BaseConverterImpl<DetailSpekAnggaranVO, DetailSpekAnggaran> detailSpekAnggaranConverter;
	
	@Autowired
	private BaseConverterImpl<ProdukVO, Produk> produkConverter;
	
	@Autowired
	private BaseConverterImpl<HeadAnggaranVO, HeadAnggaran> headAnggaranConverter;
	
	@Autowired
	private PengendaliDao pengendaliDao;
	
	@Autowired
	private MapPengendaliToJabatanDao mapPengendaliToJabatanDao;
	
	@Autowired
	private AsalProdukDao asalProdukDao;
	
	@Autowired
	private MataAnggaranDao mataAnggaranDao;
	
	
	public DetailSpekAnggaran setDetailRup(DetailRupDto detailRupDto){
		DetailSpekAnggaran detailSpekAnggaran=detailRupDto.getDetailSpekAnggaran();
		if(CommonUtil.isNotNullOrEmpty(detailRupDto.getDetailRup())){
			detailSpekAnggaran.setPelaksanaanPekerjaanAhir(detailRupDto.getDetailRup().getPelaksanaanPekerjaanAhir());
			detailSpekAnggaran.setPelaksanaanPekerjaanAwal(detailRupDto.getDetailRup().getPelaksanaanPekerjaanAwal());
			detailSpekAnggaran.setPelaksanaanPemilihanAhir(detailRupDto.getDetailRup().getPelaksanaanPemilihanAhir());
			detailSpekAnggaran.setPelaksanaanPemilihanAwal(detailRupDto.getDetailRup().getPelaksanaanPemilihanAwal());
			detailSpekAnggaran.setKeteranganRup(detailRupDto.getDetailRup().getKeterangan());
			detailSpekAnggaran.setNoRec(detailRupDto.getDetailRup().getNoRec());
		}
		return detailSpekAnggaran;
	}
	
	@Override
	public Map<String,Object> findDetailSpekAnggaranByParent(String noRec,String parameter,Integer asalProdukId,Integer mataAnggaranId) {
		String[] array = noRec.split("\\,",-1); 
		List<String> list = Arrays.asList(array);
		Map<String,Object> result=new HashMap<String,Object>();
		if(parameter.equalsIgnoreCase("rup")){
			result.put("data", detailRupDaoCustom.findDetailSpekAnggaranByParentForRup(list));
		}else if(parameter.equalsIgnoreCase("kartuPengendali")){
			result.put("data", detailRupDaoCustom.findDetailSpekAnggaranByParentForKartuPengendali(list));
		}
		
		if(CommonUtil.isNotNullOrEmpty(asalProdukId)){
			result.put("asalProduk", asalProdukDao.findById(asalProdukId));
		}
		
		if(CommonUtil.isNotNullOrEmpty(mataAnggaranId)){
			result.put("mataAnggaran", mataAnggaranDao.findById(mataAnggaranId));
		}
		
		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 Pegawai getPegawaiByUserLogin() {
		LoginUser loginUser = loginUserService.getLoginUser();
		Pegawai r=new Pegawai();
		if(CommonUtil.isNotNullOrEmpty(loginUser.getPegawai())){
			r=loginUser.getPegawai();
		}
		return r; 
	}
	
	@Override
	public KelompokUser getKelompokUserLogin() {
		LoginUser loginUser = loginUserService.getLoginUser();
		KelompokUser r=new KelompokUser();
		if(CommonUtil.isNotNullOrEmpty(loginUser.getPegawai())){
			r=loginUser.getKelompokUser();
		}
		return r; 
	}
	
	@Override
	public Jabatan getJabatan() {
		LoginUser loginUser = loginUserService.getLoginUser();
		Jabatan r=new Jabatan();
		if(CommonUtil.isNotNullOrEmpty(loginUser.getPegawai())){
			r=pegawaiDao.findJabatanByIdPegawai(loginUser.getPegawai().getId());
		}
		return r; 
	}
	
	@Override
	public LoginUser getLoginUser() {
		LoginUser loginUser = loginUserService.getLoginUser();
		return loginUser; 
	}
	
	@Override
	public List<Integer> getPengendaliByUserLoginList() {
		List<Integer> listPengendali=null;
		if(CommonUtil.isNotNullOrEmpty(getKelompokUserLogin())){
			if(getKelompokUserLogin().getKelompokUser().equalsIgnoreCase("direkturUmum")){
				listPengendali=mapPengendaliToJabatanDao.getPengendaliInDirekturUmum(getJabatan().getId());
			}else if(getKelompokUserLogin().getKelompokUser().equalsIgnoreCase("direkturMedik")){
				listPengendali=mapPengendaliToJabatanDao.getPengendaliInDirekturMedik(getJabatan().getId());
			}else if(getKelompokUserLogin().getKelompokUser().equalsIgnoreCase("direkturSdm")){
				listPengendali=mapPengendaliToJabatanDao.getPengendaliInDirekturSdm(getJabatan().getId());
			}else if(getKelompokUserLogin().getKelompokUser().equalsIgnoreCase("direkturKeuangan")){
				listPengendali=mapPengendaliToJabatanDao.getPengendaliInDirekturKeuangan(getJabatan().getId());
			}else{
				listPengendali=pengendaliDao.getPengendaliByUserLogin(getLoginUser().getId());
			}
		}else{
			listPengendali=pengendaliDao.getPengendaliByUserLogin(getLoginUser().getId());
		}
		
		return listPengendali;
	}
	
	@Override
	public Pengendali getPengendaliByUserLogin() {
		List<Pengendali> listPengendali=pengendaliDao.getPengendaliByUserLoginObject(getLoginUser().getId());
		Pengendali p=new Pengendali();
		if(CommonUtil.isNotNullOrEmpty(listPengendali)){
			p=listPengendali.get(0);
		}
		return p;
	}
	
	
	@Override
	public List<Integer> getRuanganByUserLoginList() {
		List<Integer> listPengendali=ruanganDao.getRuanganByUserLogin(getLoginUser().getId());
		return listPengendali;
	}
	
	
	
	
}
