/*
 * 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.WorkspaceLocalPreferences;
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.WorkspaceLoader.WorkspaceLoaderEvent;
import icy.workspace.WorkspaceLoader.WorkspaceLoaderListener;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Stephane
 */
public class WorkspaceLocalPreferencePanel extends WorkspaceListPreferencePanel implements WorkspaceLoaderListener,
        WorkspaceInstallerListener
{
    /**
     * 
     */
    private static final long serialVersionUID = -7178443947421949836L;

    public static final String NODE_NAME = "Local Workspace";

    private ArrayList<String> activesWorkspace;

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

        action1Button.setText("Delete");
        action1Button.setVisible(true);

        refreshWorkspaces();

        WorkspaceLoader.addListener(this);
        WorkspaceInstaller.addListener(this);

    }

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

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

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

    @Override
    protected void doAction1(Workspace workspace)
    {
        // desinstall workspace
        WorkspaceInstaller.desinstall(workspace, true);
        // refresh state
        refreshTableData();
        updateButtonsState();
    }

    @Override
    protected Boolean isWorkspaceEnable(Workspace workspace)
    {
        return Boolean.valueOf(activesWorkspace.contains(workspace.getName()));
    }

    @Override
    protected void setWorkspaceEnable(Workspace workspace, Boolean value)
    {
        final String name = workspace.getName();

        if (value.booleanValue())
        {
            if (!activesWorkspace.contains(name))
                activesWorkspace.add(name);
        }
        else
            activesWorkspace.remove(name);
    }

    private void cleanActivesWorkspace(List<Workspace> workspaces)
    {
        // clean active workspace list
        for (int i = activesWorkspace.size() - 1; i >= 0; i--)
        {
            final String name = activesWorkspace.get(i);

            if (Workspace.getWorkspace(workspaces, name) == null)
                activesWorkspace.remove(i);
        }
    }

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

        activesWorkspace = WorkspaceLocalPreferences.getActivesWorkspace();
    }

    @Override
    protected void save()
    {
        WorkspaceLocalPreferences.setActivesWorkspace(activesWorkspace);

        super.save();
    }

    @Override
    protected void repositoryChanged()
    {
        // do nothing here
    }

    @Override
    protected void reloadWorkspaces()
    {
        WorkspaceLoader.reloadAsynch();
        refreshWorkspaces();
    }

    @Override
    protected String getStateValue(Workspace workspace)
    {
        if (workspace == null)
            return "";

        if (WorkspaceInstaller.isDesinstallingWorkspace(workspace))
            return "Deleting...";

        return "";
    }

    @Override
    protected List<Workspace> getWorkspaces()
    {
        final List<Workspace> result;

        if (WorkspaceLoader.isLoading())
            result = new ArrayList<Workspace>();
        else
        {
            result = WorkspaceLoader.getWorkspaces();

            // we don't want to see here WORKSPACE_SYSTEM
            Workspace.removeWorkspace(result, Workspace.WORKSPACE_SYSTEM_NAME);
            cleanActivesWorkspace(result);
        }

        return result;
    }

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

        final Workspace workspace = getSelectedWorkspace();

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

        // special case where workspace is currently begin removed
        if (WorkspaceInstaller.isDesinstallingWorkspace(workspace))
        {
            action1Button.setText("Deleting...");
            action1Button.setEnabled(false);
        }
        else
        {
            action1Button.setText("Delete");
            action1Button.setEnabled(true);
        }
    }

    @Override
    public void workspaceLoaderChanged(WorkspaceLoaderEvent e)
    {
        workspacesChanged();
    }

    @Override
    public void workspaceInstalled(WorkspaceInstallerEvent e)
    {
        final Workspace workspace = e.getWorkspace();

        // enable the installed workspace by default
        setWorkspaceEnable(workspace, Boolean.TRUE);
        // workspace setting changed, restart needed
        getPreferenceFrame().setNeedRestart();
        updateButtonsState();
    }

    @Override
    public void workspaceRemoved(WorkspaceInstallerEvent e)
    {
        // workspace setting changed, restart needed
        getPreferenceFrame().setNeedRestart();
        updateButtonsState();
    }
}