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.dao.KelompokTransaksiDao;
import com.jasamedika.medifirst2000.dao.StokProdukGlobalDao;
import com.jasamedika.medifirst2000.dao.StrukClosingDao;
import com.jasamedika.medifirst2000.dao.custom.StokProdukGlobalDaoCustom;
import com.jasamedika.medifirst2000.entities.KelompokTransaksi;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.entities.StokProdukDetailOpname;
import com.jasamedika.medifirst2000.entities.StokProdukGlobal;
import com.jasamedika.medifirst2000.entities.StrukClosing;
import com.jasamedika.medifirst2000.service.KartuStokService;
import com.jasamedika.medifirst2000.service.StokOpNameService;
import com.jasamedika.medifirst2000.service.StokProdukGlobalService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.vo.StokOpNameVO;
import com.jasamedika.medifirst2000.vo.StokProdukGlobalVO;

@Service("stokOpNameService")
public class StokOpNameServiceImpl extends BaseAngaranServiceImpl implements StokOpNameService {
	
	@Autowired
	private StokProdukGlobalDaoCustom stokProdukGlobalDaoCustom;
	
	@Autowired
	private StokProdukGlobalDao stokProdukGlobalDao;
	
	@Autowired
	private StrukClosingDao strukClosingDao;
	
	@Autowired
	private KartuStokService kartuStokService;
	
	@Autowired
	private StokProdukGlobalService stokProdukGlobalService;
	
	@Autowired
	private KelompokTransaksiDao kelompokTransaksiDao;

	@Override
	public Map<String, Object> getStokGlobalByProduk(Integer kelompokProdukId, Integer produkId,Integer jenisProdukId) {
		Ruangan ruangan =getRuanganByUserLogin();
		Map<String,Object> result=new HashMap<String,Object>();
		result.put("data", stokProdukGlobalDaoCustom.getStokGlobalByProduk(kelompokProdukId,produkId,ruangan,jenisProdukId));
		return result;
	}

	@Override
	@Transactional(readOnly=false)
	public Map<String, Object> saveStokOpName(StokOpNameVO vo) {
			List<Integer> dataId=new ArrayList<Integer>();
			
			if(CommonUtil.isNotNullOrEmpty(vo.getStokProdukGlobal())){
				for(StokProdukGlobalVO stokVo:vo.getStokProdukGlobal()){
					Set<StokProdukDetailOpname> stokProdukDetailOpnameList=new HashSet<StokProdukDetailOpname>();
					if(CommonUtil.isNotNullOrEmpty(stokVo)){
						if(CommonUtil.isNotNullOrEmpty(stokVo)){
							StokProdukGlobal model=stokProdukGlobalDao.findOne(stokVo.getId());
							Double selisih=0.0;
							Double stokProdukReal=0.0;
							if(CommonUtil.isNotNullOrEmpty(model.getQtyProduk())){
								if(CommonUtil.isNotNullOrEmpty(stokVo.getStokReal())){
									stokProdukReal=stokVo.getStokReal();
								}
								selisih=model.getQtyProduk()-(stokProdukReal);
							}
							model.setQtyProduk(model.getQtyProduk()-selisih);
							if(model.getQtyProduk()>stokProdukReal){
								kartuStokService.saveKartuStok(selisih, model.getProduk(), model.getRuangan(), "penyesuaian Penambahan Stok Op Name", true, new Date());
								stokProdukGlobalService.updateStokProdukDetailFromStokOpName(model.getProdukId(), model.getRuangan(), null, selisih, null);
							}else{
								if(selisih<0){
									selisih=-1*selisih;
									kartuStokService.saveKartuStok(selisih, model.getProduk(), model.getRuangan(), "penyesuaian Penambahan Stok Op Name", true, new Date());
									stokProdukGlobalService.updateStokProdukDetailFromStokOpName(model.getProdukId(), model.getRuangan(), null, selisih, null);
								}else{
									kartuStokService.saveKartuStok(selisih, model.getProduk(), model.getRuangan(), "penyesuaian pengurangan Stok Op Name",false , new Date());
									stokProdukGlobalService.updateStokProdukDetail(model.getProdukId(), model.getRuangan(), null, selisih, null);
								}
								
								
							}
							stokProdukGlobalDao.save(model);
							dataId.add(model.getId());
							
							StrukClosing strukClosing=new StrukClosing();
							Integer a=new Integer(GetSettingDataFixed("KdKelompokTransaksiStokOpName"));
							KelompokTransaksi kelompokTransaksi=kelompokTransaksiDao.findById(a);
							strukClosing.setKelompokTransaksi(kelompokTransaksi);
							strukClosing.setRuangan(model.getRuangan());
							strukClosing.setTglClosing(vo.getTglClosing());
							StokProdukDetailOpname stokProdukDetailOpname=new StokProdukDetailOpname();
							stokProdukDetailOpname.setStrukClosing(strukClosing);
							stokProdukDetailOpname.setAsalProduk(model.getAsalProduk());
							stokProdukDetailOpname.setHargaDiscount(model.getHargaDiscount());
							stokProdukDetailOpname.setHargaNetto1(model.getHargaNetto1());
							stokProdukDetailOpname.setHarganetto2(model.getHargaNetto2());
							stokProdukDetailOpname.setKdProfile((short) 0);
							stokProdukDetailOpname.setKeteranganLainnya("");
							stokProdukDetailOpname.setPersenDiscount(model.getPersenDiscount());
							stokProdukDetailOpname.setProduk(model.getProduk());
							stokProdukDetailOpname.setQtyProdukiInExt(0.0);
							stokProdukDetailOpname.setQtyProdukSystem(model.getQtyProduk());
							stokProdukDetailOpname.setQtyProdukReal(stokProdukReal);
							stokProdukDetailOpnameList.add(stokProdukDetailOpname);
							strukClosing.setStokProdukDetailOpname(stokProdukDetailOpnameList);
							strukClosingDao.save(strukClosing);
						
						}
					}
				}
			}
			Map<String,Object> result=new HashMap<String,Object>();
			result.put("result",dataId);
			return result;
		
	}

	@Override
	public Map<String, Object> gridStokOpName(String tanggalAwal,String tanggalAhir) {
		Ruangan ruangan =getRuanganByUserLogin();
		Map<String,Object> result=new HashMap<String,Object>();
		result.put("data", strukClosingDao.gridStokOpName(tanggalAwal,tanggalAhir,ruangan.getId()));
		return result;
	}
	
	@Override
	public Map<String, Object> detailStokOpName(String tglClosing) {
		Map<String,Object> result=new HashMap<String,Object>();
		result.put("data", strukClosingDao.detailStokOpName(tglClosing));
		return result;
	}
	
	
}
