#!/usr/bin/env python
# Copyright 2014 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""A simple tool to go through histograms.xml and print out the owners for
histograms.
"""

from __future__ import print_function

import os
import sys
from xml.etree import ElementTree as ET

import extract_histograms
import histogram_paths
import merge_xml

sys.path.append(os.path.join(os.path.dirname(__file__), 'common'))
import path_util


def PrintOwners(root):
  assert root.tag == 'histogram-configuration'
  root_children = root.getchildren()
  histograms = None
  for node in root_children:
    if node.tag == 'histograms':
      histograms = node
      break
  assert histograms != None

  for histogram in histograms.getchildren():
    if histogram.tag != 'histogram':
      continue

    name = histogram.attrib['name']
    owners = []
    obsolete = False
    for node in histogram.getchildren():
      if node.tag == 'obsolete':
        obsolete = True
        continue
      if node.tag != 'owner':
        continue
      if node.text == extract_histograms.OWNER_PLACEHOLDER:
        continue
      owners.append(node.text)

    if not obsolete:
      if owners:
        print(name, ' '.join(owners))
      else:
        print(name, 'NO_OWNER')


def main():
  """Prints the owners of histograms in a specific file or of all histograms.

  Args:
    argv[1]: Optional argument that is the relative path to a specific
        histograms.xml.

  Example usage to print owners of metadata/Accessibility/histograms.xml:
    python histogram_ownership.py metadata/Accessibility/histograms.xml

  Example usage to print owners of all histograms:
    python histogram_ownership.py
  """
  if len(sys.argv) == 1:
    merged_xml_string = merge_xml.MergeFiles(
        histogram_paths.ALL_XMLS, should_expand_owners=True).toxml()
    root = ET.fromstring(merged_xml_string)
  else:
    rel_path = path_util.GetInputFile(
        os.path.join('tools', 'metrics', 'histograms', sys.argv[1]))
    if not os.path.exists(rel_path):
      raise ValueError("A histograms.xml file does not exist in %s" % rel_path)

    tree = ET.parse(rel_path)
    root = tree.getroot()

  PrintOwners(root)


if __name__ == '__main__':
  main()
