# -*- coding: utf-8 -*-

#-------------------------------------------------------------------------
# drawElements Quality Program utilities
# --------------------------------------
#
# Copyright 2015 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#-------------------------------------------------------------------------

import re
import sys
from fnmatch import fnmatch

def fail (msg):
    print("ERROR: " + msg)
    sys.exit(-1)

# filename -> [case name]
def readCaseList (filename):
    f = open(filename, 'rb')
    cases = []
    for line in f:
        if line[0:6] == "TEST: ":
            cases.append(line[6:].strip())
    f.close()
    return cases

# filename -> [(filter, min, recommended)]
def readResolutionList (filename):
    f = open(filename, 'rb')
    resList = []
    for line in f:
        line = line.strip()
        params = line.split('\t')
        if len(params) == 3:
            resList.append((params[0], params[1], params[2]))
        elif len(params) != 0:
            fail("Invalid line in resolution list: '%s'" % line)
    f.close()
    return resList

def getMatchingCases (cases, pattern):
    matching = []
    for case in cases:
        if fnmatch(case, pattern):
            matching.append(case)
    return matching

def isResolutionOk (res):
    return re.match('^[1-9][0-9]*x[1-9][0-9]*$', res) != None

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("%s: [caselist] [resolution list]" % sys.argv[0])
        sys.exit(-1)

    caseList = readCaseList(sys.argv[1])
    resList = readResolutionList(sys.argv[2])

    # Pass 1: sanity check for resolution values
    for pattern, minRes, recRes in resList:
        if not isResolutionOk(minRes) or not isResolutionOk(recRes):
            fail("Invalid resolution: '%s %s %s'" % (pattern, minRes, recRes))

    # Pass 2: check that each case is specified by one rule
    markedCases = set()
    for pattern, minRes, recRes in resList:
        matchingCases = getMatchingCases(caseList, pattern)

        if len(matchingCases) == 0:
            fail("Pattern '%s' does not match any cases" % pattern)

        for case in matchingCases:
            if case in markedCases:
                fail("Case '%s' specified multiple times (when processing '%s')" % (case, pattern))
            markedCases.add(case)

    for case in caseList:
        if not case in markedCases:
            fail("Case '%s' not specified by any rule" % case)
