{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://visualsnow.pages.dev/schema/export/v6",
  "title": "VSS Simulator Export",
  "description": "Visual Snow Simulator session export. Root of symptom_logs.json inside the export ZIP.",
  "type": "object",
  "required": ["exportVersion", "exportedAt", "totalEntries", "entries"],
  "properties": {
    "exportVersion": {
      "type": "integer",
      "const": 6
    },
    "exportedAt": {
      "type": "string",
      "description": "yyyy-MM-dd HH:mm:ss"
    },
    "totalEntries": {
      "type": "integer",
      "minimum": 0
    },
    "medicalHistory": {
      "type": "object",
      "properties": {
        "updatedAt": { "type": "integer", "description": "Epoch ms" },
        "notes": { "type": "string" },
        "items": {
          "type": "object",
          "additionalProperties": { "type": "boolean" }
        }
      }
    },
    "entries": {
      "type": "array",
      "items": { "$ref": "#/$defs/entry" }
    }
  },

  "$defs": {
    "entry": {
      "type": "object",
      "required": ["id", "timestamp", "date", "isPreset", "visualStatic", "floaters", "blueField", "lightAnomalies", "postProcessing", "distortions", "tinnitus", "wellbeing", "context"],
      "properties": {
        "id":        { "type": "integer" },
        "timestamp": { "type": "integer", "description": "Epoch ms" },
        "date":      { "type": "string",  "description": "yyyy-MM-dd HH:mm:ss" },
        "isPreset":  { "type": "boolean" },

        "visualStatic": {
          "type": "object",
          "required": ["intensity", "alpha", "grainSize", "speed", "pattern", "colorMode", "colorArgb"],
          "properties": {
            "intensity":  { "type": "number", "minimum": 0, "maximum": 1 },
            "alpha":      { "type": "number", "minimum": 0, "maximum": 1 },
            "grainSize":  { "type": "number", "minimum": 0, "maximum": 1 },
            "speed":      { "type": "number", "minimum": 0, "maximum": 1 },
            "pattern":    { "type": "string", "enum": ["Random", "PerlinNoise"] },
            "colorMode":  { "type": "string", "enum": ["White", "Color"] },
            "colorArgb":  { "type": "integer", "description": "ARGB 32-bit packed integer" }
          }
        },

        "floaters": {
          "type": "object",
          "required": ["count", "minSize", "maxSize", "alpha", "colorArgb", "shape", "brownianStrength", "gyroSensitivity", "damping"],
          "properties": {
            "count":           { "type": "integer", "minimum": 0 },
            "minSize":         { "type": "number",  "minimum": 0, "maximum": 1 },
            "maxSize":         { "type": "number",  "minimum": 0, "maximum": 1 },
            "alpha":           { "type": "number",  "minimum": 0, "maximum": 1 },
            "colorArgb":       { "type": "integer" },
            "shape":           { "type": "string",  "enum": ["Circle", "Blob"] },
            "brownianStrength":{ "type": "number" },
            "gyroSensitivity": { "type": "number" },
            "damping":         { "type": "number",  "minimum": 0, "maximum": 1 }
          }
        },

        "blueField": {
          "type": "object",
          "required": ["enabled", "count", "dotShape", "movement", "colorArgb", "alpha", "speed", "size"],
          "properties": {
            "enabled":   { "type": "boolean" },
            "count":     { "type": "integer", "minimum": 0 },
            "dotShape":  { "type": "string",  "enum": ["Circle"] },
            "movement":  { "type": "string",  "enum": ["Squiggly", "Flow"] },
            "colorArgb": { "type": "integer" },
            "alpha":     { "type": "number",  "minimum": 0, "maximum": 1 },
            "speed":     { "type": "number" },
            "size":      { "type": "number" }
          }
        },

        "lightAnomalies": {
          "type": "object",
          "required": ["aura", "photopsia", "glare", "halo", "contrastLoss", "cvd", "hemianopia", "tunnelVision", "charlesBonnet"],
          "properties": {
            "aura": {
              "type": "object",
              "required": ["intensity", "type", "scotomaCount", "scotomaPositions", "scotomaColorArgb", "scotomaAlpha"],
              "properties": {
                "intensity":        { "type": "number", "minimum": 0, "maximum": 1 },
                "type":             { "type": "string", "enum": ["Scotoma", "Fortification"] },
                "scotomaCount":     { "type": "integer", "minimum": 0 },
                "scotomaPositions": { "type": "string",  "description": "Semicolon-separated x,y pairs normalized 0–1, e.g. \"0.5,0.5;0.3,0.7\"" },
                "scotomaColorArgb": { "type": "integer" },
                "scotomaAlpha":     { "type": "number", "minimum": 0, "maximum": 1 }
              }
            },
            "photopsia": {
              "type": "object",
              "required": ["intensity"],
              "properties": {
                "intensity": { "type": "number", "minimum": 0, "maximum": 1 }
              }
            },
            "glare": {
              "type": "object",
              "required": ["enabled", "intensity", "rayCount", "colorArgb", "sizeFraction"],
              "properties": {
                "enabled":     { "type": "boolean" },
                "intensity":   { "type": "number" },
                "rayCount":    { "type": "integer", "minimum": 0 },
                "colorArgb":   { "type": "integer" },
                "sizeFraction":{ "type": "number" }
              }
            },
            "halo": {
              "type": "object",
              "required": ["rainbowEnabled", "nearEnabled"],
              "properties": {
                "rainbowEnabled": { "type": "boolean" },
                "nearEnabled":    { "type": "boolean" }
              }
            },
            "contrastLoss": {
              "type": "object",
              "required": ["enabled", "strength"],
              "properties": {
                "enabled":  { "type": "boolean" },
                "strength": { "type": "number", "minimum": 0, "maximum": 1 }
              }
            },
            "cvd": {
              "type": "object",
              "required": ["type", "severity"],
              "properties": {
                "type":     { "type": "string", "enum": ["None", "Protanopia", "Deuteranopia", "Tritanopia"] },
                "severity": { "type": "number", "minimum": 0, "maximum": 1 }
              }
            },
            "hemianopia": {
              "type": "object",
              "required": ["side", "opacity"],
              "properties": {
                "side":    { "type": "string", "enum": ["None", "Left", "Right"] },
                "opacity": { "type": "number", "minimum": 0, "maximum": 1 }
              }
            },
            "tunnelVision": {
              "type": "object",
              "required": ["radius", "softness"],
              "properties": {
                "radius":   { "type": "number", "minimum": 0, "maximum": 1, "description": "1 = full visual field" },
                "softness": { "type": "number", "minimum": 0, "maximum": 1 }
              }
            },
            "charlesBonnet": {
              "type": "object",
              "required": ["intensity"],
              "properties": {
                "intensity": { "type": "number", "minimum": 0, "maximum": 1 }
              }
            }
          }
        },

        "postProcessing": {
          "type": "object",
          "required": ["glowingEdges", "differenceClouds"],
          "properties": {
            "glowingEdges": {
              "type": "object",
              "required": ["enabled", "alpha", "processScale", "tintArgb", "levelsBlack", "levelsWhite", "levelsGamma", "blurRadius", "colorizeStrength", "displacementX", "displacementY"],
              "properties": {
                "enabled":          { "type": "boolean" },
                "alpha":            { "type": "number",  "minimum": 0, "maximum": 1 },
                "processScale":     { "type": "integer", "minimum": 0 },
                "tintArgb":         { "type": "integer" },
                "levelsBlack":      { "type": "number",  "minimum": 0, "maximum": 1 },
                "levelsWhite":      { "type": "number",  "minimum": 0, "maximum": 1 },
                "levelsGamma":      { "type": "number" },
                "blurRadius":       { "type": "integer", "minimum": 0 },
                "colorizeStrength": { "type": "number",  "minimum": 0, "maximum": 1 },
                "displacementX":    { "type": "number" },
                "displacementY":    { "type": "number" }
              }
            },
            "differenceClouds": {
              "type": "object",
              "required": ["enabled", "alpha", "speed", "scale", "baseHue", "hueRange", "saturation", "contrast", "softLight"],
              "properties": {
                "enabled":    { "type": "boolean" },
                "alpha":      { "type": "number", "minimum": 0, "maximum": 1 },
                "speed":      { "type": "number" },
                "scale":      { "type": "number" },
                "baseHue":    { "type": "number", "minimum": 0, "maximum": 360 },
                "hueRange":   { "type": "number" },
                "saturation": { "type": "number", "minimum": 0, "maximum": 1 },
                "contrast":   { "type": "number" },
                "softLight":  { "type": "boolean" }
              }
            }
          }
        },

        "distortions": {
          "type": "object",
          "required": ["vibration", "diplopia", "palinopsia", "wavyVision", "edgeGlow"],
          "properties": {
            "vibration": {
              "type": "object",
              "required": ["intensity"],
              "properties": {
                "intensity": { "type": "number", "minimum": 0, "maximum": 1 }
              }
            },
            "diplopia": {
              "type": "object",
              "required": ["intensity", "direction", "rotation"],
              "properties": {
                "intensity": { "type": "number" },
                "direction": { "type": "number", "description": "Degrees" },
                "rotation":  { "type": "number", "description": "Degrees" }
              }
            },
            "palinopsia": {
              "type": "object",
              "required": ["enabled", "type", "shape", "trailLayers", "trailAlpha", "ghostCount", "ghostAlpha", "ghostLifeSec", "manualAngle", "motionWeight", "rotation", "trailFadeRate", "trailColorArgb"],
              "properties": {
                "enabled":       { "type": "boolean" },
                "type":          { "type": "string",  "enum": ["Illusory", "Hallucinatory"] },
                "shape":         { "type": "string",  "enum": ["Circle", "SoftBox"] },
                "trailLayers":   { "type": "integer", "minimum": 0 },
                "trailAlpha":    { "type": "number",  "minimum": 0, "maximum": 1 },
                "ghostCount":    { "type": "integer", "minimum": 0 },
                "ghostAlpha":    { "type": "number",  "minimum": 0, "maximum": 1 },
                "ghostLifeSec":  { "type": "number" },
                "manualAngle":   { "type": "number",  "description": "Degrees" },
                "motionWeight":  { "type": "number",  "minimum": 0, "maximum": 1 },
                "rotation":      { "type": "number",  "description": "Degrees" },
                "trailFadeRate": { "type": "number",  "minimum": 0, "maximum": 1 },
                "trailColorArgb":{ "type": "integer" }
              }
            },
            "wavyVision": {
              "type": "object",
              "required": ["intensity", "speed"],
              "properties": {
                "intensity": { "type": "number", "minimum": 0, "maximum": 1 },
                "speed":     { "type": "number" }
              }
            },
            "edgeGlow": {
              "type": "object",
              "required": ["intensity"],
              "properties": {
                "intensity": { "type": "number", "minimum": 0, "maximum": 1 }
              }
            }
          }
        },

        "tinnitus": {
          "type": "object",
          "required": ["enabled", "type", "baseFrequencyHz", "volume", "fmDepthHz", "pulseRateHz", "secondaryFreqMultipliers"],
          "properties": {
            "enabled":                  { "type": "boolean" },
            "type":                     { "type": "string",  "enum": ["PureTone", "Buzz"] },
            "baseFrequencyHz":          { "type": "number",  "minimum": 0 },
            "volume":                   { "type": "number",  "minimum": 0, "maximum": 1 },
            "fmDepthHz":                { "type": "number" },
            "pulseRateHz":              { "type": "number" },
            "secondaryFreqMultipliers": { "type": "string",  "description": "Comma-separated floats, e.g. \"1.5,2.0\"" }
          }
        },

        "wellbeing": {
          "type": "object",
          "required": ["anxietyLevel", "energyLevel", "depressionLevel", "sleepHours", "stressLevel", "note"],
          "properties": {
            "anxietyLevel":    { "type": "integer", "minimum": 0, "maximum": 10 },
            "energyLevel":     { "type": "integer", "minimum": 0, "maximum": 10 },
            "depressionLevel": { "type": "integer", "minimum": 0, "maximum": 10 },
            "sleepHours":      { "type": "number",  "minimum": 0, "maximum": 24 },
            "stressLevel":     { "type": "integer", "minimum": 0, "maximum": 10 },
            "note":            { "type": "string" }
          }
        },

        "context": {
          "type": "object",
          "required": ["activeSymptoms", "recentTriggers"],
          "properties": {
            "activeSymptoms": { "type": "string", "description": "Comma-separated symptom names" },
            "recentTriggers": { "type": "string", "description": "Comma-separated trigger names" }
          }
        }
      }
    }
  }
}
