{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "MINT asset definition catalog",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "catalogId",
    "version",
    "scope",
    "fieldStatus",
    "valueStatus",
    "records"
  ],
  "properties": {
    "catalogId": {
      "const": "mint-asset-definitions"
    },
    "version": {
      "const": "0.1.0"
    },
    "scope": {
      "const": "definition-discovery"
    },
    "fieldStatus": {
      "const": "proposed-source-backed-descriptors"
    },
    "valueStatus": {
      "const": "no-observed-values"
    },
    "records": {
      "type": "array",
      "minItems": 12,
      "maxItems": 12,
      "items": {
        "$ref": "#/$defs/record"
      },
      "allOf": [
        {
          "contains": {
            "properties": {
              "id": {
                "const": "return-window-survivors"
              }
            }
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "properties": {
              "id": {
                "const": "late-delivery-claims"
              }
            }
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "properties": {
              "id": {
                "const": "partially-fulfilled-pos"
              }
            }
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "properties": {
              "id": {
                "const": "delivered-awaiting-acceptance"
              }
            }
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "properties": {
              "id": {
                "const": "retail-chargebacks"
              }
            }
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "properties": {
              "id": {
                "const": "volume-rebates"
              }
            }
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "properties": {
              "id": {
                "const": "promotional-allowances"
              }
            }
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "properties": {
              "id": {
                "const": "predictable-short-pays"
              }
            }
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "properties": {
              "id": {
                "const": "delivered-not-invoiced"
              }
            }
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "properties": {
              "id": {
                "const": "milestones-retainage"
              }
            }
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "properties": {
              "id": {
                "const": "formula-priced-shipments"
              }
            }
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "properties": {
              "id": {
                "const": "setoff-netting"
              }
            }
          },
          "minContains": 1,
          "maxContains": 1
        }
      ]
    }
  },
  "$defs": {
    "sourceRef": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "sourceId",
        "sha256",
        "startLine",
        "endLine"
      ],
      "properties": {
        "sourceId": {
          "type": "string",
          "minLength": 1
        },
        "sha256": {
          "type": "string",
          "pattern": "^[a-f0-9]{64}$"
        },
        "startLine": {
          "type": "integer",
          "minimum": 1
        },
        "endLine": {
          "type": "integer",
          "minimum": 1
        }
      }
    },
    "field": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "key",
        "scope",
        "type",
        "unit",
        "description",
        "sourceBasis"
      ],
      "properties": {
        "key": {
          "type": "string",
          "pattern": "^[a-z][A-Za-z0-9]*$"
        },
        "scope": {
          "enum": [
            "shared",
            "asset-type"
          ]
        },
        "type": {
          "enum": [
            "decimal-string",
            "date"
          ]
        },
        "unit": {
          "enum": [
            "source-currency",
            "ISO-8601-date"
          ]
        },
        "description": {
          "type": "string",
          "minLength": 1
        },
        "sourceBasis": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/sourceRef"
          }
        }
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "type": {
                "const": "decimal-string"
              }
            }
          },
          "then": {
            "properties": {
              "unit": {
                "const": "source-currency"
              }
            }
          },
          "else": {
            "properties": {
              "unit": {
                "const": "ISO-8601-date"
              }
            }
          }
        }
      ]
    },
    "record": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "id",
        "version",
        "cohortId",
        "name",
        "purpose",
        "evidenceToInspect",
        "fields",
        "sourceRefs",
        "entryRule",
        "exclusionRule",
        "amountRule",
        "releaseRule"
      ],
      "properties": {
        "id": {
          "enum": [
            "return-window-survivors",
            "late-delivery-claims",
            "partially-fulfilled-pos",
            "delivered-awaiting-acceptance",
            "retail-chargebacks",
            "volume-rebates",
            "promotional-allowances",
            "predictable-short-pays",
            "delivered-not-invoiced",
            "milestones-retainage",
            "formula-priced-shipments",
            "setoff-netting"
          ]
        },
        "version": {
          "const": "0.1.0"
        },
        "cohortId": {
          "enum": [
            "return-window-survivors",
            "late-delivery-claims",
            "partially-fulfilled-pos",
            "delivered-awaiting-acceptance",
            "retail-chargebacks",
            "volume-rebates",
            "promotional-allowances",
            "predictable-short-pays",
            "delivered-not-invoiced",
            "milestones-retainage",
            "formula-priced-shipments",
            "setoff-netting"
          ]
        },
        "name": {
          "type": "string",
          "minLength": 1
        },
        "purpose": {
          "type": "string",
          "minLength": 1
        },
        "evidenceToInspect": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "string",
            "minLength": 1
          }
        },
        "fields": {
          "type": "array",
          "minItems": 5,
          "items": {
            "$ref": "#/$defs/field"
          }
        },
        "sourceRefs": {
          "type": "array",
          "minItems": 2,
          "items": {
            "$ref": "#/$defs/sourceRef"
          }
        },
        "entryRule": {
          "type": "null"
        },
        "exclusionRule": {
          "type": "null"
        },
        "amountRule": {
          "type": "null"
        },
        "releaseRule": {
          "type": "null"
        }
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "id": {
                "const": "return-window-survivors"
              }
            }
          },
          "then": {
            "properties": {
              "cohortId": {
                "const": "return-window-survivors"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "id": {
                "const": "late-delivery-claims"
              }
            }
          },
          "then": {
            "properties": {
              "cohortId": {
                "const": "late-delivery-claims"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "id": {
                "const": "partially-fulfilled-pos"
              }
            }
          },
          "then": {
            "properties": {
              "cohortId": {
                "const": "partially-fulfilled-pos"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "id": {
                "const": "delivered-awaiting-acceptance"
              }
            }
          },
          "then": {
            "properties": {
              "cohortId": {
                "const": "delivered-awaiting-acceptance"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "id": {
                "const": "retail-chargebacks"
              }
            }
          },
          "then": {
            "properties": {
              "cohortId": {
                "const": "retail-chargebacks"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "id": {
                "const": "volume-rebates"
              }
            }
          },
          "then": {
            "properties": {
              "cohortId": {
                "const": "volume-rebates"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "id": {
                "const": "promotional-allowances"
              }
            }
          },
          "then": {
            "properties": {
              "cohortId": {
                "const": "promotional-allowances"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "id": {
                "const": "predictable-short-pays"
              }
            }
          },
          "then": {
            "properties": {
              "cohortId": {
                "const": "predictable-short-pays"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "id": {
                "const": "delivered-not-invoiced"
              }
            }
          },
          "then": {
            "properties": {
              "cohortId": {
                "const": "delivered-not-invoiced"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "id": {
                "const": "milestones-retainage"
              }
            }
          },
          "then": {
            "properties": {
              "cohortId": {
                "const": "milestones-retainage"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "id": {
                "const": "formula-priced-shipments"
              }
            }
          },
          "then": {
            "properties": {
              "cohortId": {
                "const": "formula-priced-shipments"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "id": {
                "const": "setoff-netting"
              }
            }
          },
          "then": {
            "properties": {
              "cohortId": {
                "const": "setoff-netting"
              }
            }
          }
        }
      ]
    }
  }
}
