{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "title": "CatenaXPolicySchema",
  "type": "object",
  "allOf": [
    {
      "$ref": "#/definitions/CatenaXPolicy"
    }
  ],
  "$id": "https://w3id.org/catenax/2025/9/policy/schema/policy-schema.json",
  "definitions": {
    "CatenaXPolicy": {
      "allOf": [
        {
          "$ref": "https://w3id.org/dspace/2025/1/negotiation/contract-schema.json#/definitions/PolicyClass"
        },
        {
          "anyOf": [
            {
              "$ref": "#/definitions/AccessPolicy"
            },
            {
              "$ref": "#/definitions/UsagePolicy"
            }
          ]
        }
      ]
    },
    "AccessPolicy": {
      "permission": {
        "type": "array",
        "items": {
          "allOf": [
            {
              "$ref": "https://w3id.org/dspace/2025/1/negotiation/contract-schema.json#/definitions/Rule"
            },
            {
              "properties": {
                "action": {
                  "type": "string",
                  "const": "access"
                },
                "constraint": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/AccessPermissionConstraint"
                  },
                  "uniqueItems": true
                }
              }
            }
          ]
        },
        "minItems": 0
      },
      "prohibition": {
        "type": "array",
        "maxItems": 0
      },
      "obligation": {
        "type": "array",
        "maxItems": 0
      }
    },
    "AccessPermissionConstraint": {
      "type": "object",
      "oneOf": [
        {
          "$ref": "#/definitions/AccessPermissionLogicalConstraint"
        },
        {
          "$ref": "https://w3id.org/catenax/2025/9/policy/schema/atomic-constraint-schemas.json#/definitions/AtomicAccessPermissionConstraint"
        }
      ]
    },
    "AccessPermissionLogicalConstraint": {
      "type": "object",
      "properties": {
        "and": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/AccessPermissionConstraint"
          }
        }
      },
      "required": [
        "and"
      ]
    },
    "UsagePolicy": {
      "permission": {
        "type": "array",
        "items": {
          "allOf": [
            {
              "$ref": "https://w3id.org/dspace/2025/1/negotiation/contract-schema.json#/definitions/Rule"
            },
            {
              "properties": {
                "action": {
                  "type": "string",
                  "const": "use"
                },
                "constraint": {
                  "type": "array",
                  "minItems": 2,
                  "items": {
                    "$ref": "#/definitions/UsagePermissionConstraint"
                  },
                  "uniqueItems": true
                }
              },
              "required": [
                "constraint"
              ]
            }
          ]
        },
        "minItems": 1
      },
      "prohibition": {
        "type": "array",
        "items": {
          "allOf": [
            {
              "$ref": "https://w3id.org/dspace/2025/1/negotiation/contract-schema.json#/definitions/Rule"
            },
            {
              "properties": {
                "action": {
                  "type": "string",
                  "const": "use"
                },
                "constraint": {
                  "type": "array",
                  "items": {
                    "$ref": "#/definitions/UsageProhibitionConstraint"
                  },
                  "uniqueItems": true
                }
              },
              "required": [
                "constraint"
              ]
            }
          ]
        },
        "minItems": 1
      },
      "obligation": {
        "type": "array",
        "items": {
          "allOf": [
            {
              "$ref": "https://w3id.org/dspace/2025/1/negotiation/contract-schema.json#/definitions/Rule"
            },
            {
              "properties": {
                "action": {
                  "type": "string",
                  "const": "use"
                },
                "constraint": {
                  "type": "array",
                  "minitems": 1,
                  "maxitems": 1,
                  "items": {
                    "anyOf": [
                      {
                        "$ref": "https://w3id.org/catenax/2025/9/policy/data-provisioning-end-duration-days-constraint-schema.json"
                      },
                      {
                        "$ref": "https://w3id.org/catenax/2025/9/policy/data-provisioning-end-date-constraint-schema.json"
                      }
                    ]
                  }
                }
              },
              "required": [
                "constraint"
              ]
            }
          ]
        },
        "minItems": 1
      },
      "anyOf": [
        {
          "required": [
            "permission"
          ]
        },
        {
          "required": [
            "prohibition"
          ]
        },
        {
          "required": [
            "obligation"
          ]
        }
      ]
    },
    "UsagePermissionConstraint": {
      "type": "object",
      "oneOf": [
        {
          "$ref": "#/definitions/UsagePermissionLogicalConstraint"
        },
        {
          "$ref": "https://w3id.org/catenax/2025/9/policy/schema/atomic-constraint-schemas.json#/definitions/AtomicUsagePermissionConstraint"
        }
      ]
    },
    "UsagePermissionLogicalConstraint": {
      "type": "object",
      "properties": {
        "and": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/UsagePermissionConstraint"
          }
        }
      },
      "required": [
        "and"
      ]
    },
    "UsageProhibitionConstraint": {
      "type": "object",
      "oneOf": [
        {
          "$ref": "#/definitions/UsageProhibitionLogicalConstraint"
        },
        {
          "$ref": "https://w3id.org/catenax/2025/9/policy/schema/atomic-constraint-schemas.json#/definitions/AtomicProhibitionConstraint"
        }
      ]
    },
    "UsageProhibitionLogicalConstraint": {
      "type": "object",
      "properties": {
        "and": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/UsageProhibitionConstraint"
          }
        }
      },
      "required": [
        "and"
      ]
    }
  }
}