# 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.

"""Blink frame presubmit script

See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
for more details about the presubmit API built into gcl.
"""


def _RunUseCounterChecks(input_api, output_api):
    for f in input_api.AffectedFiles():
        if f.LocalPath().endswith('UseCounter.cpp'):
            use_counter_cpp_file = f
            break
    else:
        return []

    largest_found_bucket = 0
    expected_max_bucket = 0

    # Looking for a line like "case CSSPropertyGrid: return 453;"
    bucket_finder = input_api.re.compile(
        r'case CSSProperty\w*?:\s+?return (\d+);',
        input_api.re.MULTILINE)
    # Looking for a line like "constexpr int kMaximumCSSSampleId = 452;"
    expected_max_finder = input_api.re.compile(
        r'constexpr int kMaximumCSSSampleId = (\d+);')
    joined_contents = '\n'.join(use_counter_cpp_file.NewContents())

    expected_max_match = expected_max_finder.search(joined_contents)
    if expected_max_match:
        expected_max_bucket = int(expected_max_match.group(1))

    for bucket_match in bucket_finder.finditer(joined_contents):
        bucket = int(bucket_match.group(1))
        largest_found_bucket = max(largest_found_bucket, bucket)

    if largest_found_bucket != expected_max_bucket:
        if input_api.is_committing:
            message_type = output_api.PresubmitError
        else:
            message_type = output_api.PresubmitPromptWarning

        return [message_type(
            'Largest found CSSProperty bucket Id (%d) does not match '
            'maximumCSSSampleId (%d)' % (
                largest_found_bucket, expected_max_bucket),
            items=[use_counter_cpp_file.LocalPath()])]

    return []


def CheckChangeOnUpload(input_api, output_api):
    results = []
    results.extend(_RunUseCounterChecks(input_api, output_api))
    return results


def CheckChangeOnCommit(input_api, output_api):
    results = []
    results.extend(_RunUseCounterChecks(input_api, output_api))
    return results
