package sikd.sikd5.ctrl.simpatik;

import static com.github.adminfaces.starter.util.Utils.addDetailMessage;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
import javax.naming.Context;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.TabChangeEvent;
import org.primefaces.model.UploadedFile;

import sikd.sikd5.ctrl.template.TahunPemdaFilter;
import sikd.sikd5.model.DataPerkiraanBelanja;
import sikd.sikd5.model.DataPosisiKas;
import sikd.sikd5.sikd5bean.fault.SIKDServiceException;
import sikd.sikd5.sikd5bean.query.Periode;
import sikd.sikd5.sikd5bean.query.PerkiraanBelanjaAkunPerPemda;
import sikd.sikd5.sikd5bean.query.PosisiKasAkunPerPemda;
import sikd.sikd5.sikd5bean.tabel.mgr.TUserAccount;
import sikd.sikd5.sikd5bean.tabel.simpatik.Perkiraanbelanjaakun;
import sikd.sikd5.sikd5bean.util.PropertiesLoader;
import sikd.sikd5.sikd5bean.util.SIKDUtil;
import sikd.sikd5.sikd5bean.util.ServerUtil;
import sikd.sikd5.sikd5bean.util.SikdSessionUtil;
import sikd.sikd5.sikd5bean.ws.simpatik.PerkiraanBelanja_WS;
import sikd.sikd5.sikd5ejb.session.PerkiraanBelanjaSessionBeanRemote;
import sikd.sikd5.sikd5ejb.session.RefSimpatikSessionBeanRemote;
import sikd.sikd5.sikd5ejb.session.SettingsSessionBeanRemote;
import sikd.sikd5.sikd5ejb.session.UploadFileSessionBeanRemote;
import sikd.sikd5.sikd5ejb.session.login.LoginSessionBeanRemote;
import sikd.sikd5.sikd5service.util.XmlSikdUtil;

/**
 * @author : agus
 * @tanggal : Jan 17, 2019
 */
@Named
@SessionScoped

public class UploadDataPerkiraanBelanjaCtrl extends TahunPemdaFilter implements Serializable {

	private static final long serialVersionUID = 1L;
	UploadFileSessionBeanRemote uploadFileSes;
	PerkiraanBelanjaSessionBeanRemote pbSes;
	SettingsSessionBeanRemote settingSes;
	RefSimpatikSessionBeanRemote refSes;
	private List<DataPerkiraanBelanja> perkiraanBelanjas;
	DataPosisiKas posisiKas;
	List<PosisiKasAkunPerPemda> akunPosisiKass = new ArrayList<PosisiKasAkunPerPemda>();
	List<PerkiraanBelanjaAkunPerPemda> akunPerkiraanBelanjas = new ArrayList<PerkiraanBelanjaAkunPerPemda>();
//	List<PerkiraanBelanjaAkunPerPemda> akunPerkiraanBelanjaBersihs = new ArrayList<PerkiraanBelanjaAkunPerPemda>();

	String[] inAkun = { "6", "7" };
	int bulan = 0;
	List<Perkiraanbelanjaakun> dataPerkiraanBelanja;

	boolean handleFileUpload;
	boolean getObjekFromXM;
	boolean insertData;
	boolean uploadDisable;
	private List<String> stats = new ArrayList();
	UploadedFile uploadedFile;

	@PostConstruct
	public void init() {
		try {
			super.init();

			Context ctxOffice = ServerUtil.getOfficeContextV3();
			uploadFileSes = (UploadFileSessionBeanRemote) ctxOffice.lookup(SikdSessionUtil.UPLOAD_FILE_SESSION);
			pbSes = (PerkiraanBelanjaSessionBeanRemote) ctxOffice.lookup(SikdSessionUtil.PERKIRAAN_BELANJA_SESSION);
			settingSes = (SettingsSessionBeanRemote) ctxOffice.lookup(SikdSessionUtil.SETTINGS_SESSION);
			refSes = (RefSimpatikSessionBeanRemote) ctxOffice.lookup(SikdSessionUtil.REF_SIMPATIK_SESSION);

			bulan = new Date().getMonth();
			perkiraanBelanjas = new ArrayList<DataPerkiraanBelanja>();

			for (Periode p : SIKDUtil.getBulans()) {
				DataPerkiraanBelanja dp = new DataPerkiraanBelanja(p.getBulanShort(), p.getBulanString(), akunPerkiraanBelanjas);
				perkiraanBelanjas.add(dp);
			}

		} catch (Exception ex) {
			Logger.getLogger(UploadDataPerkiraanBelanjaCtrl.class.getName()).log(Level.SEVERE, null, ex);
		}
	}

	public void handleFileUpload(FileUploadEvent e) {
		try {
			handleFileUpload = false;
			getObjekFromXM = false;
			insertData = false;
			stats.clear();
			String kdikd = "PBB";
			if (getSelectedYear() != null && getSelectedYear().getTahun() > 0 && getSelectedPemda() != null) {
				uploadedFile = e.getFile();
				String namaFileUpload = uploadedFile.getFileName().trim();
//				System.out.println("panjang " + namaFileUpload.length());
//				System.out.println("tahun " + namaFileUpload.substring(0, 4));
//				System.out.println("kodesatker " + namaFileUpload.substring(4, 10));
//				System.out.println("kode ikd " + namaFileUpload.substring(10, 13));
//				System.out.println("bulan " + namaFileUpload.substring(13, 15));
				if (namaFileUpload.length() != 19) {
					throw new SIKDServiceException("Nama File panjangnya tidak valid");
				}
				if (!namaFileUpload.substring(0, 4).equals(String.valueOf(getSelectedYear().getTahun()))) {
					throw new SIKDServiceException("Nama File Tahunnya tidak sesuai");
				}
				if (!namaFileUpload.substring(4, 10).equals(getSelectedPemda().getKodeSatker())) {
					throw new SIKDServiceException("Nama File Kode Satkernya tidak sesuai");
				}
				if (!namaFileUpload.substring(10, 13).equals(kdikd)) {
					throw new SIKDServiceException("Nama File Kode Data tidak sesuai");
				}

				stats.add("Upload data berhasil");
				handleFileUpload = true;
				byte[] berkasPerkiraanBelanja = uploadedFile.getContents();
				XmlSikdUtil.cekBerkasZip(berkasPerkiraanBelanja);

				Context ctxOffice = ServerUtil.getOfficeContextV3();
				LoginSessionBeanRemote sessionLogin = (LoginSessionBeanRemote) ctxOffice
						.lookup(SikdSessionUtil.LOGIN_SESSION);
				TUserAccount tuserAccount = sessionLogin.getUserAccountbyName(getSelectedPemda().getKodeSatker());
				String pp = "";
				for (int i = 0; i < tuserAccount.getPassword().length; i++) {
					pp = pp + tuserAccount.getPassword()[i];
				}
				int bulanFile = Integer.valueOf(namaFileUpload.substring(13, 15));
				String uploadPath = ((Properties) PropertiesLoader.loadProperties("sikd.properties"))
						.getProperty("uploadPath");
				String[] filenya = XmlSikdUtil.simpanExtract(uploadPath, kdikd, (short) bulan, getSelectedPemda().getKodeSatker(),
						getSelectedYear().getTahun(), berkasPerkiraanBelanja, pp);
				Object obj = XmlSikdUtil.parsingXML(filenya[1], kdikd);
				PerkiraanBelanja_WS perkiraanBelanja = (PerkiraanBelanja_WS) obj;

				if (!namaFileUpload.substring(0, 4).equals(String.valueOf(perkiraanBelanja.getTahunAnggaran()))) {
					throw new SIKDServiceException("XML Tahunnya tidak sesuai");
				}
				if (!namaFileUpload.substring(4, 10).equals(perkiraanBelanja.getKodeSatker())) {
					throw new SIKDServiceException("XML Kode Satkernya tidak sesuai");
				}
				if ((short) bulanFile != perkiraanBelanja.getBulan()) {
					throw new SIKDServiceException("XML bulannya tidak sesuai");
				}
				pbSes.insert(perkiraanBelanja, filenya[0]);
				bulan = bulanFile - 1;
				loadNilai();

				stats.add("Berhasil : Insert Sukses");

			} else {
				handleFileUpload = false;
				throw new SIKDServiceException("Parameter kurang lengkap");
			}

		} catch (Exception ex) {
			ex.printStackTrace();
			stats.add("<font color='red'>Gagal : " + ex.getMessage() + "</font>");
		} finally {
			addDetailMessage(statString());
		}
	}

	String statString() {
		String hasil = "";
		for (String s : stats) {
			hasil = hasil + s.trim() + "<br>";
		}
		return hasil;
	}

	public void handleFileUploadChange() {
		stats.clear();
	}

	public List<String> getStats() {
		return stats;
	}

	public void setStats(List<String> stats) {
		this.stats = stats;
	}

//	void nolkanNilai() {
//		for (PerkiraanBelanjaAkunPerPemda akun : akunPerkiraanBelanjas) {
//			akun.setNilaib1(0);
//			akun.setNilaib2(0);
//			akun.setNilaib3(0);
//			akun.setNilaib4(0);
//			akun.setNilaib5(0);
//			akun.setNilaib6(0);
//			akun.setNilaib7(0);
//			akun.setNilaib8(0);
//			akun.setNilaib9(0);
//			akun.setNilaib10(0);
//			akun.setNilaib11(0);
//			akun.setNilaib12(0);
//		}
//	}

	void loadRef() {
		try {
			akunPerkiraanBelanjas.clear();
			akunPosisiKass = refSes.getRefsimpatiks(getSelectedYear().getTahun(), inAkun);
//			long dob = 0;
//			for (PosisiKasAkunPerPemda akun : akunPosisiKass) {
//				PerkiraanBelanjaAkunPerPemda akunPerkiraanBelanja = new PerkiraanBelanjaAkunPerPemda();
//				akunPerkiraanBelanja.setKdakun(akun.getKdakun());
//				akunPerkiraanBelanja.setUrakun(akun.getUrakun());
//				akunPerkiraanBelanjas.add(akunPerkiraanBelanja);
//			}

//			perkiraanBelanjas.get(bulan).setAkuns(akunPerkiraanBelanjas);
		} catch (Exception ex) {
			Logger.getLogger(UploadDataPerkiraanBelanjaCtrl.class.getName()).log(Level.SEVERE, null, ex);
		}
	}

	void loadNilai() {

		try {
//			nolkanNilai();
			akunPerkiraanBelanjas.clear();
			short bulannya = (short) (bulan + 1);
//				dataKas = pkSes.getPosisiKasAkun(getSelectedPemda().getKodeSatker(), getSelectedYear().getTahun(), bulannya);
			dataPerkiraanBelanja = pbSes.getPerkiraanBelanjaAkun(getSelectedPemda().getKodeSatker(), getSelectedYear().getTahun(), bulannya);
			for (Perkiraanbelanjaakun dt0 : dataPerkiraanBelanja) {
				PerkiraanBelanjaAkunPerPemda dt = new PerkiraanBelanjaAkunPerPemda();
				dt.setKdakun(dt0.getKdakun());
				dt.setNilaib1(dt0.getNilaib1());
				dt.setNilaib2(dt0.getNilaib2());
				dt.setNilaib3(dt0.getNilaib3());
				dt.setNilaib4(dt0.getNilaib4());
				dt.setNilaib5(dt0.getNilaib5());
				dt.setNilaib6(dt0.getNilaib6());
				dt.setNilaib7(dt0.getNilaib7());
				dt.setNilaib8(dt0.getNilaib8());
				dt.setNilaib9(dt0.getNilaib9());
				dt.setNilaib10(dt0.getNilaib10());
				dt.setNilaib11(dt0.getNilaib11());
				dt.setNilaib12(dt0.getNilaib12());
				for (PosisiKasAkunPerPemda akun : akunPosisiKass) {
					if (dt.getKdakun().equals(akun.getKdakun())) {
						dt.setUrakun(akun.getUrakun());
					}
				}

				akunPerkiraanBelanjas.add(dt);

			}
			setHeaderDetil();
			perkiraanBelanjas.get(bulan).setAkuns(akunPerkiraanBelanjas);
//
//			for (PerkiraanBelanjaAkunPerPemda dt : akunPerkiraanBelanjas) {
//				for (Perkiraanbelanjaakun dt0 : dataPerkiraanBelanja) {
//					if (dt.getKdakun().equals(dt0.getKdakun())) {
//						dt.setNilaib1(dt0.getNilaib1());
//						dt.setNilaib2(dt0.getNilaib2());
//						dt.setNilaib3(dt0.getNilaib3());
//						dt.setNilaib4(dt0.getNilaib4());
//						dt.setNilaib5(dt0.getNilaib5());
//						dt.setNilaib6(dt0.getNilaib6());
//						dt.setNilaib7(dt0.getNilaib7());
//						dt.setNilaib8(dt0.getNilaib8());
//						dt.setNilaib9(dt0.getNilaib9());
//						dt.setNilaib10(dt0.getNilaib10());
//						dt.setNilaib11(dt0.getNilaib11());
//						dt.setNilaib12(dt0.getNilaib12());
//
//					}
//				}
//			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void onYearChange() {
		super.onYearChange();
		loadRef();

	}

	public void onRefresh() {
		super.onRefresh();
		onFilterChange();

	}

	public void onPeriodeChange() {
		super.onRefresh();
		onFilterChange();
	}

	public void onFilterChange() {
		try {
			if (getSelectedYear().getTahun() != 0) {
				// && bulan>0 && bulan <12) {
				loadRef();
//				if (bulan >= 0 && bulan < 12) {
					loadNilai();
//				}
			
//				perkiraanBelanjas.get(bulan).setAkuns(akunPerkiraanBelanjas);
			}
		} catch (Exception e) {
			e.printStackTrace();
			addDetailMessage(e.getMessage());
		}
	}

	void setHeaderDetil() {
		List<PerkiraanBelanjaAkunPerPemda> tmps = new ArrayList<PerkiraanBelanjaAkunPerPemda>();
		tmps.addAll(akunPerkiraanBelanjas);
		
		for (PerkiraanBelanjaAkunPerPemda dt :akunPerkiraanBelanjas) {
			boolean ketemu =false;
			for (PerkiraanBelanjaAkunPerPemda tmp :tmps) {
				if (tmp.getKdakun().startsWith(dt.getKdakun()) && (tmp.getKdakun().trim().length()>dt.getKdakun().trim().length())) {
					ketemu = true;
					break;
				}
			}
			if (ketemu) {
				dt.setDetil("H");
			}else {
				dt.setDetil("D");
			}
		}
	}

	public void onTgAkhirSelect() {
//		addDetailMessage("Tanggal diselect");
	}
//	public String getUpdateRefresh() {
//		return "panelrinci";
//	}

	public void onTabChange(TabChangeEvent event) {
//		System.out.println("event.getTab().getId() :" + event.getTab().getId());
//		System.out.println("bulan :" + bulan);
//		System.out.println("event.getTab().getId() :" + ((TabView) event.getTab().getParent()).getActiveIndex());
		loadNilai();
		
		perkiraanBelanjas.get(bulan).setAkuns(akunPerkiraanBelanjas);

	}

	public List<DataPerkiraanBelanja> getPerkiraanBelanjas() {
		return perkiraanBelanjas;
	}

	public void setPerkiraanBelanjas(List<DataPerkiraanBelanja> perkiraanBelanjas) {
		this.perkiraanBelanjas = perkiraanBelanjas;
	}

	public void onPemdaChange() {
		super.onPemdaChange();
//		getStatusKirim();
		loadNilai();
	}

	public int getBulan() {
		return bulan;
	}

	public void setBulan(int bulan) {
		this.bulan = bulan;
	}

}
