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.enterprise.inject.Specializes;
import javax.inject.Named;
import javax.naming.Context;

import org.primefaces.component.tabview.TabView;
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.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.Posisikasakun;
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.PosisiKas_WS;
import sikd.sikd5.sikd5ejb.session.PosisiKasSessionBeanRemote;
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 UploadDataPosisiKasCtrl extends TahunPemdaFilter implements Serializable {

	private static final long serialVersionUID = 1L;
	UploadFileSessionBeanRemote uploadFileSes;
	PosisiKasSessionBeanRemote pkSes;
	SettingsSessionBeanRemote settingSes;
	RefSimpatikSessionBeanRemote refSes;
	private List<DataPosisiKas> posisiKass;
	DataPosisiKas posisiKas;
	List<PosisiKasAkunPerPemda> akunPosisiKass = new ArrayList<PosisiKasAkunPerPemda>();
	List<PosisiKasAkunPerPemda> akunPosisiKasBersihs = new ArrayList<PosisiKasAkunPerPemda>();
	String[] inAkun = { "1", "2", "3", "4", "5" };
	int bulan = 0;
	List<Posisikasakun> dataKas;

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

	@PostConstruct
	public void init() {
		try {
			super.init();
			Context ctxOffice = ServerUtil.getOfficeContextV3();
			uploadFileSes = (UploadFileSessionBeanRemote) ctxOffice.lookup(SikdSessionUtil.UPLOAD_FILE_SESSION);
			pkSes = (PosisiKasSessionBeanRemote) ctxOffice.lookup(SikdSessionUtil.POSISI_KAS_SESSION);
			settingSes = (SettingsSessionBeanRemote) ctxOffice.lookup(SikdSessionUtil.SETTINGS_SESSION);
			refSes = (RefSimpatikSessionBeanRemote) ctxOffice.lookup(SikdSessionUtil.REF_SIMPATIK_SESSION);

			bulan = new Date().getMonth();
			posisiKass = new ArrayList<DataPosisiKas>();

			for (Periode p : SIKDUtil.getBulans()) {
				DataPosisiKas dp = new DataPosisiKas(p.getBulanShort(), p.getBulanString(), akunPosisiKass);
				posisiKass.add(dp);
			}

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

	public void handleFileUpload(FileUploadEvent e) {
		try {
			handleFileUpload = false;
			getObjekFromXM = false;
			insertData = false;
			stats.clear();
			String kdikd = "PKB";
			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[] berkasPosisiKas = uploadedFile.getContents();
				XmlSikdUtil.cekBerkasZip(berkasPosisiKas);

				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(), berkasPosisiKas, pp);
				Object obj = XmlSikdUtil.parsingXML(filenya[1], kdikd);
				PosisiKas_WS posisiKas = (PosisiKas_WS) obj;

				if (!namaFileUpload.substring(0, 4).equals(String.valueOf(posisiKas.getTahunAnggaran()))) {
					throw new SIKDServiceException("XML Tahunnya tidak sesuai");
				}
				if (!namaFileUpload.substring(4, 10).equals(posisiKas.getKodeSatker())) {
					throw new SIKDServiceException("XML Kode Satkernya tidak sesuai");
				}
				if ((short) bulanFile != posisiKas.getBulan()) {
					throw new SIKDServiceException("XML bulannya tidak sesuai");
				}
				pkSes.insert(posisiKas, 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();
//	        data = null;
	}

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

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

//	void nolkanNilai() {
//		for (PosisiKasAkunPerPemda akun : akunPosisiKass) {
//			akun.setNilai(0);
//		}
//	}

	void loadRef() {
		try {
			akunPosisiKass = refSes.getRefsimpatiks(getSelectedYear().getTahun(), inAkun);
		} catch (Exception ex) {
			Logger.getLogger(UploadDataPosisiKasCtrl.class.getName()).log(Level.SEVERE, null, ex);
		}
	}

	void loadNilai() {

		try {
			akunPosisiKasBersihs.clear();
			short bulannya = (short) (bulan + 1);
			dataKas = pkSes.getPosisiKasAkun(getSelectedPemda().getKodeSatker(), getSelectedYear().getTahun(), bulannya);
			for (Posisikasakun dt0 : dataKas) {
				PosisiKasAkunPerPemda dt = new PosisiKasAkunPerPemda();
				dt.setKdakun(dt0.getKdakun());
				dt.setNilai(dt0.getNilai());
				for (PosisiKasAkunPerPemda ref : akunPosisiKass) {
					if(ref.getKdakun().equals(dt.getKdakun())) {
						dt.setUrakun(ref.getUrakun());
					}
				}
				
				akunPosisiKasBersihs.add(dt);
			}
			setHeaderDetil();
			posisiKass.get(bulan).setAkuns(akunPosisiKasBersihs);
			
			
//			for (PosisiKasAkunPerPemda dt : akunPosisiKass) {
//				for (Posisikasakun dt0 : dataKas) {
//					if (dt.getKdakun().equals(dt0.getKdakun())) {
//						dt.setNilai(dt0.getNilai());
//					}
//				}
//			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

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

	}

	public void onRefresh() {
		super.onRefresh();
		loadNilai();
	}

	public void onPeriodeChange() {
		super.onRefresh();
		onFilterChange();
		
	}
	void setHeaderDetil() {
		List<PosisiKasAkunPerPemda> tmps = new ArrayList<PosisiKasAkunPerPemda>();
		tmps.addAll(akunPosisiKasBersihs);
		
		for (PosisiKasAkunPerPemda dt :akunPosisiKasBersihs) {
			boolean ketemu =false;
			for (PosisiKasAkunPerPemda 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 onFilterChange() {
		try {

			if (getSelectedYear() != null && getSelectedYear().getTahun() != 0) {
				// && bulan > 0 && bulan < 12) {
				loadRef();
//				if (bulan > 0 && bulan < 12) {
					loadNilai();
//				}
//				posisiKass.get(bulan).setAkuns(akunPosisiKasBersihs);
			}
		} catch (Exception e) {
			e.printStackTrace();
			addDetailMessage(e.getMessage());
		}
	}

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

	public List<DataPosisiKas> getPosisiKass() {
		return posisiKass;
	}

	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();
		posisiKass.get(bulan).setAkuns(akunPosisiKasBersihs);

	}

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

	public int getBulan() {
		return bulan;
	}

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

	public boolean isUploadDisable() {

		if (getSelectedYear() != null && getSelectedYear().getTahun() != 0 && bulan >= 0 && bulan < 12) {
			uploadDisable = false;
		} else {
			uploadDisable = true;
		}
		return uploadDisable;
	}

	public List<PosisiKasAkunPerPemda> getAkunPosisiKasBersihs() {
		return akunPosisiKasBersihs;
	}

	public void setAkunPosisiKasBersihs(List<PosisiKasAkunPerPemda> akunPosisiKasBersihs) {
		this.akunPosisiKasBersihs = akunPosisiKasBersihs;
	}

    public String getLabelPeriode() {
        return labelPeriode;
    }

    public void setLabelPeriode(String labelPeriode) {
        this.labelPeriode = labelPeriode;
    }

}
