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

import com.google.idea.blaze.base.bazel.BuildSystemProvider;
import com.intellij.ide.DataManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import javax.annotation.Nullable;
import javax.swing.SwingUtilities;

/** Blaze project utilities. */
public class Blaze {

  /** Build system enum */
  public enum BuildSystem {
    Blaze,
    Bazel;

    /** The build system name, capitalized. */
    public String getName() {
      return name();
    }

    /** The build system name, capitalized. */
    public String getLowerCaseName() {
      return name().toLowerCase();
    }
  }

  private Blaze() {}

  public static boolean isBlazeProjectOpen() {
    for (Project project : ProjectManager.getInstance().getOpenProjects()) {
      if (isBlazeProject(project)) {
        return true;
      }
    }
    return false;
  }

  /** Returns whether this project was imported from blaze. */
  public static boolean isBlazeProject(Project project) {
    return BlazeImportSettingsManager.getInstance(project).getImportSettings() != null;
  }

  /**
   * Returns the build system associated with this project, or falls back to the default blaze build
   * system if the project is null or not a blaze project.
   */
  public static BuildSystem getBuildSystem(@Nullable Project project) {
    BlazeImportSettings importSettings =
        project == null
            ? null
            : BlazeImportSettingsManager.getInstance(project).getImportSettings();
    if (importSettings == null) {
      return BuildSystemProvider.defaultBuildSystem().buildSystem();
    }
    return importSettings.getBuildSystem();
  }

  /**
   * Returns the build system provider associated with this project, or falls back to the default
   * blaze build system if the project is null or not a blaze project.
   */
  public static BuildSystemProvider getBuildSystemProvider(@Nullable Project project) {
    BuildSystemProvider provider =
        BuildSystemProvider.getBuildSystemProvider(getBuildSystem(project));
    return provider != null ? provider : BuildSystemProvider.defaultBuildSystem();
  }

  /**
   * The name of the build system associated with the given project, or falls back to the default
   * blaze build system if the project is null or not a blaze project.
   */
  public static String buildSystemName(@Nullable Project project) {
    return getBuildSystem(project).getName();
  }

  /** The default build system */
  public static BuildSystem defaultBuildSystem() {
    return BuildSystemProvider.defaultBuildSystem().buildSystem();
  }

  /**
   * The name of the application-wide build system default. This should only be used in situations
   * where it doesn't make sense to use the build system associated with the current project (e.g.
   * the import project action).
   */
  public static String defaultBuildSystemName() {
    return BuildSystemProvider.defaultBuildSystem().buildSystem().getName();
  }

  /**
   * Tries to guess the current project, and uses that to determine the build system name.<br>
   * Should only be used in situations where the current project is not accessible.
   */
  public static String guessBuildSystemName() {
    Project project = guessCurrentProject();
    return buildSystemName(project);
  }

  private static Project guessCurrentProject() {
    Project[] openProjects = ProjectManager.getInstance().getOpenProjects();
    if (openProjects.length == 1) {
      return openProjects[0];
    }
    if (SwingUtilities.isEventDispatchThread()) {
      return (Project) DataManager.getInstance().getDataContext().getData("project");
    }
    return null;
  }
}
