{
    "$schema"               : "http://json-schema.org/draft-04/schema#",
    "id"                    : "https://eddn.edcd.io/schemas/fcmaterials_capi/1",
    "type"                  : "object",
    "additionalProperties"  : false,
    "required": [ "$schemaRef", "header", "message" ],
    "properties": {
        "$schemaRef": {
            "type"                  : "string"
        },
        "header": {
            "type"                  : "object",
            "additionalProperties"  : true,
            "required"              : [ "uploaderID", "softwareName", "softwareVersion" ],
            "properties"            : {
                "uploaderID": {
                    "type"          : "string"
                },
                "gameversion": {
                    "type"          : "string",
                    "description"   : "Value of 'CAPI-market' if possible, else empty string."
                },
                "gamebuild": {
                    "type"          : "string",
                    "description"   : "Value of 'CAPI-market' if possible, else empty string."
                },
                "softwareName": {
                    "type"          : "string"
                },
                "softwareVersion": {
                    "type"          : "string"
                },
                "gatewayTimestamp": {
                    "type"          : "string",
                    "format"        : "date-time",
                    "description"   : "Timestamp upon receipt at the gateway. If present, this property will be overwritten by the gateway; submitters are not intended to populate this property."
                }
            }
        },
        "message": {
            "type"                  : "object",
            "description"           : "Contains all properties from the listed events in the client's journal minus the Localised strings and the properties marked below as 'disallowed'",
            "additionalProperties"  : false,
            "required"              : [ "timestamp", "event", "MarketID", "CarrierID", "Items" ],
            "properties"            : {
                "timestamp": {
                    "type"          : "string",
                    "format"        : "date-time"
                },
                "event" : {
                    "enum"          : [ "FCMaterials" ]
                },
                "horizons": {
                    "type"          : "boolean",
                    "description"   : "Boolean value copied from the Journal LoadGame event, when it is present there."
                },
                "odyssey": {
                    "type"          : "boolean",
                    "description"   : "Boolean value copied from the Journal LoadGame event, when it is present there."
                },

                "MarketID": {
                    "type"          : "integer"
                },

                "CarrierID": {
                    "type"          : "string",
                    "minLength"     : 1
                },

                "Items": {
                    "properties": {
                        "purchases": {
                            "type": "array",
                            "items": {
                                "type": "object",
                                "required": [ "name", "price", "outstanding", "total" ],
                                "additionalProperties": false,
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "minLength": 1
                                    },
                                    "locName": {
                                        "$ref": "#/definitions/disallowed"
                                    },
                                    "outstanding": {
                                        "type": "integer"
                                    },
                                    "price": {
                                        "type": "integer"
                                    },
                                    "total": {
                                        "type": "integer"
                                    }
                                }
                            }
                        },
                        "sales": {
                            "anyOf": [
                                {
                                    "type": "array",
                                    "$comment": "If there are no items then sales is an empty array",
                                    "minItems": 0,
                                    "maxItems": 0
                                },
                                {
                                    "type": "object",
                                    "$comment": "If there ARE items then sales is an object, *NOT* an array",
                                    "patternProperties": {
                                        "^[0-9]+$": {
                                            "type"      : "object",
                                            "required"  : [ "id", "name", "price", "stock" ],
                                            "additionalProperties": false,
                                            "properties": {
                                                "id"    : {
                                                    "type"  : "integer"
                                                },
                                                "name"  : {
                                                    "type"  : "string",
                                                    "minLength": 1
                                                },
                                                "locName"   : {
                                                    "$ref": "#/definitions/disallowed"
                                                },
                                                "price" : {
                                                    "type": "integer"
                                                },
                                                "stock": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                }
                            ]
                        }
                    }
                }
            }
        }
    },
    "definitions": {
        "disallowed": {
            "not" : {
                "type": [
                    "array", "boolean", "integer", "number", "null", "object", "string"
                ]
            }
        }
    }
}
