#!/usr/bin/env python3

import getopt, sys, os, json, re

flag_z = False
flag_b = False
flag_d = False
flag_D = False


def usage():
    print("Usage: %s [options] <bits_file> [segments/tiles]" % sys.argv[0])
    print("")
    print("  -z")
    print("    do not print a 'seg' header for empty segments")
    print("")
    print("  -b")
    print("    print bits outside of known segments")
    print("")
    print("  -d")
    print("    decode known segment bits and write them as tags")
    print("")
    print("  -D")
    print("    decode known segment bits and omit them in the output")
    print("")
    sys.exit(0)


try:
    opts, args = getopt.getopt(sys.argv[1:], "zbdD")
except:
    usage()

if len(args) == 0:
    usage()

for o, a in opts:
    if o == "-z":
        flag_z = True
    elif o == "-b":
        flag_b = True
    elif o == "-d":
        flag_d = True
    elif o == "-D":
        flag_D = True
    else:
        usage()

with open("%s/%s/tilegrid.json" % (os.getenv("XRAY_DATABASE_DIR"),
                                   os.getenv("XRAY_DATABASE")), "r") as f:
    grid = json.load(f)

bitdata = dict()

# print("Loading %s." % sys.argv[1])
with open(args[0], "r") as f:
    for line in f:
        line = line.split("_")
        frame = int(line[1], 16)
        wordidx = int(line[2], 10)
        bitidx = int(line[3], 10)

        if frame not in bitdata:
            bitdata[frame] = dict()

        if wordidx not in bitdata[frame]:
            bitdata[frame][wordidx] = set()

        bitdata[frame][wordidx].add(bitidx)

segbitsdb = dict()


def get_database(segtype):
    if segtype in segbitsdb:
        return segbitsdb[segtype]

    segbitsdb[segtype] = list()

    with open("%s/%s/segbits_%s.db" % (os.getenv("XRAY_DATABASE_DIR"),
                                       os.getenv("XRAY_DATABASE"), segtype),
              "r") as f:
        for line in f:
            line = line.split()
            segbitsdb[segtype].append(line)

    with open("%s/%s/segbits_int_%s.db" %
              (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"),
               segtype[-1]), "r") as f:
        for line in f:
            line = line.split()
            segbitsdb[segtype].append(line)

    return segbitsdb[segtype]


def handle_segment(segname):
    if segname is None:
        segframes = dict()
        for segname, segdata in grid["segments"].items():
            framebase = int(segdata["baseaddr"][0], 16)
            for i in range(segdata["frames"]):
                if (framebase + i) not in segframes:
                    segframes[framebase + i] = set()
                for j in range(segdata["baseaddr"][1],
                               segdata["baseaddr"][1] + segdata["words"]):
                    segframes[framebase + i].add(j)
        for frame in sorted(bitdata.keys()):
            for wordidx in sorted(bitdata[frame].keys()):
                if frame in segframes and wordidx in segframes[frame]:
                    continue
                for bitidx in sorted(bitdata[frame][wordidx]):
                    print("bit_%08x_%03d_%02d" % (frame, wordidx, bitidx))
        return
    if ":" in segname:
        seg1, seg2 = segname.split(":")

        if seg1 in grid["tiles"]:
            seg1 = grid["tiles"][seg1]["segment"]

        if seg2 in grid["tiles"]:
            seg2 = grid["tiles"][seg2]["segment"]

        seginfo1 = grid["segments"][seg1]
        seginfo2 = grid["segments"][seg2]

        frame1 = int(seginfo1["baseaddr"][0], 16)
        word1 = int(seginfo1["baseaddr"][1])

        frame2 = int(seginfo2["baseaddr"][0], 16)
        word2 = int(seginfo2["baseaddr"][1])

        if frame1 > frame2:
            frame1, frame2 = frame2, frame1

        if word1 > word2:
            word1, word2 = word2, word1

        segs = list()

        for seg, seginfo in sorted(grid["segments"].items()):
            frame = int(seginfo["baseaddr"][0], 16)
            word = int(seginfo["baseaddr"][1])
            if frame1 <= frame <= frame2 and word1 <= word <= word2:
                segs.append((frame, word, seg))

        for _, _, seg in sorted(segs):
            handle_segment(seg)
        return

    if segname in grid["tiles"]:
        segname = grid["tiles"][segname]["segment"]

    seginfo = grid["segments"][segname]

    baseframe = int(seginfo["baseaddr"][0], 16)
    basewordidx = int(seginfo["baseaddr"][1])
    numframes = int(seginfo["frames"])
    numwords = int(seginfo["words"])

    segbits = set()
    segtags = set()

    for frame in range(baseframe, baseframe + numframes):
        if frame not in bitdata:
            continue
        for wordidx in range(basewordidx, basewordidx + numwords):
            if wordidx not in bitdata[frame]:
                continue
            for bitidx in bitdata[frame][wordidx]:
                segbits.add(
                    "%02d_%02d" %
                    (frame - baseframe, 32 * (wordidx - basewordidx) + bitidx))

    if flag_d or flag_D:
        for entry in get_database(seginfo["type"]):
            match_entry = True
            for bit in entry[1:]:
                if bit[0] != "!" and bit not in segbits:
                    match_entry = False
                if bit[0] == "!" and bit[1:] in segbits:
                    match_entry = False
            if match_entry:
                for bit in entry[1:]:
                    if bit[0] != "!":
                        segbits.remove(bit)
                if flag_d:
                    segtags.add(entry[0])

    if not flag_z or len(segbits) > 0 or len(segtags) > 0:
        print()
        print("seg %s" % segname)

    for bit in sorted(segbits):
        print("bit %s" % bit)

    for tag in sorted(segtags):
        print("tag %s" % tag)


if flag_b:
    handle_segment(None)

if len(args) == 1:
    seglist = list()
    for seg, seginfo in grid["segments"].items():
        seglist.append((seginfo["baseaddr"][0], -seginfo["baseaddr"][1], seg))
    for _, _, seg in sorted(seglist):
        handle_segment(seg)
else:
    for arg in args[1:]:
        handle_segment(arg)
