/*
 * 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.validation;

import com.google.idea.blaze.base.lang.buildfile.psi.LoadStatement;
import com.google.idea.blaze.base.lang.buildfile.psi.LoadedSymbol;
import com.google.idea.blaze.base.lang.buildfile.psi.StringLiteral;
import com.google.idea.blaze.base.lang.buildfile.quickfix.DeprecatedLoadQuickFix;
import com.intellij.codeInspection.InspectionManager;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.codeInspection.ProblemHighlightType;
import com.intellij.lang.annotation.Annotation;
import javax.annotation.Nullable;

/** Adds warning/error annotations to load statements. */
public class LoadStatementAnnotator extends BuildAnnotator {

  @Override
  public void visitLoadStatement(LoadStatement node) {
    validateImportTarget(node.getImportPsiElement());
  }

  @Override
  public void visitLoadedSymbol(LoadedSymbol node) {
    StringLiteral loadedString = node.getImport();
    if (loadedString == null) {
      return;
    }
    String name = loadedString.getStringContents();
    if (name.startsWith("_")) {
      markError(node, String.format("Symbol '%s' is private and cannot be imported.", name));
    }
  }

  private void validateImportTarget(@Nullable StringLiteral target) {
    if (target == null) {
      return;
    }
    String targetString = target.getStringContents();
    if (targetString == null
        || targetString.startsWith(":")
        || targetString.startsWith("//")
        || targetString.startsWith("@")
        || targetString.length() < 2) {
      return;
    }
    if (targetString.startsWith("/")) {
      Annotation annotation =
          markWarning(
              target, "Deprecated load syntax; loaded Skylark module should by in label format.");
      InspectionManager inspectionManager = InspectionManager.getInstance(target.getProject());
      ProblemDescriptor descriptor =
          inspectionManager.createProblemDescriptor(
              target,
              annotation.getMessage(),
              DeprecatedLoadQuickFix.INSTANCE,
              ProblemHighlightType.LIKE_DEPRECATED,
              true);
      annotation.registerFix(DeprecatedLoadQuickFix.INSTANCE, null, null, descriptor);
      return;
    }
    markError(target, "Invalid load syntax: missing Skylark module.");
  }
}
