#!/usr/bin/env python3
"""Generic JSON-Schema validator.

Usage:
    json_schema.py --schema /path/to/schema.json --input /path/to/data.json
    cat data.json | json_schema.py --schema schema.json --input -

Exit-Codes:
    0 = pass
    2 = fail (invalid JSON or schema-violation)
    3 = could-not-verify (missing schema/jsonschema lib)
"""
import argparse
import json
import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).parent))
from _lib import emit_report, read_input


def main() -> int:
    ap = argparse.ArgumentParser()
    ap.add_argument("--schema", required=True, help="JSON-Schema file path")
    ap.add_argument("--input", default="-", help="Input JSON (file or '-' for stdin)")
    args = ap.parse_args()

    try:
        import jsonschema
    except ImportError:
        return emit_report("json_schema", False,
                           ["jsonschema lib nicht installiert: pip install jsonschema"]) or 3

    try:
        schema = json.loads(Path(args.schema).read_text(encoding="utf-8"))
    except (OSError, json.JSONDecodeError) as e:
        return emit_report("json_schema", False, [f"Schema nicht ladbar: {e}"])

    try:
        data = json.loads(read_input(args.input))
    except json.JSONDecodeError as e:
        return emit_report("json_schema", False, [f"Input ist kein valid JSON: {e}"])

    validator = jsonschema.Draft202012Validator(schema)
    errors = [
        f"{'.'.join(str(p) for p in err.absolute_path) or '<root>'}: {err.message}"
        for err in validator.iter_errors(data)
    ]
    return emit_report("json_schema", not errors, errors,
                       details={"schema": args.schema, "input": args.input})


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