#!/usr/bin/env python
# Copyright (c) 2012 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.


import json

from grit.format.policy_templates.writers import template_writer


def GetWriter(config):
  '''Factory method for creating RegWriter objects.
  See the constructor of TemplateWriter for description of
  arguments.
  '''
  return RegWriter(['win'], config)


class RegWriter(template_writer.TemplateWriter):
  '''Class for generating policy example files in .reg format (for Windows).
  The generated files will define all the supported policies with example
  values  set for them. This class is used by PolicyTemplateGenerator to
  write .reg  files.
  '''

  NEWLINE = '\r\n'

  def _EscapeRegString(self, string):
    return string.replace('\\', '\\\\').replace('\"', '\\\"')

  def _StartBlock(self, key, suffix, list):
    key = 'HKEY_LOCAL_MACHINE\\' + key
    if suffix:
      key = key + '\\' + suffix
    if key != self._last_key.get(id(list), None):
      list.append('')
      list.append('[%s]' % key)
      self._last_key[id(list)] = key

  def PreprocessPolicies(self, policy_list):
    return self.FlattenGroupsAndSortPolicies(policy_list,
                                             self.GetPolicySortingKey)

  def GetPolicySortingKey(self, policy):
    '''Extracts a sorting key from a policy. These keys can be used for
    list.sort() methods to sort policies.
    See TemplateWriter.SortPoliciesGroupsFirst for usage.
    '''
    is_list = policy['type'] in ('list', 'string-enum-list')
    # Lists come after regular policies.
    return (is_list, policy['name'])

  def _WritePolicy(self, policy, key, list):
    example_value = policy['example_value']

    if policy['type'] == 'external':
      # This type can only be set through cloud policy.
      return
    elif policy['type'] in ('list', 'string-enum-list'):
      self._StartBlock(key, policy['name'], list)
      i = 1
      for item in example_value:
        escaped_str = self._EscapeRegString(item)
        list.append('"%d"="%s"' % (i, escaped_str))
        i = i + 1
    else:
      self._StartBlock(key, None, list)
      if policy['type'] in ('string', 'string-enum', 'dict'):
        example_value_str = json.dumps(example_value, sort_keys=True)
        if policy['type'] == 'dict':
          example_value_str = '"%s"' % example_value_str
      elif policy['type'] == 'main':
        if example_value == True:
          example_value_str = 'dword:00000001'
        else:
          example_value_str = 'dword:00000000'
      elif policy['type'] in ('int', 'int-enum'):
        example_value_str = 'dword:%08x' % example_value
      else:
        raise Exception('unknown policy type %s:' % policy['type'])

      list.append('"%s"=%s' % (policy['name'], example_value_str))

  def WritePolicy(self, policy):
    self._WritePolicy(policy,
                      self.config['win_reg_mandatory_key_name'],
                      self._mandatory)

  def WriteRecommendedPolicy(self, policy):
    self._WritePolicy(policy,
                      self.config['win_reg_recommended_key_name'],
                      self._recommended)

  def BeginTemplate(self):
    pass

  def EndTemplate(self):
    pass

  def Init(self):
    self._mandatory = []
    self._recommended = []
    self._last_key = {}

  def GetTemplateText(self):
    prefix = ['Windows Registry Editor Version 5.00']
    all = prefix + self._mandatory + self._recommended
    return self.NEWLINE.join(all)
