/*
 * Copyright 2017 The Bazel Authors. All rights reserved.
 *
 * 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.
 */
package com.google.idea.blaze.java.run.producers;

import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import com.google.idea.blaze.base.command.BlazeCommandName;
import com.google.idea.blaze.base.command.BlazeFlags;
import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
import com.google.idea.blaze.base.ideinfo.TestIdeInfo;
import com.google.idea.blaze.base.run.BlazeCommandRunConfiguration;
import com.google.idea.blaze.base.run.BlazeCommandRunConfigurationType;
import com.google.idea.blaze.base.run.BlazeConfigurationNameBuilder;
import com.google.idea.blaze.base.run.producers.BlazeRunConfigurationProducer;
import com.google.idea.blaze.base.run.smrunner.SmRunnerUtils;
import com.google.idea.blaze.base.run.state.BlazeCommandRunConfigurationCommonState;
import com.google.idea.blaze.java.run.RunUtil;
import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.execution.JavaExecutionUtil;
import com.intellij.execution.Location;
import com.intellij.execution.actions.ConfigurationContext;
import com.intellij.execution.actions.ConfigurationFromContext;
import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.execution.junit.JUnitUtil;
import com.intellij.openapi.util.Ref;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.util.PsiTreeUtil;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nullable;

/** Producer for abstract test classes/methods. */
public class BlazeJavaAbstractTestCaseConfigurationProducer
    extends BlazeRunConfigurationProducer<BlazeCommandRunConfiguration> {

  private static class AbstractTestLocation {
    private final PsiClass abstractClass;
    @Nullable private final PsiMethod method;

    private AbstractTestLocation(PsiClass abstractClass, @Nullable PsiMethod method) {
      this.abstractClass = abstractClass;
      this.method = method;
    }
  }

  public BlazeJavaAbstractTestCaseConfigurationProducer() {
    super(BlazeCommandRunConfigurationType.getInstance());
  }

  @Override
  protected boolean doSetupConfigFromContext(
      BlazeCommandRunConfiguration configuration,
      ConfigurationContext context,
      Ref<PsiElement> sourceElement) {
    AbstractTestLocation location = getAbstractLocation(context);
    if (location == null) {
      return false;
    }
    sourceElement.set(location.method != null ? location.method : location.abstractClass);
    configuration.setName(configName(location.abstractClass, location.method));
    configuration.setNameChangedByUser(true);
    return true;
  }

  @Nullable
  private static AbstractTestLocation getAbstractLocation(ConfigurationContext context) {
    if (!SmRunnerUtils.getSelectedSmRunnerTreeElements(context).isEmpty()) {
      // handled by a different producer
      return null;
    }
    PsiMethod method = getTestMethod(context);
    if (method != null) {
      PsiClass psiClass = method.getContainingClass();
      return isAbstractClass(psiClass) ? new AbstractTestLocation(psiClass, method) : null;
    }
    Location location = context.getLocation();
    if (location == null) {
      return null;
    }
    location = JavaExecutionUtil.stepIntoSingleClass(location);
    if (location == null) {
      return null;
    }
    PsiClass psiClass =
        PsiTreeUtil.getParentOfType(location.getPsiElement(), PsiClass.class, false);
    if (!isAbstractClass(psiClass)) {
      return null;
    }
    for (PsiClass subclass : SubclassTestChooser.findTestSubclasses(psiClass)) {
      if (JUnitUtil.isTestClass(subclass)) {
        return new AbstractTestLocation(psiClass, null);
      }
    }
    return null;
  }

  private static PsiMethod getTestMethod(ConfigurationContext context) {
    PsiElement psi = context.getPsiLocation();
    if (psi instanceof PsiMethod
        && AnnotationUtil.isAnnotated((PsiMethod) psi, JUnitUtil.TEST_ANNOTATION, false)) {
      return (PsiMethod) psi;
    }
    List<PsiMethod> selectedMethods = TestMethodSelectionUtil.getSelectedMethods(context);
    return selectedMethods != null && selectedMethods.size() == 1 ? selectedMethods.get(0) : null;
  }

  private static boolean isAbstractClass(@Nullable PsiClass psiClass) {
    return psiClass != null && psiClass.hasModifierProperty(PsiModifier.ABSTRACT);
  }

  @Override
  protected boolean doIsConfigFromContext(
      BlazeCommandRunConfiguration configuration, ConfigurationContext context) {
    // this is an intermediate type -- when it's fully instantiated (via 'onFirstRun') it will be
    // recognized by a different producer.
    return false;
  }

  @Override
  public void onFirstRun(
      ConfigurationFromContext configuration,
      ConfigurationContext context,
      Runnable startRunnable) {
    chooseSubclass(configuration, context, startRunnable);
  }

  @VisibleForTesting
  static void chooseSubclass(
      ConfigurationFromContext configuration,
      ConfigurationContext context,
      Runnable startRunnable) {
    RunConfiguration config = configuration.getConfiguration();
    if (!(config instanceof BlazeCommandRunConfiguration)) {
      return;
    }
    AbstractTestLocation location = locationFromConfiguration(configuration);
    if (location == null) {
      return;
    }
    SubclassTestChooser.chooseSubclass(
        context,
        location.abstractClass,
        (psiClass) -> {
          if (psiClass != null) {
            setupContext((BlazeCommandRunConfiguration) config, psiClass, location.method);
          }
          startRunnable.run();
        });
  }

  @Nullable
  private static AbstractTestLocation locationFromConfiguration(
      ConfigurationFromContext configuration) {
    PsiElement element = configuration.getSourceElement();
    PsiMethod method = null;
    PsiClass psiClass = null;
    if (element instanceof PsiMethod) {
      method = (PsiMethod) element;
      psiClass = method.getContainingClass();
    } else if (element instanceof PsiClass) {
      psiClass = (PsiClass) element;
    }

    return isAbstractClass(psiClass) ? new AbstractTestLocation(psiClass, method) : null;
  }

  private static void setupContext(
      BlazeCommandRunConfiguration configuration, PsiClass subClass, @Nullable PsiMethod method) {
    TestIdeInfo.TestSize testSize =
        method != null
            ? TestSizeAnnotationMap.getTestSize(method)
            : TestSizeAnnotationMap.getTestSize(subClass);
    TargetIdeInfo target = RunUtil.targetForTestClass(subClass, testSize);
    if (target == null) {
      return;
    }
    configuration.setTarget(target.key.label);
    BlazeCommandRunConfigurationCommonState handlerState =
        configuration.getHandlerStateIfType(BlazeCommandRunConfigurationCommonState.class);
    if (handlerState == null) {
      return;
    }
    handlerState.getCommandState().setCommand(BlazeCommandName.TEST);

    // remove old test filter flag if present
    List<String> flags = new ArrayList<>(handlerState.getBlazeFlagsState().getRawFlags());
    flags.removeIf((flag) -> flag.startsWith(BlazeFlags.TEST_FILTER));

    String testFilter =
        BlazeJUnitTestFilterFlags.testFilterForClassAndMethods(
            subClass, method == null ? ImmutableList.of() : ImmutableList.of(method));
    if (testFilter == null) {
      return;
    }
    flags.add(BlazeFlags.TEST_FILTER + "=" + testFilter);
    handlerState.getBlazeFlagsState().setRawFlags(flags);

    BlazeConfigurationNameBuilder nameBuilder = new BlazeConfigurationNameBuilder(configuration);
    nameBuilder.setTargetString(configName(subClass, method));
    configuration.setName(nameBuilder.build());
    configuration.setNameChangedByUser(true); // don't revert to generated name
  }

  private static String configName(PsiClass psiClass, @Nullable PsiMethod method) {
    return method == null
        ? psiClass.getName()
        : String.format("%s.%s", psiClass.getName(), method.getName());
  }
}
