{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "$id": "https://codex-market.fayegram.com/schemas/faye-image-age-rating/request-1.0.0.json",
    "title": "Faye Image Age Rating Request",
    "type": "object",
    "required": [
        "schemaVersion",
        "utility",
        "imageInputs",
        "systems",
        "causes",
        "outputMode",
        "context"
    ],
    "properties": {
        "schemaVersion": {
            "const": "1.0.0"
        },
        "utility": {
            "const": "age_rating"
        },
        "imageInputs": {
            "type": "array",
            "minItems": 1,
            "maxItems": 25,
            "items": {
                "type": "object",
                "required": [
                    "label",
                    "source",
                    "medium"
                ],
                "properties": {
                    "label": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 120,
                        "pattern": "[^\\u0009-\\u000D\\u001C-\\u0020\\u0085\\u00A0\\u1680\\u2000-\\u200A\\u2028-\\u2029\\u202F\\u205F\\u3000\\uFEFF]"
                    },
                    "source": {
                        "type": "string",
                        "minLength": 1,
                        "pattern": "[^\\u0009-\\u000D\\u001C-\\u0020\\u0085\\u00A0\\u1680\\u2000-\\u200A\\u2028-\\u2029\\u202F\\u205F\\u3000\\uFEFF]"
                    },
                    "medium": {
                        "oneOf": [
                            {
                                "$ref": "#/$defs/mediumId"
                            },
                            {
                                "type": "null"
                            }
                        ]
                    }
                },
                "additionalProperties": false
            }
        },
        "systems": {
            "$ref": "#/$defs/systemsSelection"
        },
        "causes": {
            "$ref": "#/$defs/causeSelection"
        },
        "outputMode": {
            "enum": [
                "strict_json",
                "json_with_summary",
                "json_then_summary"
            ]
        },
        "context": {
            "type": "object",
            "properties": {
                "intendedUse": {
                    "type": "string"
                },
                "visibleText": {
                    "type": "string"
                },
                "declaredStyle": {
                    "type": "string"
                },
                "declaredTheme": {
                    "type": "string"
                },
                "specificConcerns": {
                    "type": "array",
                    "uniqueItems": true,
                    "items": {
                        "$ref": "#/$defs/causeId"
                    }
                },
                "interactiveRiskEvidence": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "required": [
                            "riskId",
                            "evidence",
                            "source"
                        ],
                        "properties": {
                            "riskId": {
                                "$ref": "#/$defs/interactiveRiskId"
                            },
                            "evidence": {
                                "type": "string",
                                "minLength": 1,
                                "pattern": "[^\\u0009-\\u000D\\u001C-\\u0020\\u0085\\u00A0\\u1680\\u2000-\\u200A\\u2028-\\u2029\\u202F\\u205F\\u3000\\uFEFF]"
                            },
                            "source": {
                                "enum": [
                                    "visible",
                                    "user_provided"
                                ]
                            }
                        },
                        "additionalProperties": false
                    }
                }
            },
            "additionalProperties": false
        }
    },
    "additionalProperties": false,
    "$defs": {
        "systemId": {
            "enum": [
                "mpa",
                "pegi",
                "eirin",
                "cero",
                "imda"
            ]
        },
        "systemsSelection": {
            "oneOf": [
                {
                    "enum": [
                        "all",
                        "auto"
                    ]
                },
                {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 5,
                    "uniqueItems": true,
                    "items": {
                        "$ref": "#/$defs/systemId"
                    }
                }
            ]
        },
        "mediumId": {
            "enum": [
                "artwork",
                "photograph",
                "film",
                "game",
                "video",
                "mixed",
                "unknown"
            ]
        },
        "causeId": {
            "enum": [
                "mature-themes",
                "action-peril",
                "violence",
                "blood-gore",
                "fear-horror",
                "nudity",
                "sexual-content",
                "sexual-violence",
                "language",
                "crude-rude-content",
                "alcohol",
                "tobacco-smoking",
                "drug-use",
                "gambling",
                "discrimination-hate",
                "self-harm-suicide",
                "crime-antisocial-behavior"
            ]
        },
        "interactiveRiskId": {
            "enum": [
                "in-game-purchases",
                "paid-random-items",
                "time-limited-offers",
                "cryptocurrency",
                "pressure-to-play",
                "unrestricted-communication"
            ]
        },
        "causeSelection": {
            "oneOf": [
                {
                    "type": "object",
                    "required": [
                        "mode"
                    ],
                    "properties": {
                        "mode": {
                            "enum": [
                                "all",
                                "off"
                            ]
                        }
                    },
                    "additionalProperties": false
                },
                {
                    "type": "object",
                    "required": [
                        "mode",
                        "selectedId"
                    ],
                    "properties": {
                        "mode": {
                            "const": "selected"
                        },
                        "selectedId": {
                            "$ref": "#/$defs/causeId"
                        }
                    },
                    "additionalProperties": false
                }
            ]
        }
    }
}
