# 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'):
            useCounterCpp = f
            break
    else:
        return []

    largestFoundBucket = 0
    maximumBucket = 0
    # Looking for a line like "case CSSPropertyFoo: return 453;"
    bucketFinder = input_api.re.compile(r'.*CSSProperty.*return\s*([0-9]+).*')
    # Looking for a line like "static int maximumCSSSampleId() { return 452; }"
    maximumFinder = input_api.re.compile(
        r'static int maximumCSSSampleId\(\) { return ([0-9]+)')
    for line in useCounterCpp.NewContents():
        bucketMatch = bucketFinder.match(line)
        if bucketMatch:
            bucket = int(bucketMatch.group(1))
            largestFoundBucket = max(largestFoundBucket, bucket)
        else:
            maximumMatch = maximumFinder.match(line)
            if maximumMatch:
                maximumBucket = int(maximumMatch.group(1))

    if largestFoundBucket != maximumBucket:
        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)' %
                    (largestFoundBucket, maximumBucket),
            items=[useCounterCpp.LocalPath()])]

    return []


def CheckChangeOnUpload(input_api, output_api):
    return _RunUseCounterChecks(input_api, output_api)


def CheckChangeOnCommit(input_api, output_api):
    return _RunUseCounterChecks(input_api, output_api)
