#!/usr/bin/env python3
import argparse, cv2, numpy as np

def main():
    p = argparse.ArgumentParser()
    p.add_argument("--img", required=True); p.add_argument("--mask", required=True); p.add_argument("--template", default="m03")
    args = p.parse_args()
    img = cv2.imread(args.img); h, w = img.shape[:2]
    mask = np.zeros((h, w), np.uint8)
    if args.template == "m03":
        boxes = [[536,939,1109,968],[302,1023,557,1062],[606,1031,648,1054],[741,1029,863,1050],[1026,1029,1140,1050],[604,1050,648,1081],[741,1052,828,1081],[600,1092,664,1119],[602,1160,697,1181],[598,1184,784,1217],[597,1224,714,1256],[601,1289,641,1322],[911,1292,1033,1313],[600,1361,726,1382],[911,1359,995,1380],[908,1380,1275,1415],[600,1432,728,1453],[910,1428,1086,1453],[1006,1457,1041,1489]]
    else: raise ValueError(args.template)
    sf = lambda v: max(1, int(v*min(w/900,h/630)))
    for x1,y1,x2,y2 in boxes:
        cv2.rectangle(mask, (max(0,x1-8), max(0,y1-8)), (min(w,x2+8), min(h,y2+8)), 255, -1)
    protect = [(sf(280),sf(118),sf(445),sf(318)),(0,0,w,sf(100)),(0,sf(1080),w,sf(1200)),(0,0,sf(20),h),(w-sf(20),0,w,h),(0,0,w,sf(20)),(0,h-sf(20),w,h)]
    for x1,y1,x2,y2 in protect: cv2.rectangle(mask, (x1,y1), (x2,y2), 0, -1)
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, np.ones((5,5),np.uint8))
    cv2.imwrite(args.mask, mask)
    print(f"✓ Mask: {args.mask}")

if __name__ == "__main__": main()
