/*
 * Copyright 2000-2010 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * User: anna
 * Date: 13-May-2010
 */
package org.jetbrains.idea.maven.execution;

import com.intellij.execution.Location;
import com.intellij.execution.RunnerAndConfigurationSettings;
import com.intellij.execution.actions.ConfigurationContext;
import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.execution.junit.RuntimeConfigurationProducer;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.idea.maven.model.MavenExplicitProfiles;
import org.jetbrains.idea.maven.project.MavenProjectsManager;

import java.util.Collection;
import java.util.List;

public class MavenConfigurationProducer extends RuntimeConfigurationProducer {
  private PsiElement myPsiElement;

  public MavenConfigurationProducer() {
    super(MavenRunConfigurationType.getInstance());
  }

  @Override
  public PsiElement getSourceElement() {
    return myPsiElement;
  }

  @Override
  protected RunnerAndConfigurationSettings createConfigurationByElement(Location location, ConfigurationContext context) {
    myPsiElement = location.getPsiElement();
    final MavenRunnerParameters params = createBuildParameters(location);
    if (params == null) return null;

    return MavenRunConfigurationType.createRunnerAndConfigurationSettings(null, null, params, location.getProject());
  }

  @Override
  protected RunnerAndConfigurationSettings findExistingByElement(Location location,
                                                                 @NotNull List<RunnerAndConfigurationSettings> existingConfigurations,
                                                                 ConfigurationContext context) {

    final MavenRunnerParameters runnerParameters = createBuildParameters(location);
    for (RunnerAndConfigurationSettings existingConfiguration : existingConfigurations) {
      final RunConfiguration configuration = existingConfiguration.getConfiguration();
      if (configuration instanceof MavenRunConfiguration &&
          ((MavenRunConfiguration)configuration).getRunnerParameters().equals(runnerParameters)) {
        return existingConfiguration;
      }
    }
    return null;
  }

  private static MavenRunnerParameters createBuildParameters(Location l) {
    if (!(l instanceof MavenGoalLocation)) return null;

    VirtualFile f = ((PsiFile)l.getPsiElement()).getVirtualFile();
    List<String> goals = ((MavenGoalLocation)l).getGoals();
    MavenExplicitProfiles profiles = MavenProjectsManager.getInstance(l.getProject()).getExplicitProfiles();

    return new MavenRunnerParameters(true, f.getParent().getPath(), goals, profiles.getEnabledProfiles(), profiles.getDisabledProfiles());
  }

  public int compareTo(Object o) {
    return PREFERED;  //To change body of implemented methods use File | Settings | File Templates.
  }
}
