package sikd.sikd5.sikd5ejb.dao;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.session.SqlSession;

import sikd.sikd5.sikd5bean.fault.SIKDServiceException;
import sikd.sikd5.sikd5bean.query.AmbilPerkiraanBelanjaBean;
import sikd.sikd5.sikd5bean.query.InfoPengiriman;
import sikd.sikd5.sikd5bean.tabel.simpatik.Perkiraanbelanja;
import sikd.sikd5.sikd5bean.tabel.simpatik.Perkiraanbelanjaakun;
import sikd.sikd5.sikd5bean.ws.simpatik.PerkiraanBelanjaAkun_WS;
import sikd.sikd5.sikd5bean.ws.simpatik.PerkiraanBelanja_WS;
import sikd.sikd5.sikd5ejb.mapper.PerkiraanBelanjaMapper;

/**
 *
 * @author : agus
 * @tanggal : Nov 12, 2018
 */
public class PerkiraanBelanjaDao {

	public long insert(PerkiraanBelanja_WS perkiraanBelanja, String nmfile, SqlSession session)
			throws SIKDServiceException {
		long hasil = 0;
		try {
			if (perkiraanBelanja == null) {
				throw new SIKDServiceException("Data Kosong");
			}
			if (perkiraanBelanja.getPerkiraanBelanjaAkuns() == null || perkiraanBelanja.getPerkiraanBelanjaAkuns().size() < 1) {
				throw new SIKDServiceException("Data Detil Kosong");
			}
			double nb[] = new double[12];
			for (PerkiraanBelanjaAkun_WS a : perkiraanBelanja.getPerkiraanBelanjaAkuns()) {
				nb[0] = nb[0] + a.getNilaib1();
				nb[1] = nb[1] + a.getNilaib2();
				nb[2] = nb[2] + a.getNilaib3();
				nb[3] = nb[3] + a.getNilaib4();
				nb[4] = nb[4] + a.getNilaib5();
				nb[5] = nb[5] + a.getNilaib6();
				nb[6] = nb[6] + a.getNilaib7();
				nb[7] = nb[7] + a.getNilaib8();
				nb[8] = nb[8] + a.getNilaib9();
				nb[9] = nb[9] + a.getNilaib10();
				nb[10] = nb[10] + a.getNilaib11();
				nb[11] = nb[11] + a.getNilaib12();
			}
			if (nb[perkiraanBelanja.getBulan() - 1] < 1 || nb[perkiraanBelanja.getBulan()] < 1 || nb[perkiraanBelanja.getBulan() + 1] < 1
					|| nb[perkiraanBelanja.getBulan() + 2] < 1) {
				throw new SIKDServiceException("Perkiraan belanja bulan ini dan 3 bulan ke depan tidak boleh kosong");

			}
			PerkiraanBelanjaMapper mapper = session.getMapper(PerkiraanBelanjaMapper.class);
			Date tglPengiriman = new Date();
			int uploadke = 1;

			InfoPengiriman info = mapper.getInfoPengiriman(perkiraanBelanja.getKodeSatker(), perkiraanBelanja.getTahunAnggaran(),
					perkiraanBelanja.getBulan());
			if (info != null) {
				if (info.getPenyusunanKe() >= perkiraanBelanja.getPenyusunanKe()) {
					throw new SIKDServiceException("Penyusunan Ke " + perkiraanBelanja.getPenyusunanKe() + " sudah pernah dikirim");
				}
				if (info.getUploadKe() != null) {
					uploadke = info.getUploadKe() + 1;
				}
			}
			long perkiraanBelanjaIndex = mapper.insertPerkiraanBelanja(perkiraanBelanja, tglPengiriman, uploadke, nmfile);
//			System.out.println("perkiraanBelanjaIndex :"+perkiraanBelanjaIndex);
			if (perkiraanBelanjaIndex > 0) {
				for (PerkiraanBelanjaAkun_WS perkiraanBelanjaAkun_WS : perkiraanBelanja.getPerkiraanBelanjaAkuns()) {
					long perkiraanBelanjaAkunIndex = mapper.insertPerkiraanBelanjaAkun(perkiraanBelanjaIndex, perkiraanBelanjaAkun_WS);
					if (perkiraanBelanjaAkunIndex < 1) {
						throw new SIKDServiceException("Insert Perkiraan Belanja Akun gagal");
					}
				}
			}

		} catch (Exception e) {
			throw new SIKDServiceException(e.getMessage());
		}
		return hasil;
	}

	public InfoPengiriman getInfoPengiriman(String kdsatker, short tahun, short bulan, SqlSession session)
			throws SIKDServiceException {
		InfoPengiriman info = new InfoPengiriman();
		try {
			PerkiraanBelanjaMapper mapper = session.getMapper(PerkiraanBelanjaMapper.class);
			info = mapper.getInfoPengiriman(kdsatker, tahun, bulan);
//	             Logger.getLogger(KontakPemdaDao.class.getName()).log(Level.INFO, null, info);
		} catch (Exception e) {
			throw new SIKDServiceException(e.getMessage());
		}
		return info;
	}

	public List<InfoPengiriman> getInfoPengirimanXmlPerBulan(String kdsatker, short tahun, SqlSession session)
			throws SIKDServiceException {
		List<InfoPengiriman> infos = new ArrayList<InfoPengiriman>();
		try {
			PerkiraanBelanjaMapper mapper = session.getMapper(PerkiraanBelanjaMapper.class);
			infos = mapper.getInfoPengirimanXmlPerBulan(kdsatker, tahun);
//	             Logger.getLogger(KontakPemdaDao.class.getName()).log(Level.INFO, null, info);
		} catch (Exception e) {
			throw new SIKDServiceException(e.getMessage());
		}
		return infos;
	}

	public List<InfoPengiriman> getInfoPengirimanXmlPerPemda(short tahun, short bulan, Date tgawal, Date tgakhir, SqlSession session)
			throws SIKDServiceException {
		List<InfoPengiriman> infos = new ArrayList<InfoPengiriman>();
		try {
			PerkiraanBelanjaMapper mapper = session.getMapper(PerkiraanBelanjaMapper.class);
			infos = mapper.getInfoPengirimanXmlPerPemda(tahun, bulan, tgawal, tgakhir);
//	             Logger.getLogger(KontakPemdaDao.class.getName()).log(Level.INFO, null, info);
		} catch (Exception e) {
			throw new SIKDServiceException(e.getMessage());
		}
		return infos;
	}

	public List<Perkiraanbelanjaakun> getPerkiraanbelanjaAkun(String kodeSatker, short tahun, short bulan, SqlSession session)
			throws SIKDServiceException {
		List<Perkiraanbelanjaakun> hasil = new ArrayList<Perkiraanbelanjaakun>();
		try {
			PerkiraanBelanjaMapper mapper = session.getMapper(PerkiraanBelanjaMapper.class);
			Perkiraanbelanja pb = mapper.getPerkiraanBelanjaTerbaru(kodeSatker, tahun, bulan);
			if (pb != null) {
				if (pb.getPerkiraanbelanjaindex() != 0) {
					hasil = mapper.getPerkiraanBelanjaAkun(pb.getPerkiraanbelanjaindex());
				}
			}

		} catch (Exception e) {
			throw new SIKDServiceException(e.getMessage());
		}
		return hasil;
	}

	public List<AmbilPerkiraanBelanjaBean> ambilPerkiraanBelanjaPerPemda(short tahun, short bulan,
			Date tgakhir, String[] inAkun, SqlSession session) throws SIKDServiceException {
		List<AmbilPerkiraanBelanjaBean> hasil = new ArrayList<AmbilPerkiraanBelanjaBean>();
		PerkiraanBelanjaMapper mapper = session.getMapper(PerkiraanBelanjaMapper.class);
		hasil = mapper.ambilPerkiraanBelanjaPerPemda(tahun, bulan, tgakhir, inAkun);
		return hasil;

	}
}
