package usda.weru.remoteDataAccess.csip;

import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Point;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import static usda.weru.remoteDataAccess.csip.CsipInputControllerCachingSupport.PROP_CSIP_BGCATALOG_COMPLETE;
import static usda.weru.remoteDataAccess.csip.CsipLmodUtil.CsipNamePrism;
import static usda.weru.remoteDataAccess.csip.CsipLmodUtil.CsipNameSoil;
import usda.weru.remoteDataAccess.csip.CsipLmodUtil.lmodType;
import usda.weru.remoteDataAccess.csip.crlmod.CsipInputContCrLmod;
import usda.weru.remoteDataAccess.csip.crlmod.CsipInputContCrLmodBgCache;
import usda.weru.remoteDataAccess.csip.polygon.CsipInputContPolygon;
import usda.weru.remoteDataAccess.csip.polygon.prism.CsipInputContPrismBgCache;
import usda.weru.remoteDataAccess.csip.polygon.soil.CsipInputContSoilBgCache;
import usda.weru.util.WepsProgressPopup;
import usda.weru.weps.Weps;
import static usda.weru.remoteDataAccess.csip.crlmod.CsipInputContCrLmodBgCache.PROP_CSIP_BGFILLCACHE_COMPLETE_EXTERNAL;
import usda.weru.util.About;

/**
 *
 * @author mhaas
 */
public class CsipInputControllerStatic implements PropertyChangeListener {

    static CsipInputContCrLmodBgCache CrLmodcontrollerDefault = null;
    static CsipInputContCrLmodBgCache CrLmodcontrollerMan = null;
    static CsipInputContCrLmodBgCache CrLmodcontrollerCrop = null;
    static CsipInputContCrLmodBgCache CrLmodcontrollerCropResidue = null;
    static CsipInputContCrLmodBgCache CrLmodcontrollerOp = null;

    static CsipInputContSoilBgCache Soilcontroller = null;
    static CsipInputContPrismBgCache Prismcontroller = null;

    protected ArrayList<CsipInputController> loadingList;
    int controllerLoadingCnt = 0;
    int finishedCnt;

    WepsProgressPopup progress;

    public CsipInputControllerStatic() {
        init();
    }

    protected void init() {

        loadingList = new ArrayList<>();

        getCrLmodController(lmodType.lmodCrop).getChangeObj().addPropertyChangeListener(PROP_CSIP_BGFILLCACHE_COMPLETE_EXTERNAL, this);
        getCrLmodController(lmodType.lmodCropResidue).getChangeObj().addPropertyChangeListener(PROP_CSIP_BGFILLCACHE_COMPLETE_EXTERNAL, this);
        getCrLmodController(lmodType.lmodOperation).getChangeObj().addPropertyChangeListener(PROP_CSIP_BGFILLCACHE_COMPLETE_EXTERNAL, this);
        getSoilController();
        getPrismController().getChangeObj().addPropertyChangeListener(PROP_CSIP_BGFILLCACHE_COMPLETE_EXTERNAL, this);

        getCrLmodController(lmodType.lmodManagement);
        CrLmodcontrollerMan.setDoCatalogOnly(true);

        loadAllCaches();

        if (loadingList.size() > 0) {
            finishedCnt = 0;
            progress = new WepsProgressPopup("Initializing/checking CRLmod cache, please wait.\nManagement and Run controls\nare disabled until complete.",
                    0, 10);
            progress.setIconImage(About.getWeruIconImage());
            progress.setTitle("Weps progress");
            Dimension d = progress.getSize();
            d.width += 120;
            progress.setSize(d);
            progress.getPbar().setMaximum(loadingList.size());

            Point p = Weps.getInstance().getLocation();
            p.translate(50, 50);
            progress.setLocation(p);
            progress.setAlwaysOnTop(true);
            progress.setVisible(true);
        }

// MEH
//        // for managements, pre-load the catalog so the filelists / drop downs
//        // can have their data pre-loaded.
//        // But do not cache all of the crlomod managements
//        getCrLmodController(lmodType.lmodManagement);
//        CrLmodcontrollerMan.setDoCatalogOnly(true);
//        CrLmodcontrollerMan.resetCatalog();
//        CrLmodcontrollerMan.doBackgroundGetCatalog();
    }

    public void initPropertyChanges() {
        getPrismController().addPropertyChangeSupport();
        getSoilController().addPropertyChangeSupport();
    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if (evt.getPropertyName().contentEquals(PROP_CSIP_BGCATALOG_COMPLETE)) {
        } else if (evt.getPropertyName().contentEquals(PROP_CSIP_BGFILLCACHE_COMPLETE_EXTERNAL)) {

            Object o = evt.getNewValue();
            if (o instanceof CsipInputContCrLmodBgCache) {
            }
            if (evt.getNewValue() instanceof CsipInputContCrLmodBgCache) {
                loadingList.remove((CsipInputController) evt.getNewValue());
            }
            if (progress != null) {
                progress.getPbar().setValue(progress.getPbar().getMaximum() - loadingList.size());
                if (loadingList.isEmpty()) {
                    progress.setVisible(false);
                    progress = null;
                    Weps.getInstance().enableMcrewElements();
                }
            }
        }
    }

    public void clearProgress() {
        finishedCnt = 0;
        controllerLoadingCnt = 0;
        progress.setVisible(false);
        Weps.getInstance().getRootPane().getGlassPane().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
        Weps.getInstance().getRootPane().getGlassPane().setVisible(false);
    }

    public int getDownloadingCount() {
        return controllerLoadingCnt - finishedCnt;
    }

    static public CsipInputContCrLmod getCrLmodController(lmodType ifType) {
        switch (ifType) {
            case lmodManagement:
                if (CrLmodcontrollerMan == null) {
                    CrLmodcontrollerMan = new CsipInputContCrLmodBgCache(ifType, true);
                    CrLmodcontrollerMan.setInterfaceName(CsipLmodUtil.getCrLmodName(ifType));
                }
                return CrLmodcontrollerMan;
            case lmodCrop:
                if (CrLmodcontrollerCrop == null) {
                    CrLmodcontrollerCrop = new CsipInputContCrLmodBgCache(ifType, true);
                    CrLmodcontrollerCrop.setInterfaceName(CsipLmodUtil.getCrLmodName(ifType));
                }
                return CrLmodcontrollerCrop;
            case lmodCropResidue:
                if (CrLmodcontrollerCropResidue == null) {
                    CrLmodcontrollerCropResidue = new CsipInputContCrLmodBgCache(ifType, true);
                    CrLmodcontrollerCropResidue.setInterfaceName(CsipLmodUtil.getCrLmodName(ifType));
                }
                return CrLmodcontrollerCropResidue;
            case lmodOperation:
                if (CrLmodcontrollerOp == null) {
                    CrLmodcontrollerOp = new CsipInputContCrLmodBgCache(ifType, true);
                    CrLmodcontrollerOp.setInterfaceName(CsipLmodUtil.getCrLmodName(ifType));
                }
                return CrLmodcontrollerOp;
            case lmodDefault:
                if (CrLmodcontrollerDefault == null) {
                    CrLmodcontrollerDefault = new CsipInputContCrLmodBgCache(ifType, true);
                    CrLmodcontrollerDefault.setInterfaceName(CsipLmodUtil.getCrLmodName(ifType));
                }
                return CrLmodcontrollerDefault;
        }
        return null;
    }

    static public CsipInputContPolygon getSoilController() {
        if (Soilcontroller == null) {
            Soilcontroller = new CsipInputContSoilBgCache(true);
            Soilcontroller.setInterfaceName(CsipNameSoil);
        }
        return Soilcontroller;
    }

    static public CsipInputContPolygon getPrismController() {
        if (Prismcontroller == null) {
            Prismcontroller = new CsipInputContPrismBgCache(true);
            Prismcontroller.setInterfaceName(CsipNamePrism);
        }
        return Prismcontroller;
    }

    public void loadAllCaches() {
        if (CrLmodcontrollerMan != null && !CrLmodcontrollerMan.cacheFilesValid()) {
            CrLmodcontrollerMan.resetCatalog();
            CrLmodcontrollerMan.doBackgroundGetCatalog();
            if (!CrLmodcontrollerMan.getDoCatalogOnly()) {
                loadingList.add(CrLmodcontrollerMan);
            }
        }
        if (CrLmodcontrollerCrop != null && !CrLmodcontrollerCrop.cacheFilesValid()) {
            CrLmodcontrollerCrop.resetCatalog();
            CrLmodcontrollerCrop.doBackgroundGetCatalog();
            loadingList.add(CrLmodcontrollerCrop);
        }
        if (CrLmodcontrollerCropResidue != null && !CrLmodcontrollerCropResidue.cacheFilesValid()) {
            CrLmodcontrollerCropResidue.resetCatalog();
            CrLmodcontrollerCropResidue.doBackgroundGetCatalog();
            loadingList.add(CrLmodcontrollerCropResidue);
        }
        if (CrLmodcontrollerOp != null && !CrLmodcontrollerOp.cacheFilesValid()) {
            CrLmodcontrollerOp.resetCatalog();
            CrLmodcontrollerOp.doBackgroundGetCatalog();
            loadingList.add(CrLmodcontrollerOp);
        }
    }
    
    public boolean isLoading() {
        return (loadingList.size() > 0);
    }
    
}
