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

import com.google.idea.blaze.base.model.BlazeVersionData;
import com.google.idea.blaze.base.scope.BlazeContext;
import com.intellij.openapi.extensions.ExtensionPointName;

/**
 * Verifies that the available Blaze version is supported by this plugin.
 *
 * <p>Notifies the user if they're using an unsupported version of Blaze.
 */
public interface BuildSystemVersionChecker {

  ExtensionPointName<BuildSystemVersionChecker> EP_NAME =
      ExtensionPointName.create("com.google.idea.blaze.BuildSystemVersionChecker");

  static boolean verifyVersionSupported(BlazeContext context, BlazeVersionData version) {
    for (BuildSystemVersionChecker checker : EP_NAME.getExtensions()) {
      if (!checker.versionSupported(context, version)) {
        return false;
      }
    }
    return true;
  }

  /**
   * Returns false if the blaze version is unsupported.
   *
   * <p>Also displays corresponding errors via the {@link BlazeContext}.
   */
  boolean versionSupported(BlazeContext context, BlazeVersionData version);
}
