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

import argparse
import re
import xml.dom.minidom

import extract_histograms
import histogram_paths
import histogram_configuration_model
import merge_xml


def ConstructHistogram(doc, name, histogram_dict):
  """Constructs a histogram node based on the |histogram_dict|."""
  histogram = doc.createElement('histogram')
  # Set histogram node attributes.
  histogram.setAttribute('name', name)
  if 'enum' in histogram_dict:
    histogram.setAttribute('enum', histogram_dict['enum']['name'])
  else:
    histogram.setAttribute('units', histogram_dict['units'])
  if 'expires_after' in histogram_dict:
    histogram.setAttribute('expires_after', histogram_dict['expires_after'])
  if histogram_dict.get('base', False):
    histogram.setAttribute('base', 'true')
  # Populate the obsolete node.
  if 'obsolete' in histogram_dict:
    obsolete_node = doc.createElement('obsolete')
    obsolete_node.appendChild(doc.createTextNode(histogram_dict['obsolete']))
    histogram.appendChild(obsolete_node)
  # Populate owner nodes.
  for owner in histogram_dict.get('owners', []):
    owner_node = doc.createElement('owner')
    owner_node.appendChild(doc.createTextNode(owner))
    histogram.appendChild(owner_node)
  # Populate the summary nodes.
  if 'summary' in histogram_dict:
    summary_node = doc.createElement('summary')
    summary_node.appendChild(doc.createTextNode(histogram_dict['summary']))
    histogram.appendChild(summary_node)
  return histogram


def main(args):
  try:
    pattern = re.compile(args.pattern)
  except re.error:
    print("Non valid regex pattern.")
    return

  # Extract all histograms into a dict.
  doc = merge_xml.MergeFiles(filenames=histogram_paths.ALL_XMLS,
                             should_expand_owners=True)
  histograms, had_errors = extract_histograms.ExtractHistogramsFromDom(doc)
  if had_errors:
    raise ValueError("Error parsing inputs.")
  # Construct a dom tree that is similar to the normal histograms.xml so that
  # we can use histogram_configuration_model to pretty print it.
  doc = xml.dom.minidom.Document()
  configuration = doc.createElement('histogram-configuration')
  histograms_node = doc.createElement('histograms')
  for name, histogram in histograms.items():
    if re.match(pattern, name):
      histograms_node.appendChild(ConstructHistogram(doc, name, histogram))
  configuration.appendChild(histograms_node)
  doc.appendChild(configuration)
  print(histogram_configuration_model.PrettifyTree(doc))


if __name__ == '__main__':
  parser = argparse.ArgumentParser(description='Print expanded histograms.')
  parser.add_argument('--pattern',
                      type=str,
                      default='.*',
                      help='The histogram regex you want to print.')
  args = parser.parse_args()
  main(args)
