/*
 * 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.intellij.execution.actions.ConfigurationContext;
import com.intellij.execution.junit.JUnitUtil;
import com.intellij.ide.util.PsiClassListCellRenderer;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.psi.PsiClass;
import com.intellij.psi.search.searches.ClassInheritorsSearch;
import com.intellij.ui.components.JBList;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import javax.swing.ListSelectionModel;

/**
 * Pop up a dialog to choose a child test class. Called when creating a run configuration from an
 * abstract test class/method.
 */
public class SubclassTestChooser {

  static void chooseSubclass(
      ConfigurationContext context,
      PsiClass abstractClass,
      Consumer<PsiClass> callbackOnClassSelection) {
    List<PsiClass> classes = findTestSubclasses(abstractClass);
    if (classes.isEmpty()) {
      return;
    }
    if (classes.size() == 1) {
      callbackOnClassSelection.accept(classes.get(0));
      return;
    }
    PsiClassListCellRenderer renderer = new PsiClassListCellRenderer();
    classes.sort(renderer.getComparator());
    // JBList has no generics in AS 2.2. TODO: Add generics here when we migrate to AS 2.3.
    JBList list = new JBList(classes);
    list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    list.setCellRenderer(renderer);
    JBPopupFactory.getInstance()
        .createListPopupBuilder(list)
        .setTitle("Choose test class to run")
        .setMovable(false)
        .setResizable(false)
        .setRequestFocus(true)
        .setItemChoosenCallback(
            () -> callbackOnClassSelection.accept((PsiClass) list.getSelectedValue()))
        .createPopup()
        .showInBestPositionFor(context.getDataContext());
  }

  static List<PsiClass> findTestSubclasses(PsiClass abstractClass) {
    return ClassInheritorsSearch.search(abstractClass)
        .findAll()
        .stream()
        .filter(JUnitUtil::isTestClass)
        .collect(Collectors.toList());
  }
}
