{
  "$schema": "http://json-schema.org/draft-04/schema#",

  "definitions": {
    "reserve": {
      "type": "object",
      "properties": {
        "amount": {
          "type": "number"
        },
        "currency": {
          "type": "string"
        },
        "reason": {
          "type": "string",
          "enum": [
            "Audit",
            "Manual",
            "InvoiceApproved",
            "OfferApproved",
            "ClaimClosed"
          ]
        },
        "comment": {
          "type": "string"
        }
      },
      "required": ["amount", "currency"]
    },
    "reserveChange": {
      "type": "object",
      "properties": {
        "property": {
          "type": "string",
          "enum": [
            "Reserve"
          ]
        },
        "newValue": { "$ref": "#/definitions/reserve" },
        "oldValue": { "$ref": "#/definitions/reserve" }
      }
    },
    "caseOwner": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "username": {
          "type": "string"
        },
        "email": {
          "type": "string"
        },
        "type": {
          "type": "string",
          "enum": ["ScalepointUser", "ClaimHandler", "InternalAssessor", "Pool", "ExternalAssessor", "System"]
        }
      },
      "required": ["name"]
    },
    "caseOwnerChange": {
      "type": "object",
      "properties": {
        "property": {
          "type": "string",
          "enum": [
            "CaseOwner"
          ]
        },
        "newValue": { "$ref": "#/definitions/caseOwner" },
        "oldValue": { "$ref": "#/definitions/caseOwner" }
      }
    },
    "regress": {
      "type": "string",
      "enum": ["None", "Yes", "No", "Unknown"]
    },
    "regressChange": {
      "type": "object",
      "properties": {
        "property": {
          "type": "string",
          "enum": [
            "Regress"
          ]
        },
        "newValue": { "$ref": "#/definitions/regress" },
        "oldValue": { "$ref": "#/definitions/regress" }
      }
    },
    "money": {
      "type": "object",
      "properties": {
        "amount": {
          "type": "number"
        },
        "currency": {
          "type": "string"
        }
      },
      "required": ["amount", "currency"]
    },
    "deductibleChange": {
      "type": "object",
      "properties": {
        "property": {
          "type": "string",
          "enum": [
            "Deductible"
          ]
        },
        "newValue": { "$ref": "#/definitions/money" },
        "oldValue": { "$ref": "#/definitions/money" }
      }
    },
    "shareOfVatPercentChange": {
      "type": "object",
      "properties": {
        "property": {
          "type": "string",
          "enum": [
            "ShareOfVatPercent"
          ]
        },
        "newValue": { "type": "number" },
        "oldValue": { "type": "number" }
      }
    },
    "accidentDateChange": {
      "type": "object",
      "properties": {
        "property": {
          "type": "string",
          "enum": [
            "AccidentDate"
          ]
        },
        "newValue": {
          "type": "string",
          "format": "date-time"
        },
        "oldValue": {
          "type": "string",
          "format": "date-time"
        }
      }
    },
    "caseClosed": {
      "type": "object",
      "properties": {
        "property": {
          "type": "string",
          "enum": [
            "CaseClosed"
          ]
        },
        "isTerminated": {
          "type": "boolean"
        },
        "terminationReason": {
          "type": "string",
          "enum": [
            "None",
            "NotCovered",
            "BelowDeductible",
            "CreatedByMistake",
            "Other",
            "PhoneInspection",
            "NotCoveredAfterInspection",
            "PaidInOwnSystem",
            "Inactivity",
            "CustomReason"
          ]
        },
        "terminationReasonDescription": {
          "type": "string"
        },
        "shouldBeClosedInOwnSystem": {
          "type": "boolean"
        }
      }
    },
    "caseReopened": {
      "type": "object",
      "properties": {
        "property": {
          "type": "string",
          "enum": [
            "CaseReopened"
          ]
        }
      }
    },
    "newAttachment": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "fileName": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "fileSize": {
          "type": "integer"
        },
        "isRestricted": {
          "type": "boolean"
        }
      },
      "required": ["id", "fileName", "fileSize"]
    },
    "attachmentsAdded": {
      "type": "object",
      "properties": {
        "property": {
          "type": "string",
          "enum": [
            "AttachmentsAdded"
          ]
        },
        "attachments": {
          "type": "array",
          "items": { "$ref": "#/definitions/newAttachment" }
        }
      },
      "required": [ "property", "attachments" ]
    },
    "attachmentChanged": {
      "type": "object",
      "properties": {
        "property": {
          "type": "string",
          "enum": [
            "AttachmentChanged"
          ]
        },
        "id": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "isRestricted": {
          "type": "boolean"
        }
      },
      "allOf": [
        { "required": [ "property", "id" ] },
        {
          "anyOf": [
            { "required": [ "description" ] },
            { "required": [ "isRestricted" ] }
          ]
        }
      ]
    },
    "additionalClaimFieldChange": {
      "type": "object",
      "allOf":[
        {
          "required": [
            "property",
            "type"
          ]
        },
        {
          "anyOf": [
            {
              "required": [
                "newValue"
              ]
            },
            {
              "required": [
                "oldValue"
              ]
            }
          ]
        }
      ],
      "properties": {
        "property": {
          "type": "string"
        },
        "type": {
          "type": "string"
        },
        "format": {
          "type": "string"
        },
        "newValue": {
        },
        "oldValue": {
        }
      }
    },
    "coverage": {
      "type": "object",
      "properties": {
        "policyCoverage": {
          "type": "string"
        },
        "coverage": {
          "type": "string",
          "options": {
            "undefined": {
              "title": "Undefined"
            },
            "covered": {
              "title": "Covered"
            },
            "notCovered": {
              "title": "Not covered"
            },
            "partiallyCovered": {
              "title": "Partially covered"
            },
            "undetermined": {
              "title": "Undetermined"
            },
            "belowDeductible": {
              "title": "Below deductible"
            }
          }
        },
        "reason": {
          "type": "string"
        },
        "context": {
          "type": "string",
          "options": {
            "editCoverage": {
              "title": "Edit coverage"
            },
            "claimWizard": {
              "title": "Claim wizard"
            },
            "inspectionReport": {
              "title": "Inspection report"
            },
            "phoneInspection": {
              "title": "Phone inspection"
            },
            "settleWithoutRepair": {
              "title": "Settle without repair"
            },
            "mergeDamageNotification": {
              "title": "Merge damage notification"
            },
            "damageServiceReport": {
              "title": "Damage service report"
            }
          }
        }
      },
      "required": ["coverage"]
    },
    "coverageChange": {
      "type": "object",
      "properties": {
        "property": {
          "type": "string",
          "enum": [
            "Coverage"
          ]
        },
        "newValue": { "$ref": "#/definitions/coverage" },
        "oldValue": { "$ref": "#/definitions/coverage" }
      }
    }
  },

  "type": "object",
  "required": [
    "eventType",
    "payloadVersion",
    "correlationId",
    "timestamp",
    "case",
    "changes"
  ],
  "properties": {
    "eventType": {
      "type": "string"
    },
    "payloadVersion": {
      "type": "string"
    },
    "correlationId": {
      "type": "string"
    },
    "timestamp": {
      "type": "string",
      "format": "date-time"
    },
    "case": {
      "type": "object",
      "properties": {
        "number": {
          "type": "string"
        },
        "token": {
          "type": "string"
        },
        "caseType": {
          "type": "string"
        },
        "externalClaimId": {
          "type": "string"
        },
        "company": {
          "type": "string"
        },
        "sourceSystem": {
          "type": "string"
        }
      }
    },
    "changedBy": {
      "type": "object",
      "properties": {
        "fullName": {
          "type": "string"
        },
        "username": {
          "type": "string"
        },
        "userType": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "email": {
          "type": "string"
        },
        "type": {
          "type": "string",
          "description": "Type of actor",
          "options": {
            "user": {
              "title": "User"
            },
            "automatic": {
              "title": "Automatic"
            }
          }
        }
      }
    },
    "changes": {
      "type": "array",
      "items": {
        "oneOf": [
          { "$ref": "#/definitions/reserveChange" },
          { "$ref": "#/definitions/caseOwnerChange" },
          { "$ref": "#/definitions/regressChange" },
          { "$ref": "#/definitions/deductibleChange" },
          { "$ref": "#/definitions/shareOfVatPercentChange" },
          { "$ref": "#/definitions/caseClosed" },
          { "$ref": "#/definitions/caseReopened" },
          { "$ref": "#/definitions/accidentDateChange" },
          { "$ref": "#/definitions/additionalClaimFieldChange" },
          { "$ref": "#/definitions/coverageChange" },
          { "$ref": "#/definitions/attachmentsAdded" },
          { "$ref": "#/definitions/attachmentChanged" }
        ]
      }
    }
  }
}
