{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "pattern": "^[a-z0-9][a-z0-9-]*(\\.[a-z0-9][a-z0-9-]*)+$",
        "description": "Namespaced id, e.g. \"core.player.rory-calder\""
      },
      "firstName": {
        "type": "string",
        "minLength": 1
      },
      "lastName": {
        "type": "string",
        "minLength": 1
      },
      "nickname": {
        "type": "string",
        "minLength": 1
      },
      "nationality": {
        "type": "string",
        "pattern": "^[A-Z]{3}$",
        "description": "3-letter nationality code"
      },
      "residence": {
        "type": "string",
        "pattern": "^[A-Z]{3}$",
        "description": "3-letter nationality code"
      },
      "born": {
        "type": "string",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      },
      "gender": {
        "type": "string",
        "enum": [
          "m",
          "f"
        ]
      },
      "hand": {
        "default": "R",
        "type": "string",
        "enum": [
          "R",
          "L"
        ]
      },
      "tier": {
        "type": "integer",
        "minimum": 1,
        "maximum": 5
      },
      "tourCardUntil": {
        "type": "integer",
        "minimum": 1900,
        "maximum": 3000
      },
      "colour": {
        "type": "string",
        "pattern": "^#[0-9a-fA-F]{6}$"
      },
      "attributes": {
        "type": "object",
        "properties": {
          "scoring": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "finishing": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "checkoutKnowledge": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "consistency": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "tempoControl": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "bullAccuracy": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "composure": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "resilience": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "crowdHandling": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "concentration": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "stamina": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "fitness": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "eyesight": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          }
        },
        "required": [
          "scoring",
          "finishing",
          "checkoutKnowledge",
          "consistency",
          "tempoControl",
          "bullAccuracy",
          "composure",
          "resilience",
          "crowdHandling",
          "concentration",
          "stamina",
          "fitness",
          "eyesight"
        ],
        "additionalProperties": false
      },
      "hidden": {
        "type": "object",
        "properties": {
          "potential": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "ambition": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "professionalism": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "development": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          }
        },
        "required": [
          "potential",
          "ambition",
          "professionalism"
        ],
        "additionalProperties": false
      },
      "traits": {
        "default": {
          "aspect": 1,
          "scoringBed": 20,
          "favouriteDouble": null,
          "bullLover": false
        },
        "type": "object",
        "properties": {
          "aspect": {
            "default": 1,
            "type": "number",
            "minimum": 0.75,
            "maximum": 1.3
          },
          "scoringBed": {
            "default": 20,
            "anyOf": [
              {
                "type": "number",
                "const": 20
              },
              {
                "type": "number",
                "const": 19
              }
            ]
          },
          "favouriteDouble": {
            "default": null,
            "anyOf": [
              {
                "type": "integer",
                "minimum": 1,
                "maximum": 20
              },
              {
                "type": "null"
              }
            ]
          },
          "bullLover": {
            "default": false,
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "personality": {
        "type": "object",
        "properties": {
          "media": {
            "type": "string",
            "enum": [
              "humble",
              "confident",
              "showman",
              "reserved",
              "fiery"
            ]
          },
          "temperament": {
            "type": "string",
            "enum": [
              "calm",
              "steady",
              "volatile"
            ]
          }
        },
        "required": [
          "media",
          "temperament"
        ],
        "additionalProperties": false
      },
      "walkonId": {
        "type": "string",
        "pattern": "^[a-z0-9][a-z0-9-]*(\\.[a-z0-9][a-z0-9-]*)+$",
        "description": "Namespaced id, e.g. \"core.player.rory-calder\""
      },
      "bio": {
        "type": "string"
      },
      "rivalIds": {
        "default": [],
        "type": "array",
        "items": {
          "type": "string",
          "pattern": "^[a-z0-9][a-z0-9-]*(\\.[a-z0-9][a-z0-9-]*)+$",
          "description": "Namespaced id, e.g. \"core.player.rory-calder\""
        }
      },
      "portrait": {
        "type": "string"
      }
    },
    "required": [
      "id",
      "firstName",
      "lastName",
      "nickname",
      "nationality",
      "born",
      "gender",
      "tier",
      "colour",
      "attributes",
      "hidden",
      "personality"
    ],
    "additionalProperties": false
  }
}
