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.List;

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

import sikd.sikd5.ctrl.template.TahunBulanTanggalFilter;
import sikd.sikd5.sikd5bean.query.InfoPengiriman;
import sikd.sikd5.sikd5bean.query.MonitorSimpatikPerPemda;
import sikd.sikd5.sikd5bean.query.MonitorSimpatikPerPemdaRekapProv;
import sikd.sikd5.sikd5bean.tabel.Pemda;
import sikd.sikd5.sikd5bean.tabel.UploadFile;
import sikd.sikd5.sikd5bean.util.ServerUtil;
import sikd.sikd5.sikd5bean.util.SikdSessionUtil;
import sikd.sikd5.sikd5ejb.session.LraSessionBeanRemote;
import sikd.sikd5.sikd5ejb.session.PerkiraanBelanjaSessionBeanRemote;
import sikd.sikd5.sikd5ejb.session.PosisiKasSessionBeanRemote;
import sikd.sikd5.sikd5ejb.session.SettingsSessionBeanRemote;
import sikd.sikd5.sikd5ejb.session.UploadFileSessionBeanRemote;

/**
 * @author : agus
 * @tanggal : Jan 17, 2019
 */
@Named
@SessionScoped
@Specializes
public class MonitorPerBulanCtrl extends TahunBulanTanggalFilter implements Serializable {
   private static final long serialVersionUID = 1L;
//	List<MonitorSimpatikPerPemda> statusKirims = new ArrayList<MonitorSimpatikPerPemda>();
   UploadFileSessionBeanRemote uploadFileSes;
   LraSessionBeanRemote lraSes;
   PerkiraanBelanjaSessionBeanRemote pbSes;
   PosisiKasSessionBeanRemote pkSes;
   SettingsSessionBeanRemote settingSes;

   List<MonitorSimpatikPerPemdaRekapProv> rekaps = new ArrayList<MonitorSimpatikPerPemdaRekapProv>();
   List<MonitorSimpatikPerPemda> rincis = new ArrayList<MonitorSimpatikPerPemda>();
   MonitorSimpatikPerPemdaRekapProv rekapNas;

   @PostConstruct
   public void init() throws Exception {
      super.init();
//		statusKirims.clear();
//		for (Periode p : SIKDUtil.getBulans()) {
//			statusKirims.add(new MonitorSimpatikPerBulan(p.getBulanShort(), p.getBulanString()));
//		}
      Context ctxOffice = ServerUtil.getOfficeContextV3();
      uploadFileSes = (UploadFileSessionBeanRemote) ctxOffice.lookup(SikdSessionUtil.UPLOAD_FILE_SESSION);
      lraSes = (LraSessionBeanRemote) ctxOffice.lookup(SikdSessionUtil.LRA_SESSION);
      pbSes = (PerkiraanBelanjaSessionBeanRemote) ctxOffice.lookup(SikdSessionUtil.PERKIRAAN_BELANJA_SESSION);
      pkSes = (PosisiKasSessionBeanRemote) ctxOffice.lookup(SikdSessionUtil.POSISI_KAS_SESSION);
      settingSes = (SettingsSessionBeanRemote) ctxOffice.lookup(SikdSessionUtil.SETTINGS_SESSION);
      rekapNas = new MonitorSimpatikPerPemdaRekapProv();
   }

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

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

   public void onFilterChange() {
      try {

         if (getSelectedYear().getTahun() != 0 && getSelectedPeriode() != null) {
            List<InfoPengiriman> infoLraX = lraSes.getInfoPengirimanXmlPerPemda(getSelectedYear().getTahun(),
                  getSelectedPeriode().getBulanShort(), getTgAwal(), getTgAkhir());
            List<InfoPengiriman> infoPbX = pbSes.getInfoPengirimanXmlPerPemda(getSelectedYear().getTahun(), getSelectedPeriode().getBulanShort(),
                  getTgAwal(), getTgAkhir());
            List<InfoPengiriman> infoPkX = pkSes.getInfoPengirimanXmlPerPemda(getSelectedYear().getTahun(), getSelectedPeriode().getBulanShort(),
                  getTgAwal(), getTgAkhir());
//				System.out.println("infoPkX.size() ");
//				System.out.println(infoPkX.size());
            List<UploadFile> infoPdf = uploadFileSes.getAllUploadFilesPerPemda(getSelectedYear().getTahun(), getSelectedPeriode().getBulanShort(),
                  getTgAwal(), getTgAkhir());
            List<UploadFile> infoSUBPdf = uploadFileSes.getUploadFilesPerPemda(getSelectedYear().getTahun(), "SUB", getTgAkhir());
            rincis = new ArrayList<MonitorSimpatikPerPemda>();

            short no = 0;
            for (Pemda p : settingSes.getPemdaByTahuns(getSelectedYear().getTahun())) {
               no++;
               MonitorSimpatikPerPemda mon = new MonitorSimpatikPerPemda(p.getKodeProvinsi(), p.getKodePemda(), p.getKodeSatker(),
                     p.getNamaPemda(),
                     p.getNamaSingkatPemda(), p.getTipePemda());
               mon.setNomor(no);
               for (InfoPengiriman lra : infoLraX) {// Penerimaan LRA
                  if (lra.getKodeSatker().equals(p.getKodeSatker())) {
                     mon.setLrax(lra.getTglPengiriman());
                  }
               }
               for (InfoPengiriman pbb : infoPbX) {// Penerimaan Perkiraan Belanja
                  if (pbb.getKodeSatker().equals(p.getKodeSatker())) {
                     mon.setPbbx(pbb.getTglPengiriman());
                  }
               }
               for (InfoPengiriman pkb : infoPkX) {// Penerimaan Posisi Kas
                  if (pkb.getKodeSatker().equals(p.getKodeSatker())) {
                     mon.setPkbx(pkb.getTglPengiriman());
                  }
               }

               for (UploadFile uf : infoPdf) {
                  String per = getSelectedPeriode().getBulanShort() > 9 ? "" + getSelectedPeriode().getBulanShort()
                        : "0" + getSelectedPeriode().getBulanShort();
                  if (uf.getKdsatker().equals(p.getKodeSatker())) {
                     // PDF perkiraan Belanja
                     if (uf.getKodeikd().equals("PBB" + per)) {
                        mon.setPbbp(uf.getTglupload());
                     }
                     // PDF Posisi Kas
                     if (uf.getKodeikd().equals("PKB" + per)) {
                        mon.setPkbp(uf.getTglupload());
                     }
                     // PDF SUbregistry
                     if (uf.getKodeikd().equals("SUB" + per)) {
                        mon.setSubp(uf.getTglupload());
                     }
                  }
               }
               // Pengiriman Subregistri hanya wajib sekali dalam setahun
               for (UploadFile uf : infoSUBPdf) {
                  if (uf.getKdsatker().equals(p.getKodeSatker())) {
                     mon.setSubp(uf.getTglupload());
                  }
               }
               rincis.add(mon);
            }

            rekaps = new ArrayList<MonitorSimpatikPerPemdaRekapProv>();
            no = 0;
            for (Pemda p : settingSes.getProvByTahuns(getSelectedYear().getTahun())) {
               no++;
               MonitorSimpatikPerPemdaRekapProv monR = new MonitorSimpatikPerPemdaRekapProv(p.getKodeProvinsi(), p.getKodePemda(),
                     p.getKodeSatker(), p.getNamaPemda(), p.getNamaDanJumlahPemda(), p.getTipePemda());
               monR.setNomor(no);
               for (MonitorSimpatikPerPemda mon : rincis) {
                  if (monR.getKodeProvinsi().equals(mon.getKodeProvinsi())) {
                     if (mon.getLrax() != null) {
                        monR.setLrax(monR.getLrax() + 1);
                     }
                     if (mon.getLrap() != null) {
                        monR.setLrap(monR.getLrap() + 1);
                     }

                     if (mon.getPbbx() != null) {
                        monR.setPbbx(monR.getPbbx() + 1);
                     }
                     if (mon.getPbbp() != null) {
                        monR.setPbbp(monR.getPbbp() + 1);
                     }

                     if (mon.getPkbx() != null) {
                        monR.setPkbx(monR.getPkbx() + 1);
                     }
                     if (mon.getPkbp() != null) {
                        monR.setPkbp(monR.getPkbp() + 1);
                     }

                     if (mon.getSubp() != null) {
                        monR.setSubp(monR.getSubp() + 1);
                     }
                     if (mon.getStatusPString().equals("Lengkap")) {
                        monR.setPlengkap(monR.getPlengkap() + 1);
                     }
                     if (mon.getStatusXString().equals("Lengkap")) {
                        monR.setXlengkap(monR.getXlengkap() + 1);
                     }
                     if (mon.getStatusPXString().equals("Lengkap")) {
                        monR.setXplengkap(monR.getXplengkap() + 1);
                     }
                  }
               }
               rekaps.add(monR);
            }

//				System.out.println("rekaps.size() ");
//				System.out.println(rekaps.size());
            rekapNas.setNamaSingkatPemda("Total Nasional Pengiriman Data");
            rekapNas.setLrap(0);
            rekapNas.setLrax(0);
            rekapNas.setPbbp(0);
            rekapNas.setPbbx(0);
            rekapNas.setPkbp(0);
            rekapNas.setPkbx(0);
            rekapNas.setSubp(0);
            rekapNas.setPlengkap(0);
            rekapNas.setXlengkap(0);
            rekapNas.setXplengkap(0);

            for (MonitorSimpatikPerPemdaRekapProv monR : rekaps) {
//					System.out.print(monR.getKodeProvinsi());
//					System.out.println("-" +monR.getPkbx());
               rekapNas.setLrap(rekapNas.getLrap() + monR.getLrap());
               rekapNas.setLrax(rekapNas.getLrax() + monR.getLrax());
               rekapNas.setPbbp(rekapNas.getPbbp() + monR.getPbbp());
               rekapNas.setPbbx(rekapNas.getPbbx() + monR.getPbbx());
               rekapNas.setPkbp(rekapNas.getPkbp() + monR.getPkbp());
               rekapNas.setPkbx(rekapNas.getPkbx() + monR.getPkbx());
               rekapNas.setSubp(rekapNas.getSubp() + monR.getSubp());
               rekapNas.setPlengkap(rekapNas.getPlengkap() + monR.getPlengkap());
               rekapNas.setXlengkap(rekapNas.getXlengkap() + monR.getXlengkap());
               rekapNas.setXplengkap(rekapNas.getXplengkap() + monR.getXplengkap());
            }
//				System.out.println(rekapNas.getPkbx());
            rekaps.add(0, rekapNas);
         }
//			addDetailMessage("refresh");
      } catch (Exception e) {
         e.printStackTrace();
         addDetailMessage(e.getMessage());
      }
   }

   public List<MonitorSimpatikPerPemdaRekapProv> getRekaps() {
      return rekaps;
   }

   public void setRekaps(List<MonitorSimpatikPerPemdaRekapProv> rekaps) {
      this.rekaps = rekaps;
   }

   public List<MonitorSimpatikPerPemda> getRincis() {
      return rincis;
   }

   public void setRincis(List<MonitorSimpatikPerPemda> rincis) {
      this.rincis = rincis;
   }

   public MonitorSimpatikPerPemdaRekapProv getRekapNas() {
      return rekapNas;
   }

   public void setRekapNas(MonitorSimpatikPerPemdaRekapProv rekapNas) {
      this.rekapNas = rekapNas;
   }

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