/*******************************************************************************
 * Copyright (c) 2003, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.tests.activities;

import java.util.ArrayList;
import java.util.Iterator;

import org.eclipse.ui.internal.activities.AbstractActivityRegistry;
import org.eclipse.ui.internal.activities.ActivityDefinition;
import org.eclipse.ui.internal.activities.ActivityPatternBindingDefinition;
import org.eclipse.ui.internal.activities.ActivityRequirementBindingDefinition;
import org.eclipse.ui.internal.activities.CategoryActivityBindingDefinition;
import org.eclipse.ui.internal.activities.CategoryDefinition;

/**
 * 
 * The dynamic activity registry populated activities with dummy definitions for
 * testing purposes.
 */
public class DynamicModelActivityRegistry extends AbstractActivityRegistry {
    final String sourceId = "org.eclipse.ui.tests"; //$NON-NLS-1$

    /**
     * The constructor for the plugin model registry.
     */
    public DynamicModelActivityRegistry() {
        super();
        load();
    }

    /**
     * Populate definitions.
     *  
     */
    private void load() {
        categoryDefinitions = new ArrayList();
        activityDefinitions = new ArrayList();
        categoryActivityBindingDefinitions = new ArrayList();
        activityPatternBindingDefinitions = new ArrayList();
        activityRequirementBindingDefinitions = new ArrayList();
        defaultEnabledActivities = new ArrayList();
        populateCategoryDefinitions();
        populateActivityDefinitions();
        populateCategoryActivityBindingDefinitions();
        populateActivityPatternBindingDefinitions();
        populateActivityRequirementBindingDefinitions();
        populateDefaultEnabledActivities();
    }

    /**
     * Populate the default enabled activties.
     *  
     */
    private void populateDefaultEnabledActivities() {
        defaultEnabledActivities.add(((ActivityDefinition) activityDefinitions
                .toArray()[0]).getId());
        defaultEnabledActivities.add(((ActivityDefinition) activityDefinitions
                .toArray()[2]).getId());
        defaultEnabledActivities.add(((ActivityDefinition) activityDefinitions
                .toArray()[8]).getId());
    }

    /**
     * Populate the activity activity binding definitions.
     *  
     */
    private void populateActivityRequirementBindingDefinitions() {
        activityRequirementBindingDefinitions
                .add(new ActivityRequirementBindingDefinition(
                        ((ActivityDefinition) activityDefinitions.toArray()[0])
                                .getId(),
                        ((ActivityDefinition) activityDefinitions.toArray()[1])
                                .getId(), sourceId)); //$NON-NLS-1$
        activityRequirementBindingDefinitions
                .add(new ActivityRequirementBindingDefinition(
                        ((ActivityDefinition) activityDefinitions.toArray()[2])
                                .getId(),
                        ((ActivityDefinition) activityDefinitions.toArray()[3])
                                .getId(), sourceId)); //$NON-NLS-1$
    }

    /**
     * Populate the activity pattern binding definitions.
     *  
     */
    private void populateActivityPatternBindingDefinitions() {
        for (int index = 0; index < activityDefinitions.size(); index++) {
            activityPatternBindingDefinitions
                    .add(new ActivityPatternBindingDefinition(
                            ((ActivityDefinition) activityDefinitions.toArray()[index])
                                    .getId(), "org.eclipse.pattern" //$NON-NLS-1$
                                    + Integer.toString(index + 1), sourceId));
        }
    }

    /**
     * Populate the category activity binding definitions.
     *  
     */
    private void populateCategoryActivityBindingDefinitions() {
        int counter = 1;
        for (int index = 1; index <= categoryDefinitions.size(); index++) {
            categoryActivityBindingDefinitions
                    .add(new CategoryActivityBindingDefinition(
                            "org.eclipse.activity" + Integer.toString(counter), //$NON-NLS-1$
                            "org.eclipse.category" + Integer.toString(index), //$NON-NLS-1$
                            sourceId));
            counter++;
            categoryActivityBindingDefinitions
                    .add(new CategoryActivityBindingDefinition(
                            "org.eclipse.activity" + Integer.toString(counter), //$NON-NLS-1$
                            "org.eclipse.category" + Integer.toString(index), //$NON-NLS-1$
                            sourceId));
            counter++;
            categoryActivityBindingDefinitions
                    .add(new CategoryActivityBindingDefinition(
                            "org.eclipse.activity" + Integer.toString(counter), //$NON-NLS-1$
                            "org.eclipse.category" + Integer.toString(index), //$NON-NLS-1$
                            sourceId));
            counter++;
        }
    }

    /**
     * Populate the activity definitions.
     *  
     */
    private void populateActivityDefinitions() {
        String stringToAppend = null;
        for (int index = 1; index <= categoryDefinitions.size() * 3; index++) {
            stringToAppend = Integer.toString(index);
            activityDefinitions.add(new ActivityDefinition(
                    "org.eclipse.activity" + stringToAppend, "Activity " //$NON-NLS-1$ //$NON-NLS-2$
                            + stringToAppend, sourceId, "description")); //$NON-NLS-1$
        }
    }

    /**
     * Populate the category definitions.
     *  
     */
    private void populateCategoryDefinitions() {
        String stringToAppend = null;
        for (int index = 1; index <= 6; index++) {
            stringToAppend = Integer.toString(index);
            categoryDefinitions.add(new CategoryDefinition(
                    "org.eclipse.category" + stringToAppend, "Category " //$NON-NLS-1$ //$NON-NLS-2$
                            + stringToAppend, sourceId, "description")); //$NON-NLS-1$
        }
    }

    /**
     * Add an activity.
     * 
     * @param activityId
     *            The activity's id.
     * @param activityName
     *            The activity's name
     */
    public void addActivity(String activityId, String activityName) {
        activityDefinitions.add(new ActivityDefinition(activityId,
                activityName, sourceId, "description")); //$NON-NLS-1$
        fireActivityRegistryChanged();
    }

    /**
     * Remove adn activity.
     * 
     * @param activityId
     *            The activity's id.
     * @param activityName
     *            The activity's name.
     */
    public void removeActivity(String activityId, String activityName) {
        activityDefinitions.remove(new ActivityDefinition(activityId,
                activityName, sourceId, "description")); //$NON-NLS-1$
        fireActivityRegistryChanged();
    }

    /**
     * Add a category.
     * 
     * @param categoryId
     *            The category's id.
     * @param categoryName
     *            The category's name.
     */
    public void addCategory(String categoryId, String categoryName) {
        categoryDefinitions.add(new CategoryDefinition(categoryId,
                categoryName, sourceId, "description")); //$NON-NLS-1$
        fireActivityRegistryChanged();
    }

    /**
     * Remove a category.
     * 
     * @param categoryId
     *            The category's id.
     * @param categoryName
     *            The category's name.
     */
    public void removeCategory(String categoryId, String categoryName) {
        categoryDefinitions.remove(new CategoryDefinition(categoryId,
                categoryName, sourceId, "description")); //$NON-NLS-1$
        fireActivityRegistryChanged();
    }

    /**
     * Add an activity activity binding.
     * 
     * @param parentId
     *            The parent id.
     * @param childId
     *            The child id.
     */
    public void addActivityRequirementBinding(String childId, String parentId) {
        activityRequirementBindingDefinitions
                .add(new ActivityRequirementBindingDefinition(childId,
                        parentId, sourceId));
        fireActivityRegistryChanged();
    }

    /**
     * Reomve an activity activity binding.
     * 
     * @param parentId
     *            The parent id.
     * @param childId
     *            The child id.
     */
    public void removeActivityRequirementBinding(String childId, String parentId) {
        activityRequirementBindingDefinitions
                .remove(new ActivityRequirementBindingDefinition(childId,
                        parentId, sourceId));
        fireActivityRegistryChanged();
    }

    /**
     * Add a category activity binding.
     * 
     * @param activityId
     *            The activity id.
     * @param categoryId
     *            The category id.
     */
    public void addCategoryActivityBinding(String activityId, String categoryId) {
        categoryActivityBindingDefinitions
                .add(new CategoryActivityBindingDefinition(activityId,
                        categoryId, sourceId));
        fireActivityRegistryChanged();
    }

    /**
     * Remove a category activity binding.
     * 
     * @param activityId
     *            The activity id.
     * @param categoryId
     *            The category id.
     */
    public void removeCategoryActivityBinding(String activityId,
            String categoryId) {
        categoryActivityBindingDefinitions
                .remove(new CategoryActivityBindingDefinition(activityId,
                        categoryId, sourceId));
        fireActivityRegistryChanged();
    }

    /**
     * Update the category's description.
     * 
     * @param categoryId
     *            The category Id.
     * @param categoryDescription
     *            The category description.
     */
    public void updateCategoryDescription(String categoryId,
            String categoryDescription) {
        CategoryDefinition currentCategory = null;
        for (Iterator i = categoryDefinitions.iterator(); i.hasNext();) {
            currentCategory = (CategoryDefinition) i.next();
            if (currentCategory.getId().equals(categoryId)) {
                categoryDefinitions.remove(currentCategory);
                categoryDefinitions.add(new CategoryDefinition(categoryId,
                        currentCategory.getName(), currentCategory
                                .getSourceId(), categoryDescription));
                fireActivityRegistryChanged();
                return;
            }
        }
    }

    /**
     * Update the activity's description.
     * 
     * @param activityId
     *            The activity id.
     * @param activityDescription
     *            The activity description.
     */
    public void updateActivityDescription(String activityId,
            String activityDescription) {
        ActivityDefinition currentActivity = null;
        for (Iterator i = activityDefinitions.iterator(); i.hasNext();) {
            currentActivity = (ActivityDefinition) i.next();
            if (currentActivity.getId().equals(activityId)) {
                activityDefinitions.remove(currentActivity);
                activityDefinitions.add(new ActivityDefinition(activityId,
                        currentActivity.getName(), currentActivity
                                .getSourceId(), activityDescription));
                fireActivityRegistryChanged();
                return;
            }
        }
    }

    /**
     * Update the activity's name.
     * 
     * @param activityId
     *            The activity id.
     * @param activityName
     *            The activity's name.
     */
    public void updateActivityName(String activityId, String activityName) {
        ActivityDefinition currentActivity = null;
        for (Iterator i = activityDefinitions.iterator(); i.hasNext();) {
            currentActivity = (ActivityDefinition) i.next();
            if (currentActivity.getId().equals(activityId)) {
                activityDefinitions.remove(currentActivity);
                activityDefinitions.add(new ActivityDefinition(activityId,
                        activityName, currentActivity.getSourceId(),
                        currentActivity.getDescription()));
                fireActivityRegistryChanged();
                return;
            }
        }
    }

    /**
     * Update the category's name.
     * 
     * @param categoryId
     *            The category id.
     * @param categoryName
     *            The category name.
     */
    public void updateCategoryName(String categoryId, String categoryName) {
        CategoryDefinition currentCategory = null;
        for (Iterator i = categoryDefinitions.iterator(); i.hasNext();) {
            currentCategory = (CategoryDefinition) i.next();
            if (currentCategory.getId().equals(categoryId)) {
                categoryDefinitions.remove(currentCategory);
                categoryDefinitions.add(new CategoryDefinition(categoryId,
                        categoryName, currentCategory.getSourceId(),
                        currentCategory.getDescription()));
                fireActivityRegistryChanged();
                return;
            }
        }
    }

    /**
     * Remove an activity pattern binding.
     * 
     * @param pattern
     *            The pattern binding.
     */
    public void removeActivityPatternBinding(String pattern) {
        ActivityPatternBindingDefinition currentDefinition = null;
        for (Iterator i = activityPatternBindingDefinitions.iterator(); i
                .hasNext();) {
            currentDefinition = (ActivityPatternBindingDefinition) i.next();
            if (currentDefinition.getPattern().equals(pattern)) {
                activityPatternBindingDefinitions.remove(currentDefinition);
                fireActivityRegistryChanged();
                return;
            }
        }
    }

    /**
     * Add an activity pattern binding.
     * 
     * @param activityId
     *            The actvity Id.
     * @param pattern
     *            The pattern.
     */
    public void addActivityPatternBinding(String activityId, String pattern) {
        if (activityPatternBindingDefinitions
                .add(new ActivityPatternBindingDefinition(activityId, pattern,
                        sourceId))) {
            fireActivityRegistryChanged();
            return;
        }
    }
    
    /**
     * Add default enablement to the provided activity
     * @param activityId the activity id
     */
    public void addDefaultEnabledActivity(String activityId) {
        if (defaultEnabledActivities.add(activityId)) {
            fireActivityRegistryChanged();
        }
    }
    
    
    /**
     * Remove default enablement to the provided activity
     * 
     * @param activityId the activity id.
     */
    public void removeDefaultEnabledActivity(String activityId) {
        if (defaultEnabledActivities.remove(activityId)) {
            fireActivityRegistryChanged();
        }
    }
}
