# Copyright 2013 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 os.path

from code import Code
import cpp_util


class HGenerator(object):
  def Generate(self, features, source_file, namespace):
    return _Generator(features, source_file, namespace).Generate()


class _Generator(object):
  """A .cc generator for features.
  """
  def __init__(self, features, source_file, namespace):
    self._feature_defs = features
    self._source_file = source_file
    self._source_file_filename, _ = os.path.splitext(source_file)
    self._class_name = cpp_util.ClassName(self._source_file_filename)
    self._namespace = namespace

  def Generate(self):
    """Generates a Code object for features.
    """
    c = Code()
    (c.Append(cpp_util.CHROMIUM_LICENSE)
      .Append()
      .Append(cpp_util.GENERATED_FEATURE_MESSAGE % self._source_file)
      .Append()
    )
    ifndef_name = cpp_util.GenerateIfndefName(self._source_file_filename,
                                              self._class_name)
    (c.Append('#ifndef %s' % ifndef_name)
      .Append('#define %s' % ifndef_name)
      .Append()
    )

    (c.Append('#include <map>')
      .Append('#include <string>')
      .Append()
      .Concat(cpp_util.OpenNamespace(self._namespace))
      .Append()
    )

    (c.Append('class %s {' % self._class_name)
      .Append(' public:')
      .Sblock()
      .Concat(self._GeneratePublicBody())
      .Eblock()
      .Append(' private:')
      .Sblock()
      .Concat(self._GeneratePrivateBody())
      .Eblock('};')
      .Append()
      .Cblock(cpp_util.CloseNamespace(self._namespace))
    )
    (c.Append('#endif  // %s' % ifndef_name)
      .Append()
    )
    return c

  def _GeneratePublicBody(self):
    c = Code()

    (c.Append('%s();' % self._class_name)
      .Append()
      .Append('enum ID {')
      .Concat(self._GenerateEnumConstants())
      .Eblock('};')
      .Append()
      .Append('const char* ToString(ID id) const;')
      .Append('ID FromString(const std::string& id) const;')
      .Append()
    )
    return c

  def _GeneratePrivateBody(self):
    return Code().Append('std::map<std::string, '
                         '%s::ID> features_;' % self._class_name)

  def _GenerateEnumConstants(self):
    c = Code()

    (c.Sblock()
      .Append('kUnknown,')
    )
    for feature in self._feature_defs:
      c.Append('%s,' % cpp_util.ConstantName(feature.name))
    c.Append('kEnumBoundary')

    return c
