#!/usr/bin/env python

from __future__ import print_function
import sys
import re
import glob
from collections import defaultdict

# keyed on unique type, values are lists of (unique, name) pairs
def find_uniques(source_files):
    uniques = defaultdict(lambda: defaultdict(lambda: set()))
    unique_re = re.compile(r"([\w\d]+)\s*=\s*mk([\w\d']+)Unique\s+(\d+)")
    for f in source_files:
        ms = unique_re.findall(open(f).read())
        for m in ms:
            name = m[0]
            _type = m[1]
            n = int(m[2])
            uniques[_type][n].add(name)

    return uniques

def print_all(uniques):
    for _type, uniqs in uniques.items():
        print('{_type} uniques'.format(**locals()))
        for n,names in uniqs.items():
            all_names = ', '.join(names)
            print('  {n} = {all_names}'.format(**locals()))

def check_conflicts(uniques):
    fail = False
    for _type, uniqs in uniques.items():
        for n,names in uniqs.items():
            all_names = ', '.join(names)
            if len(names) > 1:
                print('{_type} unique {n} conflict: {all_names}'.format(**locals()))
                fail = True

    return fail

uniques = find_uniques(glob.glob('compiler/prelude/*.hs'))
print_all(uniques)
if check_conflicts(uniques):
    sys.exit(1)