#!/usr/bin/env python3
# Copyright 2023 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Checks that the histograms at given xml use variants defined in the file."""

import logging
import os
import sys
import xml.dom.minidom

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


def ValidateTokenInFile(xml_path: str) -> bool:
  """Validates that all <token> uses <variants> defined in the file.

  Args:
    xml_path: The path to the histograms.xml file.

  Returns:
    A boolean that is True if at least a histogram uses a <variants> not
        defined in the file, False otherwise.
  """
  has_token_error: bool = False
  tree: xml.dom.minidom.Document = xml.dom.minidom.parse(xml_path)
  variants: list[str] = []

  for node in xml_utils.IterElementsWithTag(tree, 'variants', 3):
    variants_name: str = node.getAttribute('name')
    variants.append(variants_name)

  for histogram in xml_utils.IterElementsWithTag(tree, 'histogram', 3):
    erroneous_tokens: list[str] = []
    for node in xml_utils.IterElementsWithTag(histogram, 'token', 1):
      if node.hasAttribute('variants'):
        if node.getAttribute('variants') not in variants:
          erroneous_tokens.append(node.getAttribute('key'))
    if erroneous_tokens:
      histogram_name: str = histogram.getAttribute('name')
      logging.error(
          'Token(s) %s in histogram %s are using variants not defined in the '
          'file, please define them before use.', ', '.join(erroneous_tokens),
          histogram_name)
      has_token_error = True

  return has_token_error


def main():
  """Checks that the histograms at given path use variants defined in the file.

  Args:
    sys.argv[1]: The relative path to xml file.

  Example usage:
    validate_token.py metadata/Fingerprint/histograms.xml
  """
  if len(sys.argv) != 2:
    sys.stderr.write('Usage: %s <rel-path-to-xml>' % sys.argv[0])
    sys.exit(1)

  xml_path: str = os.path.join(os.getcwd(), sys.argv[1])
  token_error: bool = ValidateTokenInFile(xml_path)

  sys.exit(token_error)


if __name__ == '__main__':
  main()
