/*
 * Copyright (c) 2015 Eike Stepper (Berlin, Germany) 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:
 *    Eike Stepper - initial API and implementation
 */
package org.eclipse.emf.cdo.explorer.ui.checkouts;

import org.eclipse.emf.cdo.CDOElement;
import org.eclipse.emf.cdo.eresource.CDOResourceNode;

import org.eclipse.net4j.util.factory.ProductCreationException;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;

/**
 * @author Eike Stepper
 */
public class ResourceGroupModifier implements CDOCheckoutContentModifier
{
  private static final Map<CDOResourceNode, ResourceGroup> RESOURCE_GROUPS = new WeakHashMap<CDOResourceNode, ResourceGroup>();

  private final String suffix;

  public ResourceGroupModifier(String extension)
  {
    suffix = "." + extension;
  }

  public final String getExtension()
  {
    return suffix.substring(1);
  }

  public Object[] modifyChildren(Object parent, Object[] children)
  {
    Map<String, ResourceGroup> resourceGroups = null;

    for (Object child : children)
    {
      if (child instanceof CDOResourceNode)
      {
        CDOResourceNode resourceNode = (CDOResourceNode)child;
        String name = resourceNode.getName();
        if (name != null && name.endsWith(suffix))
        {
          if (resourceGroups == null)
          {
            resourceGroups = new HashMap<String, ResourceGroup>();
          }

          String groupName = name.substring(0, name.length() - suffix.length());
          ResourceGroup resourceGroup = getResourceGroup(resourceNode);
          resourceGroups.put(groupName, resourceGroup);
        }
      }
    }

    if (resourceGroups != null)
    {
      List<Object> result = new ArrayList<Object>();
      for (Object child : children)
      {
        child = replacement(resourceGroups, child);
        if (child != null)
        {
          result.add(child);
        }
      }

      children = result.toArray();
    }

    return children;
  }

  protected ResourceGroup createResourceGroup(CDOResourceNode resourceNode)
  {
    return new ResourceGroup(resourceNode);
  }

  private ResourceGroup getResourceGroup(CDOResourceNode resourceNode)
  {
    synchronized (RESOURCE_GROUPS)
    {
      ResourceGroup resourceGroup = RESOURCE_GROUPS.get(resourceNode);
      if (resourceGroup == null)
      {
        resourceGroup = createResourceGroup(resourceNode);
        RESOURCE_GROUPS.put(resourceNode, resourceGroup);
      }
      else
      {
        resourceGroup.reset();
      }

      return resourceGroup;
    }
  }

  private Object replacement(Map<String, ResourceGroup> elements, Object child)
  {
    if (child instanceof CDOResourceNode)
    {
      CDOResourceNode resourceNode = (CDOResourceNode)child;
      String name = resourceNode.getName();
      if (name != null)
      {
        int lastDot = name.lastIndexOf('.');
        if (lastDot != -1)
        {
          String groupName = name.substring(0, lastDot);
          CDOElement element = elements.get(groupName);
          if (element != null)
          {
            element.addChild(resourceNode);

            if (name.endsWith(suffix))
            {
              return element;
            }

            return null;
          }
        }
      }
    }

    return child;
  }

  /**
   * @author Eike Stepper
   */
  public static abstract class Factory extends CDOCheckoutContentModifier.Factory
  {
    public static final String TYPE_PREFIX = "resource.group.";

    private final String extension;

    public Factory(String extension)
    {
      super(TYPE_PREFIX + extension);
      this.extension = extension;
    }

    @Override
    public final ResourceGroupModifier create(String description) throws ProductCreationException
    {
      return new ResourceGroupModifier(extension);
    }
  }
}
