package com.intellij.dupLocator;

import com.intellij.dupLocator.treeHash.FragmentsCollector;
import com.intellij.lang.Language;
import com.intellij.openapi.extensions.Extensions;
import gnu.trove.TIntObjectHashMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by IntelliJ IDEA.
 * User: Eugene.Kudelevsky
 * Date: May 18, 2009
 * Time: 7:39:35 PM
 * To change this template use File | Settings | File Templates.
 */
public class DuplicatesProfileCache {
  private static final Map<DupInfo, TIntObjectHashMap<DuplicatesProfile>> ourProfileCache = new HashMap<DupInfo, TIntObjectHashMap<DuplicatesProfile>>();

  private DuplicatesProfileCache() {
  }

  public static void clear(@NotNull DupInfo info) {
    ourProfileCache.remove(info);
  }

  @Nullable
  public static DuplicatesProfile getProfile(@NotNull DupInfo dupInfo, int index) {
    TIntObjectHashMap<DuplicatesProfile> patternCache = ourProfileCache.get(dupInfo);
    if (patternCache == null) {
      patternCache = new TIntObjectHashMap<DuplicatesProfile>();
      ourProfileCache.put(dupInfo, patternCache);
    }
    DuplicatesProfile result = patternCache.get(index);
    if (result == null) {
      DuplicatesProfile[] profiles = Extensions.getExtensions(DuplicatesProfile.EP_NAME);
      DuplicatesProfile theProfile = null;
      for (DuplicatesProfile profile : profiles) {
        if (profile.isMyDuplicate(dupInfo, index)) {
          theProfile = profile;
          break;
        }
      }
      result = theProfile == null ? NULL_PROFILE : theProfile;
      patternCache.put(index, result);
    }
    return result == NULL_PROFILE ? null : result;
  }

  private static final DuplicatesProfile NULL_PROFILE = new DuplicatesProfile() {
    @NotNull
    @Override
    public DuplocateVisitor createVisitor(@NotNull FragmentsCollector collector) {
      return null;
    }

    @Override
    public boolean isMyLanguage(@NotNull Language language) {
      return false;
    }

    @NotNull
    @Override
    public DuplocatorState getDuplocatorState(@NotNull Language language) {
      return null;
    }

    @Override
    public boolean isMyDuplicate(@NotNull DupInfo info, int index) {
      return false;
    }
  };
}
