package com.jasamedika.medifirst2000.service.impl;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

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

import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.PenyusunanTRPNBPDao;
import com.jasamedika.medifirst2000.dao.custom.PenyusunanTRPNBPDaoCustom;
import com.jasamedika.medifirst2000.entities.PenyusunanDetailTRPNPB;
import com.jasamedika.medifirst2000.entities.PenyusunanTRPNPB;
import com.jasamedika.medifirst2000.entities.Produk;
import com.jasamedika.medifirst2000.service.PenyusunanTRPNBPService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.DateUtil;
import com.jasamedika.medifirst2000.vo.PenyusunanDetailTRPNPBVO;
import com.jasamedika.medifirst2000.vo.PenyusunanTRPNPBVO;
import com.jasamedika.medifirst2000.vo.ProdukVO;

@Service("PenyusunanTRPNBPService")
public class PenyusunanTRPNBPServiceImpl implements PenyusunanTRPNBPService {

	@Autowired
	private PenyusunanTRPNBPDaoCustom daoCustom;

	@Autowired
	private PenyusunanTRPNBPDao daoPenyusunanTRPNPB;

	@Autowired
	private BaseConverterImpl<PenyusunanTRPNPBVO, PenyusunanTRPNPB> penyusunanTRPNPBConverter;

	@Autowired
	private BaseConverterImpl<PenyusunanDetailTRPNPBVO, PenyusunanDetailTRPNPB> penyusunanDetailTRPNPBConverter;

	@Autowired
	private BaseConverterImpl<ProdukVO, Produk> produkConverter;

	@Override
	public Map<String, Object> getPenyusunanTRPNBP(Integer page, Integer limit, String sort, String dir,
			String dateStart, String dateEnd) {

		Map<String, Object> result = new HashMap<String, Object>();
		try {
			System.out.println("=======START GET PENYUSUNAN TRPNBP=======");

			int totalRow = daoCustom.findCount(dateStart, dateEnd);
			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;

			result.put("result", daoCustom.getPenyusunanTRPNBP(rowStart, rowEnd, sort, dir, dateStart, dateEnd));
			result.put("totalPages", totalPages);
			result.put("totalRow", totalRow);
			System.out.println("=======END GET PENYUSUNAN TRPNBP=======");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	@Override
	public Map<String, Object> savePenyusunanTRPNBP(PenyusunanTRPNPBVO vo) {

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

		try {
			System.out.println("=======START SAVE PENYUSUNAN TRPNBP=======");
			PenyusunanTRPNPB penyusunan = penyusunanTRPNPBConverter.transferVOToModel(vo, new PenyusunanTRPNPB());
			penyusunan.setTahun(vo.getTahun());
			penyusunan.setProsentase(vo.getProsentase());
			penyusunan.setPeriodeAwal(vo.getPeriodeAwal());
			penyusunan.setPeriodeAkhir(vo.getPeriodeAkhir());
			penyusunan.setStatus(vo.getStatus());
			penyusunan.setTglPenyusunan(DateUtil.getShortDate());
			// set detail penyusunan trpnpb
			if (CommonUtil.isNotNullOrEmpty(vo.getPenyusunanDetailTRPNPBSet())) {
				Set<PenyusunanDetailTRPNPB> listPenyusunanDetailTRPNPB = new HashSet<PenyusunanDetailTRPNPB>();
				for (PenyusunanDetailTRPNPBVO modelMap : vo.getPenyusunanDetailTRPNPBSet()) {
					PenyusunanDetailTRPNPB detailPenyusunanTRPNPB = penyusunanDetailTRPNPBConverter
							.transferVOToModel(modelMap, new PenyusunanDetailTRPNPB());
					if (CommonUtil.isNotNullOrEmpty(modelMap.getProduk())) {
						detailPenyusunanTRPNPB
								.setProduk(produkConverter.transferVOToModel(modelMap.getProduk(), new Produk()));
					}
					detailPenyusunanTRPNPB.setHarga(modelMap.getHarga());
					detailPenyusunanTRPNPB.setVolumeRealisasi(modelMap.getVolumeRealisasi());
					detailPenyusunanTRPNPB.setVolumeTarget(modelMap.getVolumeTarget());
					detailPenyusunanTRPNPB.setTotalRealisasi(modelMap.getVolumeRealisasi() * modelMap.getHarga());
					detailPenyusunanTRPNPB.setTotalTarget(modelMap.getVolumeTarget() * modelMap.getHarga());
					detailPenyusunanTRPNPB.setPenyusunanTRPNPB(penyusunan);
					listPenyusunanDetailTRPNPB.add(detailPenyusunanTRPNPB);
				}
				penyusunan.setPenyusunanDetailTRPNPBSet(listPenyusunanDetailTRPNPB);
			}
			PenyusunanTRPNPB resultModel = daoPenyusunanTRPNPB.save(penyusunan);
			result.put("noRec", resultModel.getNoRec());
			System.out.println("=======END SAVE PENYUSUNAN TRPNBP=======");
		} catch (Exception e) {
			e.printStackTrace();
		}

		return result;
	}

	@Override
	public Map<String, Object> getDaftarPenyusunanTRPNBP(Integer page, Integer limit, Integer tahun) {

		Map<String, Object> result = new HashMap<String, Object>();
		try {
			System.out.println("=======START GET DAFTAR PENYUSUNAN TRPNBP=======");

			int totalRow = daoCustom.findCountDaftarPenyusunanTRPNPB(tahun);
			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;

			result.put("result", daoCustom.getDaftarPenyusunanTRPNBP(rowStart, rowEnd, tahun));
			result.put("totalPages", totalPages);
			result.put("totalRow", totalRow);
			System.out.println("=======END GET DAFTAR PENYUSUNAN TRPNBP=======");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

}
