/*
 * Copyright 2016 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.android.sync.importer.problems;

import com.google.idea.blaze.android.projectview.GeneratedAndroidResourcesSection;
import com.google.idea.blaze.android.projectview.GenfilesPath;
import com.google.idea.blaze.base.ideinfo.ArtifactLocation;
import com.google.idea.blaze.base.projectview.ProjectViewEdit;
import com.google.idea.blaze.base.projectview.section.ListSection;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileEditor.OpenFileDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.Navigatable;
import java.io.File;

/**
 * Action to whitelist a generated resource directory in the local project view file.
 *
 * <p>This is unfortunately wrapped in a navigatable, because the IntelliJ ProblemsView class
 * doesn't have an extension point or action group ID for extending the right-click actions.
 *
 * <p>Ideally, we would have a quick fix in the java R.type.foo and xml @type/foo references, but to
 * know which generated directory contains type.foo, we would need to parse the resources, which
 * would be expensive.
 */
class AddGeneratedResourceDirectoryNavigatable implements Navigatable {

  private final Project project;
  private final File projectViewFile;
  private final ArtifactLocation generatedResDir;

  AddGeneratedResourceDirectoryNavigatable(
      Project project, File projectViewFile, ArtifactLocation generatedResDir) {
    this.project = project;
    this.projectViewFile = projectViewFile;
    this.generatedResDir = generatedResDir;
  }

  @Override
  public void navigate(boolean requestFocus) {
    int addToProjectView =
        Messages.showYesNoDialog(
            String.format(
                "Whitelist generated resource directory \"%s\" in project view?",
                generatedResDir.getRelativePath()),
            "Whitelist generated resource",
            null);
    if (addToProjectView == Messages.YES) {
      addDirectoryToProjectView(project, projectViewFile, generatedResDir);
    }
  }

  @Override
  public boolean canNavigate() {
    return true;
  }

  @Override
  public boolean canNavigateToSource() {
    return false;
  }

  private static void addDirectoryToProjectView(
      Project project, File projectViewFile, ArtifactLocation generatedResDir) {
    ProjectViewEdit edit =
        ProjectViewEdit.editLocalProjectView(
            project,
            builder -> {
              ListSection<GenfilesPath> existingSection =
                  builder.getLast(GeneratedAndroidResourcesSection.KEY);
              ListSection.Builder<GenfilesPath> directoryBuilder =
                  ListSection.update(GeneratedAndroidResourcesSection.KEY, existingSection);
              directoryBuilder.add(new GenfilesPath(generatedResDir.getRelativePath()));
              builder.replace(existingSection, directoryBuilder);
              return true;
            });
    if (edit == null) {
      Messages.showErrorDialog(
          "Could not modify project view. Check for errors in your project view and try again",
          "Error");
      return;
    }
    edit.apply();
    VirtualFile projectView = VfsUtil.findFileByIoFile(projectViewFile, false);
    if (projectView != null) {
      FileEditorManager.getInstance(project)
          .openEditor(new OpenFileDescriptor(project, projectView), true);
    }
  }
}
