// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInspection.ui.actions;

import com.intellij.codeInsight.daemon.HighlightDisplayKey;
import com.intellij.codeInspection.InspectionsBundle;
import com.intellij.codeInspection.ex.EditInspectionToolsSettingsAction;
import com.intellij.codeInspection.ex.InspectionProfileImpl;
import com.intellij.codeInspection.ex.InspectionToolWrapper;
import com.intellij.codeInspection.ui.InspectionResultsView;
import com.intellij.codeInspection.ui.OptionPaneRenderer;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.ui.DialogBuilder;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.ui.ExperimentalUI;
import org.jetbrains.annotations.NotNull;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.util.Objects;

/**
 * @author Dmitry Batkovich
 */
public final class EditSettingsAction extends InspectionViewActionBase {
  private static final Logger LOG = Logger.getInstance(EditSettingsAction.class);

  public EditSettingsAction() {
    super(InspectionsBundle.messagePointer(
            ExperimentalUI.isNewUI() ? "inspection.action.edit.settings.new" : "inspection.action.edit.settings"),
          Presentation.NULL_STRING, AllIcons.General.Settings);
  }

  @Override
  protected boolean isEnabled(@NotNull InspectionResultsView view, AnActionEvent e) {
    boolean enabled = view.areSettingsEnabled();
    e.getPresentation().setDescription(enabled
                                       ? InspectionsBundle.message(ExperimentalUI.isNewUI() ? "inspection.action.edit.settings.new" : "inspection.action.edit.settings")
                                       : InspectionsBundle.message("inspection.tool.window.dialog.no.options", getSingleTool(view).getDisplayName()));
    return enabled;
  }

  @Override
  public void actionPerformed(@NotNull AnActionEvent e) {
    final InspectionResultsView view = getView(e);
    InspectionProfileImpl inspectionProfile = view.getCurrentProfile();

    if (view.isSingleInspectionRun()) {
      InspectionToolWrapper tool = getSingleTool(view);
      final DialogBuilder builder = new DialogBuilder()
        .title(InspectionsBundle.message("inspection.tool.window.inspection.dialog.title", tool.getDisplayName()));
      JComponent panel = OptionPaneRenderer.createOptionsPanel(tool.getTool(), builder, e.getProject());
      LOG.assertTrue(panel != null, "Unexpectedly inspection '" + tool.getShortName() + "' didn't create an options panel");
      builder.centerPanel(panel);
      builder.removeAllActions();
      builder.addOkAction();
      if (view.isRerunAvailable()) {
        builder.addActionDescriptor(new DialogBuilder.DialogActionDescriptor(InspectionsBundle.message("inspection.action.rerun"), -1) {
          @Override
          protected Action createAction(DialogWrapper dialogWrapper) {
            return new AbstractAction() {
              @Override
              public void actionPerformed(ActionEvent e) {
                view.rerun();
                dialogWrapper.close(DialogWrapper.OK_EXIT_CODE);
              }
            };
          }
        });
      }
      builder.show();
    } else {
      final InspectionToolWrapper toolWrapper = view.getTree().getSelectedToolWrapper(false);
      if (toolWrapper != null) {
        final HighlightDisplayKey key = HighlightDisplayKey.find(toolWrapper.getShortName()); //do not search for dead code entry point tool
        if (key != null) {
          new EditInspectionToolsSettingsAction(key).editToolSettings(view.getProject(), inspectionProfile);
          return;
        }
      }

      final String[] path = view.getTree().getSelectedGroupPath();
      EditInspectionToolsSettingsAction.editSettings(view.getProject(), inspectionProfile, (c) -> {
        if (path != null) {
          c.selectInspectionGroup(path);
        }
      });
    }
  }

  @NotNull
  private static InspectionToolWrapper getSingleTool(InspectionResultsView view) {
    InspectionProfileImpl profile = view.getCurrentProfile();
    return Objects.requireNonNull(profile.getInspectionTool(Objects.requireNonNull(profile.getSingleTool()), view.getProject()));
  }
}
