#!/usr/bin/env python3
"""對圖片做亮度與對比的量測，再用規則決定通過、重拍或標記。

這不是訓練好的辨識模型，只是可重現的量測加上門檻。
"""

from __future__ import annotations

import argparse
import json
import sys
from pathlib import Path

from PIL import Image, ImageStat


def inspect(path: Path, dark: float, blank: float) -> dict:
    image = Image.open(path).convert("L")
    stats = ImageStat.Stat(image)
    mean = float(stats.mean[0])
    stddev = float(stats.stddev[0])
    if mean < dark:
        decision = "retake"
        reason = f"畫面偏暗（平均亮度 {mean:.1f} < {dark}），建議重拍或補光"
    elif stddev < blank:
        decision = "reject"
        reason = f"對比過低（標準差 {stddev:.1f} < {blank}），畫面可能近乎空白或過曝"
    else:
        decision = "pass"
        reason = f"亮度 {mean:.1f}、對比 {stddev:.1f} 通過目前門檻"
    return {
        "file": path.name,
        "mean_brightness": round(mean, 2),
        "contrast_stddev": round(stddev, 2),
        "decision": decision,
        "reason": reason,
    }


def main() -> int:
    parser = argparse.ArgumentParser(description="影像量測與規則判斷")
    parser.add_argument("images", nargs="+", type=Path)
    parser.add_argument("--dark", type=float, default=40.0, help="平均亮度低於此值則建議重拍")
    parser.add_argument("--blank", type=float, default=8.0, help="標準差低於此值則視為空白或無資訊")
    parser.add_argument("-o", "--output", type=Path)
    args = parser.parse_args()

    results = []
    for path in args.images:
        row = inspect(path, args.dark, args.blank)
        results.append(row)
        print(f"{row['file']}: {row['decision']} — {row['reason']}")
    if args.output:
        args.output.parent.mkdir(parents=True, exist_ok=True)
        args.output.write_text(json.dumps(results, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
    return 0


if __name__ == "__main__":
    sys.exit(main())
