/*
 * 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.base.lang.buildfile.quickfix;

import com.google.idea.blaze.base.bazel.BuildSystemProvider;
import com.google.idea.blaze.base.lang.buildfile.psi.StringLiteral;
import com.google.idea.blaze.base.lang.buildfile.psi.util.PsiUtils;
import com.google.idea.blaze.base.lang.buildfile.references.LabelUtils;
import com.google.idea.blaze.base.model.primitives.WorkspacePath;
import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
import com.google.idea.blaze.base.settings.Blaze;
import com.intellij.codeInsight.intention.HighPriorityAction;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.history.core.Paths;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import java.io.File;
import javax.annotation.Nullable;

/** Offer to convert deprecated statements to label format. */
public class DeprecatedLoadQuickFix implements LocalQuickFix, HighPriorityAction {

  public static final DeprecatedLoadQuickFix INSTANCE = new DeprecatedLoadQuickFix();

  @Override
  public String getFamilyName() {
    return "Fix load statement format";
  }

  @Override
  public String getName() {
    return getFamilyName();
  }

  @Override
  public void applyFix(Project project, ProblemDescriptor descriptor) {
    PsiElement element = descriptor.getPsiElement();
    if (element instanceof StringLiteral) {
      fixLoadString(project, (StringLiteral) element);
    }
  }

  private static void fixLoadString(Project project, StringLiteral importString) {
    String contents = importString.getStringContents();
    if (!contents.startsWith("/") || LabelUtils.isAbsolute(contents)) {
      return;
    }
    WorkspaceRoot root = WorkspaceRoot.fromProjectSafe(project);
    if (root == null) {
      return;
    }
    WorkspacePath workspacePath = WorkspacePath.createIfValid(contents.substring(1));
    if (workspacePath == null) {
      return;
    }
    File file = root.fileForPath(workspacePath);
    File parentPackageFile = findContainingPackage(project, file);
    if (parentPackageFile == null) {
      return;
    }
    WorkspacePath packagePath = root.workspacePathForSafe(parentPackageFile);
    if (packagePath == null) {
      return;
    }
    String relativePath =
        Paths.relativeIfUnder(workspacePath.relativePath(), packagePath.relativePath());
    if (relativePath == null) {
      return;
    }
    String newString = "//" + packagePath + ":" + relativePath + ".bzl";

    ASTNode node = importString.getNode();
    node.replaceChild(
        node.getFirstChildNode(), PsiUtils.createNewLabel(importString.getProject(), newString));
  }

  @Nullable
  private static File findContainingPackage(Project project, File file) {
    BuildSystemProvider provider = Blaze.getBuildSystemProvider(project);
    file = file.getParentFile();
    while (file != null) {
      File buildFile = provider.findBuildFileInDirectory(file);
      if (buildFile != null) {
        return file;
      }
      file = file.getParentFile();
    }
    return null;
  }
}
