# Copyright 2018 the V8 project authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from . import base
from ..local.variants import ALL_VARIANTS, ALL_VARIANT_FLAGS
from .result import GroupedResult


STANDARD_VARIANT = set(["default"])


class VariantProc(base.TestProcProducer):
  """Processor creating variants.

  For each test it keeps generator that returns variant, flags and id suffix.
  It produces variants one at a time, so it's waiting for the result of one
  variant to create another variant of the same test.
  It maintains the order of the variants passed to the init.

  There are some cases when particular variant of the test is not valid. To
  ignore subtests like that, StatusFileFilterProc should be placed somewhere
  after the VariantProc.
  """

  def __init__(self, variants):
    super(VariantProc, self).__init__('VariantProc')
    self._next_variant = {}
    self._variant_gens = {}
    self._variants = variants

  def setup(self, requirement=base.DROP_RESULT):
    super(VariantProc, self).setup(requirement)

    # VariantProc is optimized for dropping the result and it should be placed
    # in the chain where it's possible.
    assert requirement == base.DROP_RESULT

  def _next_test(self, test):
    gen = self._variants_gen(test)
    self._next_variant[test.procid] = gen
    return self._try_send_new_subtest(test, gen)

  def _result_for(self, test, subtest, result):
    gen = self._next_variant[test.procid]
    if not self._try_send_new_subtest(test, gen):
      self._send_result(test, None)

  def _try_send_new_subtest(self, test, variants_gen):
    for variant, flags, suffix in variants_gen:
      subtest = self._create_subtest(test, '%s-%s' % (variant, suffix),
                                     variant=variant, flags=flags)
      if self._send_test(subtest):
        return True

    del self._next_variant[test.procid]
    return False

  def _variants_gen(self, test):
    """Generator producing (variant, flags, procid suffix) tuples."""
    return self._get_variants_gen(test).gen(test)

  def _get_variants_gen(self, test):
    key = test.suite.name
    variants_gen = self._variant_gens.get(key)
    if not variants_gen:
      variants_gen = test.suite.get_variants_gen(self._variants)
      self._variant_gens[key] = variants_gen
    return variants_gen
