package com.jasamedika.medifirst2000.service.impl;

import java.util.ArrayList;
import java.util.Date;
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.KirimProdukAsetDao;
import com.jasamedika.medifirst2000.dao.OrderPelayananDao;
import com.jasamedika.medifirst2000.dao.ProdukDao;
import com.jasamedika.medifirst2000.dao.RegistrasiAsetDao;
import com.jasamedika.medifirst2000.dao.RunningNumberDao;
import com.jasamedika.medifirst2000.dao.StrukKirimDao;
import com.jasamedika.medifirst2000.dao.StrukKonfirmasiDao;
import com.jasamedika.medifirst2000.dao.StrukOrderDao;
import com.jasamedika.medifirst2000.dao.custom.RegistrasiAsetDaoCustom;
import com.jasamedika.medifirst2000.entities.AsalProduk;
import com.jasamedika.medifirst2000.entities.JenisPermintaan;
import com.jasamedika.medifirst2000.entities.KelompokTransaksi;
import com.jasamedika.medifirst2000.entities.KirimProduk;
import com.jasamedika.medifirst2000.entities.KirimProdukAset;
import com.jasamedika.medifirst2000.entities.OrderPelayanan;
import com.jasamedika.medifirst2000.entities.Produk;
import com.jasamedika.medifirst2000.entities.RegistrasiAset;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.entities.RunningNumber;
import com.jasamedika.medifirst2000.entities.SatuanStandar;
import com.jasamedika.medifirst2000.entities.StrukKirim;
import com.jasamedika.medifirst2000.entities.StrukKonfirmasi;
import com.jasamedika.medifirst2000.entities.StrukOrder;
import com.jasamedika.medifirst2000.service.DistribusiAsetService;
import com.jasamedika.medifirst2000.service.LoginUserService;
import com.jasamedika.medifirst2000.service.StrukOrderService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.DateUtil;
import com.jasamedika.medifirst2000.util.StringUtil;
import com.jasamedika.medifirst2000.vo.DistribusiAsetDetailVO;
import com.jasamedika.medifirst2000.vo.DistribusiAsetVO;
import com.jasamedika.medifirst2000.vo.KirimProdukAsetVO;
import com.jasamedika.medifirst2000.vo.KonfirmasiAsetVO;
import com.jasamedika.medifirst2000.vo.ProdukVO;
import com.jasamedika.medifirst2000.vo.RegistrasiAsetVO;
import com.jasamedika.medifirst2000.vo.RequestBarangDariRuanganDetailVO;
import com.jasamedika.medifirst2000.vo.RequestBarangDariRuanganVO;
import com.jasamedika.medifirst2000.vo.RuanganVO;

/**
 * Implement class for AbsensiPegawaiService
 * 
 * @author Generator
 * @param <T>
 */
@Service("distribusiAsetService")
public class DistribusiAsetServiceImpl extends BaseAngaranServiceImpl implements DistribusiAsetService{
	
	@Autowired
	private LoginUserService loginUserService;
	
	@Autowired
	private ProdukDao produkDao;
	
	@Autowired
	private RegistrasiAsetDao registrasiAsetDao;
	
	@Autowired
	private StrukKonfirmasiDao strukKonfirmasiDao;
	
	@Autowired
	private KirimProdukAsetDao kirimProdukAsetDao;
	
	@Autowired
	private RegistrasiAsetDaoCustom registrasiAsetDaoCustom;
	
	@Autowired
	private OrderPelayananDao orderPelayananDao;
	
	@Autowired
	private StrukKirimDao strukKirimDao;
	
	@Autowired
	private RunningNumberDao runningNumberDao;
	
	@Autowired
	private BaseConverterImpl<RuanganVO, Ruangan> ruanganConverter;
	
	@Autowired
	private BaseConverterImpl<ProdukVO, Produk> produkConverter;
	
	@Autowired
	private BaseConverterImpl<RegistrasiAsetVO,RegistrasiAset> registrasiAsetConverter;
	
	@Autowired
	private StrukOrderService strukOrderService;
	
	@Autowired
	private StrukOrderDao strukOrderDao;

	@Override
	@Transactional(readOnly=false)
	public Map<String, Object> saveRequestDistribusi(DistribusiAsetVO vo) {
		StrukOrder strukOrder=new StrukOrder();
		String noUrut=strukOrderService.formatNoUrut("Struk Order", "STO");
		strukOrder.setNoOrder(noUrut);
		strukOrder.setNoOrderIntern(noUrut);
		strukOrder.setTglOrder(vo.getTglKirim());
		strukOrder.setQtyJenisProduk(0.0);
		strukOrder.setQtyProduk(0.0);
		strukOrder.setTotalBeaMaterai(0.0);
		strukOrder.setTotalHargaSatuan(0.0);
		strukOrder.setTotalBiayaKirim(0.0);
		strukOrder.setTotalBiayaTambahan(0.0);
		strukOrder.setTotalDiscount(0.0);
		strukOrder.setTotalHarusDibayar(0.0);
		strukOrder.setTotalPph(0.0);
		strukOrder.setTotalPpn(0.0);
		strukOrder.setPegawaiOrder(loginUserService.getLoginUser().getPegawai());
		strukOrder.setIsDelivered((byte) 1);
		strukOrder.setKeteranganOrder("Permintaan Barang Dari Ruangan (Aset)");
		KelompokTransaksi kelompokTransaksi = new KelompokTransaksi();
		kelompokTransaksi.setId(Integer.parseInt(GetSettingDataFixed("KdKelompokTransaksiOrderBarang")));
		strukOrder.setKelompokTransaksi(kelompokTransaksi);
		if(CommonUtil.isNotNullOrEmpty(vo.getRuanganTujuan())){
			strukOrder.setRuanganTujuan(ruanganConverter.transferVOToModel(vo.getRuanganTujuan(),new Ruangan()));
		}
		
		if(CommonUtil.isNotNullOrEmpty(vo.getRuanganAsal())){
			strukOrder.setRuangan(ruanganConverter.transferVOToModel(vo.getRuanganAsal(),new Ruangan()));
		}
		
		if(CommonUtil.isNotNullOrEmpty(vo.getDistribusiAsetDetail())){
			for(DistribusiAsetDetailVO modelVo:vo.getDistribusiAsetDetail()){
				OrderPelayanan orderPelayanan=new OrderPelayanan();
				orderPelayanan.setNoOrder(strukOrder);
				orderPelayanan.setQtyProduk(1.0);				
				orderPelayanan.setQtyStokCurrent(0.0);
				orderPelayanan.setStrukOrder(strukOrder);
				orderPelayanan.setQtyProdukRetur(0.0);
				orderPelayanan.setIsCito((byte) 1);
				orderPelayanan.setTglPelayanan(strukOrder.getTglOrder());
				if(CommonUtil.isNotNullOrEmpty(modelVo.getProduk())){
					orderPelayanan.setProduk(produkConverter.transferVOToModel(modelVo.getProduk(), new Produk()));
				}
				
				if(CommonUtil.isNotNullOrEmpty(vo.getRuanganTujuan())){
					orderPelayanan.setRuanganTujuan(ruanganConverter.transferVOToModel(vo.getRuanganTujuan(),new Ruangan()));
				}
				if(CommonUtil.isNotNullOrEmpty(vo.getRuanganAsal())){
					orderPelayanan.setRuangan(ruanganConverter.transferVOToModel(vo.getRuanganAsal(),new Ruangan()));
				}
				
				
				if(CommonUtil.isNotNullOrEmpty(modelVo.getProduk())){
					Map<String,Object> satuan=produkDao.getSatuanProdukByProduk(modelVo.getProduk().getId());
					orderPelayanan.setSatuanStandar((SatuanStandar) satuan.get("satuan"));
				}
				strukOrder.getOrderPelayanan().add(orderPelayanan);
			}
		}
		strukOrder=strukOrderDao.save(strukOrder);
		Map<String,Object> result=new HashMap<String,Object>();
		result.put("noRec", strukOrder.getNoRec());
		saveKirimBarangDariRuangan(strukOrder,vo);
		return result;
		
	}

	private void saveKirimBarangDariRuangan(StrukOrder strukOrder, DistribusiAsetVO vo) {
		StrukKirim strukKirim=new StrukKirim();
		strukKirim.setNoorder(strukOrder);
	
		strukKirim.setNokirim(StringUtil.formatNumber(String.valueOf(strukOrderDao.getCountByMonthAndYear(new Date()) + 1), 10));
		
		strukKirim.setNokirim_intern("KRIM"+getRunningNumber("KRIM"));
		strukKirim.setTglkirim(vo.getTglKirim());
		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.setKeteranganlainnyakirim("Pengiriman Barang Ke Ruangan");
		KelompokTransaksi kelompokTransaksi = new KelompokTransaksi();
		kelompokTransaksi.setId(Integer.parseInt(GetSettingDataFixed("KdKelompokTransaksiKirimBarang")));
		strukKirim.setKelompokTransaksi(kelompokTransaksi);
		if(CommonUtil.isNotNullOrEmpty(strukOrder.getRuanganTujuan())){
			strukKirim.setKdruangantujuan(strukOrder.getRuanganTujuan());
		}
		
		if(CommonUtil.isNotNullOrEmpty(strukOrder.getRuangan())){
			strukKirim.setKdruanganasal(strukOrder.getRuangan());
			strukKirim.setKdruangan(strukOrder.getRuangan());
		}
//		if(CommonUtil.isNotNullOrEmpty(vo.getStatusBarang())){
//			strukOrder.setStatusBarang(statusBarangConverter.transferVOToModel(vo.getStatusBarang(), new StatusBarang()));
//		}
		List<KirimProdukAset> listKirimProdukAset=new ArrayList<KirimProdukAset>();
		if(CommonUtil.isNotNullOrEmpty(vo.getDistribusiAsetDetail())){
			for(DistribusiAsetDetailVO modelVo:vo.getDistribusiAsetDetail()){
				KirimProdukAset kirimProdukAset=new KirimProdukAset();
				kirimProdukAset.setNoKirim(strukKirim);
				if(CommonUtil.isNotNullOrEmpty(modelVo.getRegistrasiAset())){
					kirimProdukAset.setNoRegisterAset(registrasiAsetConverter.transferVOToModel(modelVo.getRegistrasiAset(), new RegistrasiAset()));
				}
				kirimProdukAset.setQtyProduk(1.0);
				listKirimProdukAset.add(kirimProdukAset);
				
			}
		}
		strukKirim.getKirimProdukAset().clear();
		strukKirim.getKirimProdukAset().addAll(listKirimProdukAset);
		strukKirim=strukKirimDao.save(strukKirim);
		
	}
	
	@Transactional(readOnly=false)
	private String getRunningNumber(String kegunaan) {
		RunningNumber runningNumber = runningNumberDao.findByResetAndKegunaan("0", kegunaan);
		
		Integer number = (runningNumber.getNomerTerbaru() + (Integer) 1);
		runningNumber.setNomerTerbaru(runningNumber.getNomerTerbaru() + (Integer) 1);
		String noOrderIntern = StringUtil.formatNumber(number.toString(), 6);
		runningNumberDao.save(runningNumber);
		return noOrderIntern;
	}

	@Override
	public Map<String, Object> findByStrukKirimNoRec(String noRec) {
		Map<String, Object> result = new HashMap<String, Object>();
		result.put("header", strukKirimDao.findHeader(noRec));
		result.put("detail", strukKirimDao.findDetail(noRec));
		return result;
	}

	@Override
	@Transactional(readOnly=false)
	public Map<String, Object> saveKonfirmasiAset(KonfirmasiAsetVO vo) {
		List<KirimProdukAset> listKirimProdukAset=new ArrayList<KirimProdukAset>();
		if(CommonUtil.isNotNullOrEmpty(vo.getStrukKirimVO())){
			listKirimProdukAset=kirimProdukAsetDao.findByStrukKirim(vo.getStrukKirimVO().getNoRec());
		}
		KelompokTransaksi kelompokTransaksi = new KelompokTransaksi();
		kelompokTransaksi.setId(Integer.parseInt(GetSettingDataFixed("KdKelompokTransaksiKonfirmasiBarang")));
		StrukKonfirmasi strukKonfirmasi = new StrukKonfirmasi();
		strukKonfirmasi.setTglKonfirmasi(new Date());
		strukKonfirmasi.setRuangan(getRuanganByUserLogin());
		strukKonfirmasi.setKelompokTransaksi(kelompokTransaksi);
		strukKonfirmasi.setNoKonfirmasi(GenerateNoVerifikasi());
		strukKonfirmasiDao.save(strukKonfirmasi);
		if(CommonUtil.isNotNullOrEmpty(vo.getKirimProdukAsetVO())){
			for(KirimProdukAsetVO kirimProdukAsetVO:vo.getKirimProdukAsetVO()){
				if(CommonUtil.isNotNullOrEmpty(kirimProdukAsetVO.getRegistrasiAset())){
					if(CommonUtil.isNotNullOrEmpty(listKirimProdukAset)){
						for(KirimProdukAset data:listKirimProdukAset){
							if(CommonUtil.isNotNullOrEmpty(data.getNoRegisterAset())){
								if(kirimProdukAsetVO.getRegistrasiAset().getNoRec().equalsIgnoreCase(data.getNoRegisterAset().getNoRec())){
									KirimProdukAset kirimProdukAset=kirimProdukAsetDao.findOne(kirimProdukAsetVO.getNoRec());
									kirimProdukAset.setNoKonfirmasi(strukKonfirmasi);
									kirimProdukAsetDao.save(kirimProdukAset);
									
									RegistrasiAset registrasiAset=registrasiAsetDao.findByNoRec(kirimProdukAsetVO.getRegistrasiAset().getNoRec());
									registrasiAset.setRuangan(getRuanganByUserLogin());
									registrasiAsetDao.save(registrasiAset);
								}
							}
						}
					}
				}
			}
			
		}
		Map<String,Object> result=new HashMap<String,Object>();
		return result;
	}
	
	private String GenerateNoVerifikasi() {
		Date dateNow=new Date();
		Integer month=DateUtil.getMonthFromDate(dateNow);
		Integer year=DateUtil.getYearFromDate(dateNow);
		Long count=strukKirimDao.count();
		
		String monthNow=month.toString();
		String yearNow=year.toString().substring(2, 4);
		String noOrder=null;
		
		count++;
		if(count.toString().length()==1){
			noOrder="00000";}
		else if(count.toString().length()==2){
			noOrder="0000";}
		else if(count.toString().length()==3){
			noOrder="000";}
		else if(count.toString().length()==4){
			noOrder="00";}
		else if(count.toString().length()==5){
			noOrder="0";}
		if(monthNow.length()==1)
			monthNow = "0"+monthNow;

		return yearNow+monthNow+noOrder+count;
	}

	@Override
	public Map<String, Object> daftarBarangAset(Integer page, Integer limit, String sort, String dir,Integer ruanganId) {
		int totalRow = registrasiAsetDaoCustom.barangAsetCount(ruanganId);
		int totalPages = 0;
		int pageRequested = page;

		if (totalRow > 0) {
			totalPages = (int) Math.ceil((double) totalRow / (double) limit);
		} else {
			totalPages = 0;
		}

		if (pageRequested > totalPages)
			pageRequested = totalPages;
		int rowStart = pageRequested * limit - limit;
		if (rowStart < 0) {
			rowStart = 0;
		}
		int rowEnd = limit;
		Map<String, Object> result=new HashMap<String,Object>();
		result.put("data", registrasiAsetDaoCustom.baragAsetList(rowStart, rowEnd, sort, dir,ruanganId));
		result.put("totalPages", totalPages);
		result.put("totalRow", totalRow);
		return result;
	}
	
	
}