#!/usr/bin/env python3

import sys, re

database = dict()
database_r = dict()

for arg in sys.argv[1:]:
    with open(arg, "r") as f:
        for line in f:
            if "<" in line:
                raise Exception("Found '<' in this line: %s" % line)

            line = line.split()
            key = line[0]
            bits = tuple(sorted(set(line[1:])))

            if key in database:
                print("Warning: Duplicate key: %s %s" % (key, bits))

            if bits in database_r:
                print("Warning: Duplicate bits: %s %s" % (key, bits))

            database[key] = bits
            database_r[bits] = key


def get_subsets(bits):
    retval = list()
    retval.append(bits)
    for i in range(len(bits)):
        for s in get_subsets(bits[i + 1:]):
            retval.append(bits[0:i] + s)
    return retval


def check_subsets(bits):
    for sub_bits in sorted(get_subsets(bits)):
        if sub_bits != bits and sub_bits != ():
            if sub_bits in database_r:
                print(
                    "Warning: Entry %s %s is a subset of entry %s %s." %
                    (database_r[sub_bits], sub_bits, database_r[bits], bits))


for key, bits in database.items():
    check_subsets(bits)
