{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "fit-tmf769.schema.json",
  "title": "FIT TMF769 Product Test",
  "$defs": {
    "ExecutionStateType": {
      "type": "string",
      "enum": [
        "acknowledged",
        "inProgress",
        "failed",
        "completed",
        "rejected"
      ]
    },
    "ResetType": {
      "type": "string",
      "enum": [
        "ontReset",
        "lineReset",
        "sessionReset"
      ]
    },
    "NtDeviceOperationType": {
      "type": "string",
      "enum": [
        "registration",
        "deregistration",
        "exchange"
      ]
    },
    "ProductRef": {
      "allOf": [
        {
          "$ref": "fit-core.schema.json#/$defs/EntityRef"
        },
        {
          "type": "object",
          "properties": {
            "@type": {
              "const": "ProductRef"
            }
          }
        }
      ]
    },
    "AgreementRef": {
      "allOf": [
        {
          "$ref": "fit-core.schema.json#/$defs/EntityRef"
        },
        {
          "type": "object",
          "properties": {
            "@type": {
              "const": "AgreementRef"
            },
            "businessId": {
              "type": "string"
            },
            "agreementType": {
              "type": "string"
            },
            "engagedParty": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/PartyRefOrValue"
              }
            }
          }
        }
      ]
    },
    "PartyRefOrValue": {
      "type": "object",
      "properties": {
        "@type": {
          "type": "string",
          "enum": [
            "Organization",
            "Individual",
            "PartyRole"
          ]
        },
        "businessId": {
          "type": "string"
        },
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "href": {
          "type": "string",
          "format": "uri"
        }
      }
    },
    "ProductTestExternalIdentifier": {
      "type": "object",
      "required": [
        "id",
        "externalIdentifierType"
      ],
      "properties": {
        "id": {
          "type": "string"
        },
        "href": {
          "type": "string",
          "format": "uri"
        },
        "externalIdentifierType": {
          "type": "string"
        },
        "owner": {
          "type": "string"
        }
      }
    },
    "TestMeasure": {
      "allOf": [
        {
          "$ref": "fit-core.schema.json#/$defs/Extensible"
        },
        {
          "type": "object",
          "properties": {
            "@type": {
              "const": "TestMeasure"
            },
            "metricCategory": {
              "type": "string"
            },
            "metricDescription": {
              "type": "string"
            },
            "metricName": {
              "type": "string"
            },
            "metricValue": {
              "type": "string"
            },
            "unitOfMeasure": {
              "type": "string"
            }
          }
        }
      ]
    },
    "ProductTestStateChangeHistoryItem": {
      "allOf": [
        {
          "type": "object",
          "required": [
            "state"
          ],
          "properties": {
            "state": {
              "$ref": "#/$defs/ExecutionStateType"
            },
            "changeDate": {
              "type": "string",
              "format": "date-time"
            },
            "stateChangeDate": {
              "type": "string",
              "format": "date-time"
            },
            "reason": {
              "type": "string"
            },
            "stateChangeMessage": {
              "type": "array",
              "items": {
                "$ref": "fit-common.schema.json#/$defs/Message"
              }
            },
            "@type": {
              "type": "string"
            }
          },
          "anyOf": [
            {
              "required": [
                "changeDate"
              ]
            },
            {
              "required": [
                "stateChangeDate"
              ]
            }
          ]
        }
      ]
    },
    "NtDevice": {
      "type": "object",
      "required": [
        "serialNumber"
      ],
      "properties": {
        "serialNumber": {
          "type": "string"
        },
        "macAddress": {
          "type": "string"
        },
        "deviceType": {
          "type": "string"
        }
      }
    },
    "ProductTestBase_FVO": {
      "allOf": [
        {
          "$ref": "fit-core.schema.json#/$defs/Entity_FVO"
        },
        {
          "type": "object",
          "required": [
            "@type",
            "agreement"
          ],
          "properties": {
            "name": {
              "type": "string"
            },
            "mode": {
              "type": "string",
              "enum": [
                "onDemand",
                "proactive"
              ]
            },
            "agreement": {
              "type": "array",
              "items": {
                "$ref": "fit-common.schema.json#/$defs/AgreementRefOrValue"
              }
            },
            "attachment": {
              "type": "array",
              "items": {
                "$ref": "fit-common.schema.json#/$defs/AttachmentRefOrValue"
              }
            },
            "externalIdentifier": {
              "oneOf": [
                {
                  "$ref": "#/$defs/ProductTestExternalIdentifier"
                },
                {
                  "type": "array",
                  "items": {
                    "$ref": "#/$defs/ProductTestExternalIdentifier"
                  }
                }
              ]
            },
            "startDateTime": {
              "type": "string",
              "format": "date-time"
            },
            "endDateTime": {
              "type": "string",
              "format": "date-time"
            },
            "state": {
              "$ref": "#/$defs/ExecutionStateType"
            },
            "stateChangeDate": {
              "type": "string",
              "format": "date-time"
            },
            "stateChangeMessage": {
              "type": "array",
              "items": {
                "$ref": "fit-common.schema.json#/$defs/Message"
              }
            },
            "stateChangeHistory": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/ProductTestStateChangeHistoryItem"
              }
            },
            "relatedParty": {
              "type": "array",
              "items": {
                "$ref": "fit-common.schema.json#/$defs/RelatedPartyOrPartyRole"
              }
            },
            "testMeasure": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/TestMeasure"
              }
            },
            "relatedProduct": {
              "$ref": "#/$defs/ProductRef"
            }
          }
        }
      ]
    },
    "ProductTestBase": {
      "allOf": [
        {
          "$ref": "fit-core.schema.json#/$defs/Entity"
        },
        {
          "type": "object",
          "required": [
            "@type"
          ],
          "properties": {
            "name": {
              "type": "string"
            },
            "mode": {
              "type": "string",
              "enum": [
                "onDemand",
                "proactive"
              ]
            },
            "agreement": {
              "type": "array",
              "items": {
                "$ref": "fit-common.schema.json#/$defs/AgreementRefOrValue"
              }
            },
            "attachment": {
              "type": "array",
              "items": {
                "$ref": "fit-common.schema.json#/$defs/AttachmentRefOrValue"
              }
            },
            "externalIdentifier": {
              "oneOf": [
                {
                  "$ref": "#/$defs/ProductTestExternalIdentifier"
                },
                {
                  "type": "array",
                  "items": {
                    "$ref": "#/$defs/ProductTestExternalIdentifier"
                  }
                }
              ]
            },
            "startDateTime": {
              "type": "string",
              "format": "date-time"
            },
            "endDateTime": {
              "type": "string",
              "format": "date-time"
            },
            "state": {
              "$ref": "#/$defs/ExecutionStateType"
            },
            "stateChangeDate": {
              "type": "string",
              "format": "date-time"
            },
            "stateChangeMessage": {
              "type": "array",
              "items": {
                "$ref": "fit-common.schema.json#/$defs/Message"
              }
            },
            "stateChangeHistory": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/ProductTestStateChangeHistoryItem"
              }
            },
            "relatedParty": {
              "type": "array",
              "items": {
                "$ref": "fit-common.schema.json#/$defs/RelatedPartyOrPartyRole"
              }
            },
            "testMeasure": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/TestMeasure"
              }
            },
            "relatedProduct": {
              "$ref": "#/$defs/ProductRef"
            }
          }
        }
      ]
    },
    "BsaDiagnosis_FVO": {
      "allOf": [
        {
          "$ref": "#/$defs/ProductTestBase_FVO"
        },
        {
          "type": "object",
          "required": [
            "@type",
            "measureType"
          ],
          "properties": {
            "@type": {
              "const": "BsaDiagnosis"
            },
            "accessLineId": {
              "type": "string"
            },
            "measureType": {
              "type": "string"
            }
          }
        }
      ]
    },
    "BsaDiagnosis": {
      "allOf": [
        {
          "$ref": "#/$defs/ProductTestBase"
        },
        {
          "type": "object",
          "required": [
            "@type",
            "measureType"
          ],
          "properties": {
            "@type": {
              "const": "BsaDiagnosis"
            },
            "accessLineId": {
              "type": "string"
            },
            "measureType": {
              "type": "string"
            }
          }
        }
      ]
    },
    "BsaReset_FVO": {
      "allOf": [
        {
          "$ref": "#/$defs/ProductTestBase_FVO"
        },
        {
          "type": "object",
          "required": [
            "@type",
            "resetType"
          ],
          "properties": {
            "@type": {
              "const": "BsaReset"
            },
            "accessLineId": {
              "type": "string"
            },
            "resetType": {
              "$ref": "#/$defs/ResetType"
            }
          }
        }
      ]
    },
    "BsaReset": {
      "allOf": [
        {
          "$ref": "#/$defs/ProductTestBase"
        },
        {
          "type": "object",
          "required": [
            "@type",
            "resetType"
          ],
          "properties": {
            "@type": {
              "const": "BsaReset"
            },
            "accessLineId": {
              "type": "string"
            },
            "resetType": {
              "$ref": "#/$defs/ResetType"
            }
          }
        }
      ]
    },
    "NtDeviceOperation_FVO": {
      "allOf": [
        {
          "$ref": "#/$defs/ProductTestBase_FVO"
        },
        {
          "type": "object",
          "required": [
            "@type",
            "ntDeviceOperationType"
          ],
          "properties": {
            "@type": {
              "const": "NtDeviceOperation"
            },
            "homeId": {
              "type": "string"
            },
            "accessLineId": {
              "type": "string"
            },
            "ntDeviceOperationType": {
              "$ref": "#/$defs/NtDeviceOperationType"
            },
            "device": {
              "$ref": "#/$defs/NtDevice"
            },
            "exchangedDevice": {
              "$ref": "#/$defs/NtDevice"
            }
          }
        }
      ]
    },
    "NtDeviceOperation": {
      "allOf": [
        {
          "$ref": "#/$defs/ProductTestBase"
        },
        {
          "type": "object",
          "required": [
            "@type",
            "ntDeviceOperationType"
          ],
          "properties": {
            "@type": {
              "const": "NtDeviceOperation"
            },
            "homeId": {
              "type": "string"
            },
            "accessLineId": {
              "type": "string"
            },
            "ntDeviceOperationType": {
              "$ref": "#/$defs/NtDeviceOperationType"
            },
            "device": {
              "$ref": "#/$defs/NtDevice"
            },
            "exchangedDevice": {
              "$ref": "#/$defs/NtDevice"
            }
          }
        }
      ]
    },
    "SendLink_FVO": {
      "allOf": [
        {
          "$ref": "#/$defs/ProductTestBase_FVO"
        },
        {
          "type": "object",
          "required": [
            "@type",
            "linkType"
          ],
          "properties": {
            "@type": {
              "const": "SendLink"
            },
            "accessLineId": {
              "type": "string"
            },
            "linkType": {
              "type": "string"
            },
            "phoneNumber": {
              "type": "string"
            },
            "emailAddress": {
              "type": "string"
            }
          }
        }
      ]
    },
    "SendLink": {
      "allOf": [
        {
          "$ref": "#/$defs/ProductTestBase"
        },
        {
          "type": "object",
          "required": [
            "@type",
            "linkType"
          ],
          "properties": {
            "@type": {
              "const": "SendLink"
            },
            "accessLineId": {
              "type": "string"
            },
            "linkType": {
              "type": "string"
            },
            "phoneNumber": {
              "type": "string"
            },
            "emailAddress": {
              "type": "string"
            }
          }
        }
      ]
    },
    "ProductTest_FVO": {
      "oneOf": [
        {
          "$ref": "#/$defs/BsaDiagnosis_FVO"
        },
        {
          "$ref": "#/$defs/BsaReset_FVO"
        },
        {
          "$ref": "#/$defs/NtDeviceOperation_FVO"
        },
        {
          "$ref": "#/$defs/SendLink_FVO"
        }
      ]
    },
    "ProductTest": {
      "oneOf": [
        {
          "$ref": "#/$defs/BsaDiagnosis"
        },
        {
          "$ref": "#/$defs/BsaReset"
        },
        {
          "$ref": "#/$defs/NtDeviceOperation"
        },
        {
          "$ref": "#/$defs/SendLink"
        }
      ]
    },
    "ProductTestCreateEvent": {
      "allOf": [
        {
          "$ref": "fit-common.schema.json#/$defs/Event"
        },
        {
          "type": "object",
          "required": [
            "@type",
            "event"
          ],
          "properties": {
            "@type": {
              "const": "ProductTestCreateEvent"
            },
            "event": {
              "type": "object",
              "properties": {
                "productTest": {
                  "$ref": "#/$defs/ProductTest"
                }
              },
              "required": [
                "productTest"
              ]
            }
          }
        }
      ]
    },
    "ProductTestAttributeValueChangeEvent": {
      "allOf": [
        {
          "$ref": "fit-common.schema.json#/$defs/Event"
        },
        {
          "type": "object",
          "required": [
            "@type",
            "event"
          ],
          "properties": {
            "@type": {
              "const": "ProductTestAttributeValueChangeEvent"
            },
            "event": {
              "type": "object",
              "properties": {
                "productTest": {
                  "$ref": "#/$defs/ProductTest"
                }
              },
              "required": [
                "productTest"
              ]
            }
          }
        }
      ]
    },
    "ProductTestStateChangeEvent": {
      "allOf": [
        {
          "$ref": "fit-common.schema.json#/$defs/Event"
        },
        {
          "type": "object",
          "required": [
            "@type",
            "event"
          ],
          "properties": {
            "@type": {
              "const": "ProductTestStateChangeEvent"
            },
            "event": {
              "type": "object",
              "properties": {
                "productTest": {
                  "$ref": "#/$defs/ProductTest"
                }
              },
              "required": [
                "productTest"
              ]
            }
          }
        }
      ]
    }
  },
  "anyOf": [
    {
      "$ref": "#/$defs/ProductTest_FVO"
    },
    {
      "$ref": "#/$defs/ProductTest"
    },
    {
      "$ref": "#/$defs/ProductTestCreateEvent"
    },
    {
      "$ref": "#/$defs/ProductTestAttributeValueChangeEvent"
    },
    {
      "$ref": "#/$defs/ProductTestStateChangeEvent"
    }
  ]
}
