"""Convenience methods for plugin_api."""

# The current indirect ij_product mapping (eg. "intellij-latest")
INDIRECT_IJ_PRODUCTS = {
    "intellij-latest": "intellij-2016.3.1",
    "android-studio-latest": "android-studio-145.1617.8",
    "android-studio-beta": "android-studio-2.3.0.4",
    "clion-latest": "clion-162.1967.7",
}

DIRECT_IJ_PRODUCTS = {
    "intellij-2016.3.1": struct(
        ide="intellij",
        directory="intellij_ce_2016_3_1",
    ),
    "intellij-162.2032.8": struct(
        ide="intellij",
        directory="IC_162_2032_8",
    ),
    "android-studio-145.1617.8": struct(
        ide="android-studio",
        directory="AI_145_1617_8",
    ),
    "android-studio-2.3.0.3": struct(
        ide="android-studio",
        directory="android_studio_2_3_0_3",
    ),
    "android-studio-2.3.0.4": struct(
        ide="android-studio",
        directory="android_studio_2_3_0_4",
    ),
    "clion-162.1967.7": struct(
        ide="clion",
        directory="CL_162_1967_7",
    ),
    "clion-2016.3.2": struct(
        ide="clion",
        directory="clion_2016_3_2",
    ),
}

# BUILD_VARS for each IDE corresponding to indirect ij_products, eg. "intellij-latest"






def select_for_plugin_api(params):
  """Selects for a plugin_api.

  Args:
      params: A dict with ij_product -> value.
              You may only include direct ij_products here,
              not indirects (eg. intellij-latest).
  Returns:
      A select statement on all plugin_apis. Unless you include a "default",
      a non-matched plugin_api will result in an error.

  Example:
    java_library(
      name = "foo",
      srcs = select_for_plugin_api({
          "intellij-2016.3.1": [...my intellij 2016.3 sources ....],
          "intellij-2012.2.4": [...my intellij 2016.2 sources ...],
      }),
    )
  """
  if not params:
    fail("Empty select_for_plugin_api")

  for indirect_ij_product in INDIRECT_IJ_PRODUCTS:
    if indirect_ij_product in params:
      error_message = "".join([
          "Do not select on indirect ij_product %s. " % indirect_ij_product,
          "Instead, select on an exact ij_product."])
      fail(error_message)

  expanded_params = dict(**params)

  # Expand all indirect plugin_apis to point to their
  # corresponding direct plugin_api.
  #
  # {"intellij-2016.3.1": "foo"} ->
  # {"intellij-2016.3.1": "foo", "intellij-latest": "foo"}
  for indirect_ij_product, resolved_plugin_api in INDIRECT_IJ_PRODUCTS.items():
    if resolved_plugin_api in params:
      expanded_params[indirect_ij_product] = params[resolved_plugin_api]

  # Map the shorthand ij_products to full config_setting targets.
  # This makes it more convenient so the user doesn't have to
  # fully specify the path to the plugin_apis
  select_params = dict()
  for ij_product, value in expanded_params.items():
    if ij_product == "default":
      select_params["//conditions:default"] = value
    else:
      select_params["//intellij_platform_sdk:" + ij_product] = value

  return select(select_params)

def select_for_ide(intellij=None, android_studio=None, clion=None, default=None):
  """Selects for the supported IDEs.

  Args:
      intellij: Files to use for IntelliJ. If None, will use default.
      android_studio: Files to use for Android Studio. If None will use default.
      clion: Files to use for CLion. If None will use default.
      default: Files to use for any IDEs not passed.
  Returns:
      A select statement on all plugin_apis, sorted into IDEs.

  Example:
    java_library(
      name = "foo",
      srcs = select_for_ide(
          clion = [":cpp_only_sources"],
          default = [":java_only_sources"],
      ),
    )
  """
  intellij = intellij or default
  android_studio = android_studio or default
  clion = clion or default

  ide_to_value = {
      "intellij" : intellij,
      "android-studio": android_studio,
      "clion": clion,
  }

  # Map (direct ij_product) -> corresponding ide value
  params = dict()
  for ij_product, value in DIRECT_IJ_PRODUCTS.items():
    params[ij_product] = ide_to_value[value.ide]
  params["default"] = default

  return select_for_plugin_api(params)

def _plugin_api_directory(value):
  return "@" + value.directory + "//"

def select_from_plugin_api_directory(intellij, android_studio, clion):
  """Internal convenience method to generate select statement from the IDE's plugin_api directories."""

  ide_to_value = {
      "intellij" : intellij,
      "android-studio": android_studio,
      "clion": clion,
  }

  # Map (direct ij_product) -> corresponding product directory
  params = dict()
  for ij_product, value in DIRECT_IJ_PRODUCTS.items():
    params[ij_product] = [_plugin_api_directory(value) + item for item in ide_to_value[value.ide]]

  # No ij_product == intellij-latest
  params["default"] = params[INDIRECT_IJ_PRODUCTS["intellij-latest"]]

  return select_for_plugin_api(params)
