#!/usr/bin/python

# Copyright 2011 Google Inc. All Rights Reserved.

from field import BooleanField
from field import EnumField
from field import FloatField
from field import IntegerField
from field import ListField
from field import TextField
from settings import Settings


class BenchmarkSettings(Settings):
  def __init__(self, name):
    super(BenchmarkSettings, self).__init__(name, "benchmark")
    self.AddField(TextField("autotest_name",
                            description="The name of the autotest to run."
                            "Defaults to the name of the benchmark."))
    self.AddField(TextField("autotest_args",
                            description="Arguments to be passed to the "
                            "autotest."))
    self.AddField(IntegerField("iterations", default=3,
                               description="Number of iterations to run the "
                               "autotest."))
    self.AddField(FloatField("outlier_range", default=0.2,
                             description="The percentage of highest/lowest "
                             "values to omit when computing the average."))
    self.AddField(ListField("profile_counters",
                            description="A list of profile counters to "
                            "collect."))
    self.AddField(EnumField("profile_type",
                            description="The type of profile to collect. "
                            "Either 'stat', 'record' or ''.",
                            options=["stat", "record", ""],
                            default=""))


class LabelSettings(Settings):
  def __init__(self, name):
    super(LabelSettings, self).__init__(name, "label")
    self.AddField(TextField("chromeos_image", required=True,
                            description="The path to the image to run tests "
                            "on."))
    self.AddField(TextField("chromeos_root",
                            description="The path to a chromeos checkout which "
                            "contains a src/scripts directory. Defaults to "
                            "the chromeos checkout which contains the "
                            "chromeos_image."))
    self.AddField(TextField("board", required=True, description="The target "
                            "board for running experiments on, e.g. x86-alex."))


class GlobalSettings(Settings):
  def __init__(self, name):
    super(GlobalSettings, self).__init__(name, "global")
    self.AddField(TextField("name",
                            description="The name of the experiment. Just an "
                            "identifier."))
    self.AddField(TextField("board", description="The target "
                            "board for running experiments on, e.g. x86-alex."))
    self.AddField(ListField("remote", required=True,
                            description="A comma-separated list of ip's of "
                            "chromeos devices to run experiments on."))
    self.AddField(BooleanField("rerun_if_failed", description="Whether to "
                               "re-run failed autotest runs or not.",
                               default=False))
    self.AddField(BooleanField("rerun", description="Whether to ignore the "
                               "cache and for autotests to be re-run.",
                               default=False))
    self.AddField(BooleanField("exact_remote", default=False,
                               description="Ensure cached runs are run on the "
                               "same device that is specified as a remote."))
    self.AddField(IntegerField("iterations", default=3,
                               description="Number of iterations to run all "
                               "autotests."))
    self.AddField(TextField("chromeos_root",
                            description="The path to a chromeos checkout which "
                            "contains a src/scripts directory. Defaults to "
                            "the chromeos checkout which contains the "
                            "chromeos_image."))
    self.AddField(ListField("profile_counters",
                            description="A list of profile counters to "
                            "collect."))
    self.AddField(EnumField("profile_type",
                            description="The type of profile to collect. "
                            "Either 'stat', 'record' or ''.",
                            options=["stat", "record", ""]))


class SettingsFactory(object):
  """Factory class for building different types of Settings objects.

  This factory is currently hardcoded to produce settings for ChromeOS
  experiment files. The idea is that in the future, other types
  of settings could be produced.
  """

  def GetSettings(self, name, settings_type):
    if settings_type == "label" or not settings_type:
      return LabelSettings(name)
    if settings_type == "global":
      return GlobalSettings(name)
    if settings_type == "benchmark":
      return BenchmarkSettings(name)

    raise Exception("Invalid settings type: '%s'." % settings_type)
