#!/usr/bin/env python3
"""rostos.py — onde estão as pessoas em cada foto.

    "Aparecem três homens ali, ela está cortada, não dá pra ver ninguém."
    (25/09/2026)

Foto deitada num vídeo em pé perde dois terços da largura. Recortar pelo
centro corta as pessoas. Aqui se acha o retângulo que cobre todos os rostos
da foto (MediaPipe, o mesmo do recorte da pessoa), e o vídeo enquadra nele —
ou, quando os rostos não cabem no recorte, mostra a foto inteira.

Uso:
    python3 rostos.py foto1.webp foto2.jpg …
Saída (JSON): {"ok": true, "fotos": {"foto1.webp": {"largura", "altura", "n",
               "cx", "cy", "x0", "x1", "y0", "y1"}}}   (tudo de 0 a 1)
"""

import json
import sys


def main():
    try:
        import cv2
        import mediapipe as mp
    except Exception as e:  # sem as bibliotecas, ninguém é enquadrado — e não é erro
        print(json.dumps({"ok": False, "error": f"sem mediapipe: {e}"}))
        return
    det = mp.solutions.face_detection.FaceDetection(model_selection=1, min_detection_confidence=0.45)
    fotos = {}
    for caminho in sys.argv[1:]:
        img = cv2.imread(caminho)
        if img is None:
            continue
        h, w = img.shape[:2]
        r = det.process(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
        caixas = []
        for d in (r.detections or []):
            b = d.location_data.relative_bounding_box
            caixas.append((max(0, b.xmin), max(0, b.ymin), min(1, b.xmin + b.width), min(1, b.ymin + b.height)))
        item = {"largura": w, "altura": h, "n": len(caixas)}
        if caixas:
            x0 = min(c[0] for c in caixas); y0 = min(c[1] for c in caixas)
            x1 = max(c[2] for c in caixas); y1 = max(c[3] for c in caixas)
            item.update({"x0": round(x0, 3), "y0": round(y0, 3), "x1": round(x1, 3), "y1": round(y1, 3),
                         "cx": round((x0 + x1) / 2, 3), "cy": round((y0 + y1) / 2, 3)})
        fotos[caminho] = item
    print(json.dumps({"ok": True, "fotos": fotos}))


if __name__ == "__main__":
    main()
