"""Read raw properties from the CURRENT Media Pool folder, without a timeline.

JSON may contain full paths and metadata: redact before sharing. No writes to Resolve.
"""
import argparse
import re
from fractions import Fraction
from resolve_api_connection import connect
from resolve_api_media import context, folder_items, properties, uid, ensure_current, output


def numeric_fps(raw):
    # Preserve the original field. This is the exact value of the returned text,
    # NOT proof that a rounded 23.976 label means the rate 24000/1001.
    if not isinstance(raw, str) or len(raw) > 40:
        return None
    text = raw.strip()
    if not re.fullmatch(r"\d+(?:\.\d+)?|\d+/[1-9]\d*", text):
        return None
    value = Fraction(text)
    if value <= 0:
        return None
    return {"numerator": value.numerator, "denominator": value.denominator,
            "meaning": "numeric_value_of_reported_text_not_verified_source_timebase"}


def inspect_folder(ctx, item_id=None, limit=100):
    if type(limit) is not int or not 1 <= limit <= 500:
        raise ValueError("Use --limit 1..500")
    items = folder_items(ctx)
    if item_id is not None:
        items = [i for i in items if uid(i) == item_id]
        if len(items) != 1:
            raise ValueError("Item ID is absent from the current Media Pool folder")
    rows = []
    for item in items[:limit]:
        ident = uid(item)
        try:
            raw = properties(item)
            rows.append({"media_pool_id": ident, "name": item.GetName(), "status": "read",
                         "properties": raw, "fps_numeric": numeric_fps(raw.get("FPS"))})
        except Exception as exc:
            # Preserve a per-item failure. Do not substitute empty properties.
            rows.append({"media_pool_id": ident, "status": "read_error", "error_type": type(exc).__name__})
    ensure_current(ctx)
    return {"status": "read_report", "target": ctx.target, "folder_item_count": len(items),
            "returned_count": len(rows), "truncated": len(items) > limit,
            "item_errors": sum(r["status"] == "read_error" for r in rows), "items": rows}


def main(argv=None):
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--item-id")
    parser.add_argument("--limit", type=int, default=100)
    args = parser.parse_args(argv)
    result = inspect_folder(context(connect()), args.item_id, args.limit)
    output(result)
    # A partial report is not a clean success for automated downstream processing.
    return 2 if result["item_errors"] or result["truncated"] else 0


if __name__ == "__main__":
    raise SystemExit(main())
