import sys

msh = "/out/M04_meshability/M04.msh"
content = open(msh, encoding="utf-8", errors="replace").read()
lines = content.splitlines()

def section(name):
    start = lines.index("$" + name)
    end = lines.index("$End" + name)
    return lines[start + 1 : end]

ent = section("Entities")
header = ent[0].split()
numPoints, numCurves, numSurfaces, numVolumes = map(int, header)
print("ENTITIES_HEADER points=%s curves=%s surfaces=%s volumes=%s" % (numPoints, numCurves, numSurfaces, numVolumes))

idx = 1 + numPoints + numCurves + numSurfaces
vol_tags = []
for i in range(idx, idx + numVolumes):
    parts = ent[i].split()
    vol_tags.append(int(parts[0]))
print("TOTAL_VOLUME_ENTITY_TAGS", len(vol_tags))
print("VOLUME_TAG_RANGE", min(vol_tags), max(vol_tags))

el = section("Elements")
hdr = el[0].split()
numEntityBlocks, numElements, minTag, maxTag = map(int, hdr)
print("ELEMENTS_HEADER numEntityBlocks=%s numElements=%s" % (numEntityBlocks, numElements))

i = 1
meshed_vol_tags = set()
vol_elem_count = {}
blocks_seen = 0
while i < len(el):
    parts = el[i].split()
    if len(parts) == 4:
        edim, etag, etype, ecount = map(int, parts)
        if edim == 3:
            meshed_vol_tags.add(etag)
            vol_elem_count[etag] = vol_elem_count.get(etag, 0) + ecount
        i += 1 + ecount
        blocks_seen += 1
    else:
        i += 1

print("MESHED_VOLUME_TAGS_COUNT", len(meshed_vol_tags))
print("BLOCKS_SEEN", blocks_seen)
missing = sorted(set(vol_tags) - meshed_vol_tags)
print("MISSING_VOLUME_COUNT", len(missing))
print("MISSING_VOLUME_TAGS_SAMPLE_FIRST30", missing[:30])
total_3d_elems = sum(vol_elem_count.values())
print("TOTAL_3D_ELEMENTS_SUM", total_3d_elems)
counts = sorted(vol_elem_count.values(), reverse=True)
print("TOP10_VOLUME_ELEMENT_COUNTS", counts[:10])
print("COVERAGE_RATIO", len(meshed_vol_tags), "/", len(vol_tags), "=", round(len(meshed_vol_tags)/len(vol_tags), 4) if vol_tags else None)

# full missing list dump
with open("/out/M04_meshability/missing_volumes_full.txt", "w") as f:
    f.write(",".join(str(x) for x in missing))
    f.write("\n")
# contiguity check
ranges = []
if missing:
    start = prev = missing[0]
    for v in missing[1:]:
        if v == prev + 1:
            prev = v
            continue
        ranges.append((start, prev))
        start = prev = v
    ranges.append((start, prev))
print("MISSING_RANGES", ranges)
