#!/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.
"""
Paths to description XML files in this directory.

When executed, updates the `histograms_xml_files.gni` file to correspond to the
histograms.xml and enums.xml files that exist.
"""

import os

import setup_modules  # pylint: disable=unused-import

import chromium_src.tools.metrics.common.path_util as path_util

_HISTOGRAM_XML_FILE_NAMES = ['histograms.xml', 'histogram_suffixes_list.xml']
_ENUMS_XML_FILE_NAMES = ['enums.xml']


def _FindXmlFiles(filenames):
  """Gets a list relative path to all metrics XML files under metadata/."""
  files = []
  for dir_name, _, file_list in os.walk(PATH_TO_METADATA_DIR):
    for filename in file_list:
      if filename in filenames:
        # Compute the relative path of the histograms xml file.
        file_path = os.path.relpath(
          os.path.join(dir_name, filename), PATH_TO_METADATA_DIR
        )
        files.append(
          os.path.join('tools/metrics/histograms/metadata', file_path)
          .replace(os.sep, '/')
          .lower()
        )
  return sorted(files)


# The absolute path to the metadata folder.
PATH_TO_METADATA_DIR = path_util.GetInputFile(
  'tools/metrics/histograms/metadata'
)
_ENUMS_XML_RELATIVE = [
  'tools/metrics/histograms/enums.xml',
] + _FindXmlFiles(_ENUMS_XML_FILE_NAMES)
_VARIANTS_XML_RELATIVE = [
  'tools/metrics/histograms/variants.xml',
]
_HISTOGRAMS_XMLS_RELATIVE = _FindXmlFiles(_HISTOGRAM_XML_FILE_NAMES)
ALL_XMLS_RELATIVE = (
  _ENUMS_XML_RELATIVE + _VARIANTS_XML_RELATIVE + _HISTOGRAMS_XMLS_RELATIVE
)

HISTOGRAMS_PREFIX_LIST = [
  os.path.basename(os.path.dirname(f)) for f in _HISTOGRAMS_XMLS_RELATIVE
]

ENUMS_XMLS = [path_util.GetInputFile(f) for f in _ENUMS_XML_RELATIVE]
UKM_XML = path_util.GetInputFile('tools/metrics/ukm/ukm.xml')
DWA_XML = path_util.GetInputFile('tools/metrics/private_metrics/dwa.xml')
HISTOGRAMS_XMLS = [path_util.GetInputFile(f) for f in _HISTOGRAMS_XMLS_RELATIVE]
ALL_XMLS = [path_util.GetInputFile(f) for f in ALL_XMLS_RELATIVE]

ALL_TEST_XMLS_RELATIVE = [
  'tools/metrics/histograms/test_data/enums.xml',
  'tools/metrics/histograms/test_data/enums2.xml',
  'tools/metrics/histograms/test_data/histograms.xml',
  'tools/metrics/histograms/test_data/histogram_suffixes_list.xml',
  'tools/metrics/histograms/test_data/ukm.xml',
]
ALL_TEST_XMLS = [path_util.GetInputFile(f) for f in ALL_TEST_XMLS_RELATIVE]
(
  TEST_ENUMS_XML,
  TEST_ENUMS2_XML,
  TEST_HISTOGRAMS_XML,
  TEST_SUFFIXES_XML,
  TEST_UKM_XML,
) = ALL_TEST_XMLS

TEST_XML_WITH_COMPONENTS_RELATIVE = (
  'tools/metrics/histograms/test_data/components/histograms.xml'
)
TEST_XML_WITH_COMPONENTS = path_util.GetInputFile(
  TEST_XML_WITH_COMPONENTS_RELATIVE
)

# The path to the `histograms_xml_files.gni` file.
_HISTOGRAMS_XML_FILES_GNI = path_util.GetInputFile(
  'tools/metrics/histograms/histograms_xml_files.gni'
)

_GNI_LINE_PREFIX = '  "//'
_GNI_LINE_SUFFIX = '",\n'


def _GenerateHistogramsXmlGniContent():
  """Generates the contents for the _HISTOGRAMS_XML_FILES_GNI file."""
  content = 'histograms_xml_files = [\n'
  for path in sorted(ALL_XMLS_RELATIVE):
    content += _GNI_LINE_PREFIX
    content += path.replace(os.sep, '/')
    content += _GNI_LINE_SUFFIX
  content += ']\n'
  return content


def UpdateHistogramsXmlGniFile():
  """Updates the _HISTOGRAMS_XML_FILES_GNI file."""
  with open(_HISTOGRAMS_XML_FILES_GNI, 'w+') as f:
    f.write(_GenerateHistogramsXmlGniContent())


def ValidateHistogramsGniFile():
  """Returns true if _HISTOGRAMS_XML_FILES_GNI file is up to date."""
  with open(_HISTOGRAMS_XML_FILES_GNI, 'r') as f:
    return _GenerateHistogramsXmlGniContent() == f.read()


def main():
  UpdateHistogramsXmlGniFile()


if __name__ == '__main__':
  main()
