/*******************************************************************************
 * Copyright (c) 2014 Takari, Inc.
 * 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:
 *      Takari, Inc. - initial API and implementation
 *******************************************************************************/

package org.eclipse.m2e.core.internal.project;

import java.io.File;
import java.util.HashSet;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;

import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.repository.RepositoryPolicy;

import org.codehaus.plexus.classworlds.realm.ClassRealm;
import org.codehaus.plexus.classworlds.realm.NoSuchRealmException;

import org.apache.maven.project.MavenProject;

import org.eclipse.m2e.core.internal.embedder.MavenExecutionContext;


/**
 * @since 1.6
 */
abstract class ProjectCachePlunger<Key> {

  private final Logger log = LoggerFactory.getLogger(getClass());

  final Multimap<File, Key> projectKeys = HashMultimap.create();

  final Multimap<Key, File> keyProjects = HashMultimap.create();

  public void register(MavenProject project, Key cacheKey) {
    // project.file is null for parent pom.xml resolved from repositories
    File file = project.getFile();
    if(file != null) {
      projectKeys.put(file, cacheKey);
      keyProjects.put(cacheKey, file);
    }
  }

  public Set<File> removeProject(File pom, boolean forceDependencyUpdate) {
    MavenExecutionContext context = MavenExecutionContext.getThreadContext();
    RepositorySystemSession session = context != null ? context.getRepositorySession() : null;
    if(forceDependencyUpdate && session == null) {
      throw new IllegalArgumentException();
    }
    final Set<File> affectedProjects = new HashSet<>();

    for(Key cacheKey : projectKeys.removeAll(pom)) {
      keyProjects.remove(cacheKey, pom);
      if(forceDependencyUpdate && RepositoryPolicy.UPDATE_POLICY_ALWAYS.equals(session.getUpdatePolicy())
          && session.getCache().get(session, cacheKey) == null) {
//        session.getCache().put(session, cacheKey, Boolean.TRUE);
        for(File affectedPom : keyProjects.removeAll(cacheKey)) {
          affectedProjects.add(affectedPom);
          projectKeys.remove(affectedPom, cacheKey);
        }
      }
      if(!keyProjects.containsKey(cacheKey)) {
        flush(cacheKey);
        log.debug("Flushed cache entry for {}", cacheKey);
      }
    }

    return affectedProjects;
  }

  protected void disposeClassRealm(ClassRealm realm) {
    try {
      realm.getWorld().disposeRealm(realm.getId());
    } catch(NoSuchRealmException e) {
      // ignore
    }
  }

  protected abstract void flush(Key cacheKey);

  public void flush() {
    projectKeys.clear();
    keyProjects.clear();
  }
}
