"""Folha de contato com carimbo de tempo: N quadros por segundo, grade 6×4 por folha.
Uso: python -P camera/folha_contato.py video.mp4 prefixo_saida QPS [largura_do_quadro]  →  prefixo-01.jpg, -02.jpg…"""
import sys, os, cv2
from PIL import Image, ImageDraw, ImageFont
src, out, fps_s = sys.argv[1], sys.argv[2], float(sys.argv[3])
w = int(sys.argv[4]) if len(sys.argv)>4 else 270
cols, rows = 6, 4
os.makedirs(os.path.dirname(out) or '.', exist_ok=True)
cap = cv2.VideoCapture(src); fps = cap.get(cv2.CAP_PROP_FPS); n = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
step = fps / fps_s
idxs = []; f = 0.0
while f < n: idxs.append(int(round(f))); f += step
font = ImageFont.truetype(r"C:\Windows\Fonts\arialbd.ttf", 18)
frames = []
for i in idxs:
    cap.set(cv2.CAP_PROP_POS_FRAMES, i); ok, q = cap.read()
    if not ok: continue
    h = int(q.shape[0] * w / q.shape[1]); q = cv2.resize(q, (w, h), interpolation=cv2.INTER_AREA)
    im = Image.fromarray(cv2.cvtColor(q, cv2.COLOR_BGR2RGB)); d = ImageDraw.Draw(im)
    lab = f"{i/fps:05.2f}s f{i}"; d.rectangle([0,0,140,22], fill=(0,0,0)); d.text((4,1), lab, fill=(255,255,0), font=font)
    frames.append(im)
per = cols*rows
for s in range(0, len(frames), per):
    chunk = frames[s:s+per]; W, H = chunk[0].size
    sheet = Image.new('RGB', (cols*W, rows*H), (40,40,40))
    for k, im in enumerate(chunk): sheet.paste(im, ((k%cols)*W, (k//cols)*H))
    sheet.save(f"{out}-{s//per+1:02d}.jpg", quality=85)
print(len(frames), 'frames', fps, 'fps', n, 'total')
