#!/usr/bin/env python
# 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.

"""Scans the Chromium source of UseCounter, formats the Feature enum for
histograms.xml and merges it. This script can also generate a python code
snippet to put in uma.py of Chromium Dashboard. Make sure that you review the
output for correctness.
"""

import optparse
import os
import sys

from update_histogram_enum import ReadHistogramValues
from update_histogram_enum import UpdateHistogramEnum


def PrintEnumForDashboard(enum_dict):
  """Prints enum_items formatted for use in uma.py of Chromium dashboard."""
  for key in sorted(enum_dict.iterkeys()):
    print '  %d: \'%s\',' % (key, enum_dict[key])


if __name__ == '__main__':
  parser = optparse.OptionParser()
  parser.add_option('--for-dashboard', action='store_true', dest='dashboard',
                    default=False,
                    help='Print enum definition formatted for use in uma.py of '
                    'Chromium dashboard developed at '
                    'https://github.com/GoogleChrome/chromium-dashboard')
  options, args = parser.parse_args()

  source_path = 'third_party/blink/public/mojom/web_feature/web_feature.mojom'

  START_MARKER = '^enum WebFeature {'
  END_MARKER = '^kNumberOfFeatures'

  if options.dashboard:
    enum_dict, ignored = ReadHistogramValues(source_path, START_MARKER,
        END_MARKER, strip_k_prefix=True)
    PrintEnumForDashboard(enum_dict)
  else:
    UpdateHistogramEnum(
        histogram_enum_name='FeatureObserver',
        source_enum_path=source_path,
        start_marker=START_MARKER,
        end_marker=END_MARKER,
        strip_k_prefix=True)
