#!/usr/bin/python

# Copyright 2011 Google Inc. All Rights Reserved.

from utils import logger
from download_images import *

class Settings(object):
  """Class representing settings (a set of fields) from an experiment file."""

  def __init__(self, name, settings_type):
    self.name = name
    self.settings_type = settings_type
    self.fields = {}
    self.parent = None

  def SetParentSettings(self, settings):
    """Set the parent settings which these settings can inherit from."""
    self.parent = settings

  def AddField(self, field):
    name = field.name
    if name in self.fields:
      raise Exception("Field %s defined previously." % name)
    self.fields[name] = field

  def SetField(self, name, value, append=False):
    if name not in self.fields:
      raise Exception("'%s' is not a valid field in '%s' settings"
                      % (name, self.settings_type))
    if append:
      self.fields[name].Append(value)
    else:
      self.fields[name].Set(value)

  def GetField(self, name):
    """Get the value of a field with a given name."""
    if name not in self.fields:
      raise Exception("Field '%s' not a valid field in '%s' settings." %
                      (name, self.name))
    field = self.fields[name]
    if not field.assigned and field.required:
      raise Exception("Required field '%s' not defined in '%s' settings." %
                      (name, self.name))
    return self.fields[name].Get()

  def Inherit(self):
    """Inherit any unset values from the parent settings."""
    for name in self.fields:
      if (not self.fields[name].assigned and self.parent and
          name in self.parent.fields and self.parent.fields[name].assigned):
        self.fields[name].Set(self.parent.GetField(name), parse=False)

  def Override(self, settings):
    """Override settings with settings from a different object."""
    for name in settings.fields:
      if name in self.fields and settings.fields[name].assigned:
        self.fields[name].Set(settings.GetField(name), parse=False)

  def Validate(self):
    """Check that all required fields have been set."""
    for name in self.fields:
      if not self.fields[name].assigned and self.fields[name].required:
        raise Exception("Field %s is invalid." % name)

  def GetXbuddyPath(self, path_str, board, chromeos_root, log_level):
    prefix = "remote"
    l = logger.GetLogger()
    if path_str.find("trybot") < 0 and path_str.find(board) < 0:
      xbuddy_path = "%s/%s/%s" % (prefix, board, path_str)
    else:
      xbuddy_path = "%s/%s" % (prefix, path_str)
    image_downloader = ImageDownloader(l, log_level)
    retval, image_path = image_downloader.Run(chromeos_root, xbuddy_path)
    if retval != 0:
      raise Exception("Unable to find/download xbuddy image.")
    return image_path
