# Copyright 2014 The Chromium 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 pylib import constants


class ContentSettings(dict):

  """A dict interface to interact with device content settings.

  System properties are key/value pairs as exposed by adb shell content.
  """

  def __init__(self, table, device):
    super(ContentSettings, self).__init__()
    sdk_version_string = device.GetProp('ro.build.version.sdk')
    try:
      sdk_version = int(sdk_version_string)
      assert sdk_version >= constants.ANDROID_SDK_VERSION_CODES.JELLY_BEAN, (
          'ContentSettings supported only on SDK 16 and later')
    except ValueError:
      assert False, ('Unknown SDK version %s' % sdk_version_string)
    self._table = table
    self._device = device

  @staticmethod
  def _GetTypeBinding(value):
    if isinstance(value, bool):
      return 'b'
    if isinstance(value, float):
      return 'f'
    if isinstance(value, int):
      return 'i'
    if isinstance(value, long):
      return 'l'
    if isinstance(value, str):
      return 's'
    raise ValueError('Unsupported type %s' % type(value))

  def iteritems(self):
    # Example row:
    # 'Row: 0 _id=13, name=logging_id2, value=-1fccbaa546705b05'
    for row in self._device.RunShellCommand(
        'content query --uri content://%s' % self._table, as_root=True):
      fields = row.split(', ')
      key = None
      value = None
      for field in fields:
        k, _, v = field.partition('=')
        if k == 'name':
          key = v
        elif k == 'value':
          value = v
      if not key:
        continue
      if not value:
        value = ''
      yield key, value

  def __getitem__(self, key):
    return self._device.RunShellCommand(
        'content query --uri content://%s --where "name=\'%s\'" '
        '--projection value' % (self._table, key), as_root=True).strip()

  def __setitem__(self, key, value):
    if key in self:
      self._device.RunShellCommand(
          'content update --uri content://%s '
          '--bind value:%s:%s --where "name=\'%s\'"' % (
              self._table,
              self._GetTypeBinding(value), value, key),
          as_root=True)
    else:
      self._device.RunShellCommand(
          'content insert --uri content://%s '
          '--bind name:%s:%s --bind value:%s:%s' % (
              self._table,
              self._GetTypeBinding(key), key,
              self._GetTypeBinding(value), value),
          as_root=True)

  def __delitem__(self, key):
    self._device.RunShellCommand(
        'content delete --uri content://%s '
        '--bind name:%s:%s' % (
            self._table,
            self._GetTypeBinding(key), key),
        as_root=True)
