/*
 * Copyright 2010-2015 Institut Pasteur.
 * 
 * This file is part of Icy.
 * 
 * Icy is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * Icy is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with Icy. If not, see <http://www.gnu.org/licenses/>.
 */
package icy.gui.preferences;

import icy.preferences.RepositoryPreferences.RepositoryInfo;
import icy.workspace.Workspace;
import icy.workspace.WorkspaceInstaller;
import icy.workspace.WorkspaceInstaller.WorkspaceInstallerEvent;
import icy.workspace.WorkspaceInstaller.WorkspaceInstallerListener;
import icy.workspace.WorkspaceLoader;
import icy.workspace.WorkspaceRepositoryLoader;
import icy.workspace.WorkspaceRepositoryLoader.WorkspaceRepositoryLoaderListener;

import java.util.ArrayList;

/**
 * @author Stephane
 */
public class WorkspaceOnlinePreferencePanel extends WorkspaceListPreferencePanel implements
        WorkspaceRepositoryLoaderListener, WorkspaceInstallerListener
{
    private enum WorkspaceOnlineState
    {
        NULL, INSTALLING, DELETING, HAS_INSTALL, INSTALLED
    }

    /**
     * 
     */
    private static final long serialVersionUID = 5061606004171912231L;

    public static final String NODE_NAME = "Online Workspace";

    WorkspaceOnlinePreferencePanel(PreferenceFrame parent)
    {
        super(parent, NODE_NAME);

        WorkspaceRepositoryLoader.addListener(this);
        WorkspaceInstaller.addListener(this);

        repositoryPanel.setVisible(true);
        action1Button.setText("Install");
        action1Button.setVisible(true);

        updateButtonsState();
        updateRepositories();
    }

    @Override
    protected void closed()
    {
        super.closed();

        WorkspaceRepositoryLoader.removeListener(this);
        WorkspaceInstaller.removeListener(this);
    }

    private WorkspaceOnlineState getWorkspaceOnlineState(Workspace workspace)
    {
        if (workspace == null)
            return WorkspaceOnlineState.NULL;

        if ((WorkspaceInstaller.isInstallingWorkspace(workspace)))
            return WorkspaceOnlineState.INSTALLING;

        if ((WorkspaceInstaller.isDesinstallingWorkspace(workspace)))
            return WorkspaceOnlineState.DELETING;

        if (WorkspaceLoader.isLoaded(workspace))
            return WorkspaceOnlineState.INSTALLED;

        return WorkspaceOnlineState.HAS_INSTALL;
    }

    @Override
    protected int getColumnCount()
    {
        return 3;
    }

    @Override
    protected void doAction1(Workspace workspace)
    {
        switch (getWorkspaceOnlineState(workspace))
        {
            case HAS_INSTALL:
                // install workspace
                WorkspaceInstaller.install(workspace, true);
                // refresh state
                refreshTableData();
                updateButtonsState();
                break;

            case INSTALLED:
                // desinstall workspace
                WorkspaceInstaller.desinstall(workspace, true);
                // refresh state
                refreshTableData();
                updateButtonsState();
                break;
        }
    }

    @Override
    protected void repositoryChanged()
    {
        refreshWorkspaces();
    }

    @Override
    protected void reloadWorkspaces()
    {
        WorkspaceRepositoryLoader.reload();
        refreshWorkspaces();
    }

    @Override
    protected String getStateValue(Workspace workspace)
    {
        switch (getWorkspaceOnlineState(workspace))
        {
            case INSTALLING:
                return "installing...";

            case DELETING:
                return "deleting...";

            case INSTALLED:
                return "installed";
        }

        return "";
    }

    @Override
    protected ArrayList<Workspace> getWorkspaces()
    {
        // get selected repository
        final Object selectedItem = repository.getSelectedItem();

        // load workspaces from selected repository
        if (selectedItem != null)
            return WorkspaceRepositoryLoader.getWorkspaces((RepositoryInfo) selectedItem);

        return WorkspaceRepositoryLoader.getWorkspaces();
    }

    @Override
    protected void updateButtonsStateInternal()
    {
        if (WorkspaceRepositoryLoader.isLoading())
        {
            refreshButton.setText("Reloading...");
            refreshButton.setEnabled(false);
            repository.setEnabled(false);
        }
        else
        {
            refreshButton.setText("Reload list");
            refreshButton.setEnabled(true);
            repository.setEnabled(true);
        }

        final Workspace workspace = getSelectedWorkspace();

        if (workspace == null)
        {
            action1Button.setEnabled(false);
            return;
        }

        switch (getWorkspaceOnlineState(workspace))
        {
            case INSTALLING:
                action1Button.setText("Installing...");
                action1Button.setEnabled(false);
                break;

            case DELETING:
                action1Button.setText("Deleting...");
                action1Button.setEnabled(false);
                break;

            case HAS_INSTALL:
                action1Button.setText("Install");
                action1Button.setEnabled(true);
                break;

            case INSTALLED:
                action1Button.setText("Delete");
                action1Button.setEnabled(true);
                break;

            case NULL:
                action1Button.setEnabled(false);
                break;
        }
    }

    @Override
    public void workspaceRepositeryLoaderChanged()
    {
        workspacesChanged();
    }

    @Override
    public void workspaceInstalled(WorkspaceInstallerEvent e)
    {
        refreshTableData();
        updateButtonsState();
    }

    @Override
    public void workspaceRemoved(WorkspaceInstallerEvent e)
    {
        refreshTableData();
        updateButtonsState();
    }

}