# Copyright 2018 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from page_sets.rendering import story_tags
from page_sets.system_health import platforms

from telemetry.page import page


class _MetaRenderingStory(type):
  """Metaclass for RenderingStory."""

  @property
  def ABSTRACT_STORY(cls):
    """Class field marking whether the class is abstract.

    If true, the page will NOT be instantiated and added to a Rendering
    page set. This field is NOT inherited by subclasses (that's why it's
    defined on the metaclass).
    """
    return cls.__dict__.get('ABSTRACT_STORY', False)


class RenderingStory(page.Page, metaclass=_MetaRenderingStory):
  """Abstract base class for Rendering user stories."""

  BASE_NAME = NotImplemented
  URL = NotImplemented
  ABSTRACT_STORY = True
  SUPPORTED_PLATFORMS = platforms.ALL_PLATFORMS
  TAGS = []
  PLATFORM_SPECIFIC = False
  YEAR = None
  DISABLE_TRACING = False
  EXTRA_BROWSER_ARGUMENTS = None

  def __init__(
    self,
    page_set,
    shared_page_state_class,
    name_suffix='',
    extra_browser_args=None,
    make_javascript_deterministic=True,
    base_dir=None,
    perform_final_navigation=True,
  ):
    tags = []
    for t in self.TAGS:
      assert t in story_tags.ALL_TAGS
      tags.append(t.name)
    name = self.BASE_NAME + name_suffix
    if self.YEAR:
      name += '_' + self.YEAR
    super(RenderingStory, self).__init__(
      page_set=page_set,
      name=name,
      url=self.URL,
      tags=tags,
      platform_specific=self.PLATFORM_SPECIFIC,
      shared_page_state_class=shared_page_state_class,
      extra_browser_args=extra_browser_args,
      make_javascript_deterministic=make_javascript_deterministic,
      base_dir=base_dir,
      perform_final_navigation=perform_final_navigation,
    )

  def WillStartTracing(self, chrome_trace_config):
    chrome_trace_config.category_filter.AddIncludedCategory('benchmark')
    chrome_trace_config.category_filter.AddIncludedCategory('v8')
