{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$defs": {
    "value": {
      "oneOf": [
        { "type": "boolean" },
        { "type": "string" },
        { "type": "number" },
        {
          "type": "object",
          "additionalProperties": { "$ref": "#/$defs/value" }
        },
        {
          "type": "array",
          "items": { "$ref": "#/$defs/value" }
        }
      ]
    },
    "value_or_null": {
      "oneOf": [{ "$ref": "#/$defs/value" }, { "type": "null" }]
    },
    "variation_value": {
      "type": "string",
      "minLength": 1
    },
    "group_segment": {
      "oneOf": [
        {
          "type": "string",
          "description": "Segment key or *"
        },
        {
          "type": "object",
          "properties": {
            "and": {
              "type": "array",
              "items": { "$ref": "#/$defs/group_segment" }
            }
          },
          "required": ["and"],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "or": {
              "type": "array",
              "items": { "$ref": "#/$defs/group_segment" }
            }
          },
          "required": ["or"],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "not": {
              "type": "array",
              "items": { "$ref": "#/$defs/group_segment" }
            }
          },
          "required": ["not"],
          "additionalProperties": false
        }
      ]
    },
    "group_segments": {
      "oneOf": [
        { "$ref": "#/$defs/group_segment" },
        {
          "type": "array",
          "items": { "$ref": "#/$defs/group_segment" }
        }
      ]
    },
    "bucket_by": {
      "oneOf": [
        { "type": "string" },
        {
          "type": "array",
          "items": { "type": "string" }
        },
        {
          "type": "object",
          "properties": {
            "or": {
              "type": "array",
              "items": { "type": "string" }
            }
          },
          "required": ["or"],
          "additionalProperties": false
        }
      ]
    },
    "required_dependency": {
      "oneOf": [
        { "type": "string" },
        {
          "type": "object",
          "properties": {
            "key": { "type": "string" },
            "variation": { "type": "string" }
          },
          "required": ["key"],
          "additionalProperties": false
        }
      ]
    },
    "schema_node": {
      "type": "object",
      "properties": {
        "description": { "type": "string" },
        "schema": { "type": "string" },
        "type": {
          "type": "string",
          "enum": ["boolean", "string", "integer", "double", "object", "array"]
        },
        "enum": {
          "type": "array",
          "items": { "$ref": "#/$defs/value" }
        },
        "const": { "$ref": "#/$defs/value" },
        "minimum": { "type": "number" },
        "maximum": { "type": "number" },
        "minLength": { "type": "number" },
        "maxLength": { "type": "number" },
        "pattern": { "type": "string" },
        "items": { "$ref": "#/$defs/schema_node" },
        "minItems": { "type": "number" },
        "maxItems": { "type": "number" },
        "uniqueItems": { "type": "boolean" },
        "required": {
          "type": "array",
          "items": { "type": "string" }
        },
        "properties": {
          "type": "object",
          "additionalProperties": { "$ref": "#/$defs/schema_node" }
        },
        "additionalProperties": { "$ref": "#/$defs/schema_node" },
        "oneOf": {
          "type": "array",
          "items": { "$ref": "#/$defs/schema_node" }
        }
      },
      "additionalProperties": false
    },
    "variable_schema_entry": {
      "type": "object",
      "properties": {
        "deprecated": { "type": "boolean" },
        "schema": { "type": "string" },
        "type": {
          "type": "string",
          "enum": ["json", "boolean", "string", "integer", "double", "object", "array"]
        },
        "items": { "$ref": "#/$defs/schema_node" },
        "properties": {
          "type": "object",
          "additionalProperties": { "$ref": "#/$defs/schema_node" }
        },
        "additionalProperties": { "$ref": "#/$defs/schema_node" },
        "required": {
          "type": "array",
          "items": { "type": "string" }
        },
        "enum": {
          "type": "array",
          "items": { "$ref": "#/$defs/value" }
        },
        "const": { "$ref": "#/$defs/value" },
        "oneOf": {
          "type": "array",
          "items": { "$ref": "#/$defs/schema_node" }
        },
        "minimum": { "type": "number" },
        "maximum": { "type": "number" },
        "minLength": { "type": "number" },
        "maxLength": { "type": "number" },
        "pattern": { "type": "string" },
        "minItems": { "type": "number" },
        "maxItems": { "type": "number" },
        "uniqueItems": { "type": "boolean" },
        "description": { "type": "string" },
        "defaultValue": { "$ref": "#/$defs/value" },
        "disabledValue": { "$ref": "#/$defs/value" },
        "useDefaultWhenDisabled": { "type": "boolean" }
      },
      "required": ["defaultValue"],
      "additionalProperties": false
    },
    "variation_override": {
      "type": "object",
      "properties": {
        "conditions": {
          "oneOf": [
            { "$ref": "segment.json#/$defs/multiple_conditions" },
            { "$ref": "segment.json#/$defs/complex_condition" },
            { "$ref": "segment.json#/$defs/plain_condition" }
          ]
        },
        "segments": { "$ref": "#/$defs/group_segments" },
        "value": { "$ref": "#/$defs/value" }
      },
      "required": ["value"],
      "additionalProperties": false
    },
    "variation": {
      "type": "object",
      "properties": {
        "description": { "type": "string" },
        "value": { "$ref": "#/$defs/variation_value" },
        "weight": {
          "type": "number",
          "minimum": 0,
          "maximum": 100
        },
        "variables": {
          "type": "object",
          "additionalProperties": { "$ref": "#/$defs/value_or_null" }
        },
        "variableOverrides": {
          "type": "object",
          "additionalProperties": {
            "type": "array",
            "items": { "$ref": "#/$defs/variation_override" }
          }
        }
      },
      "required": ["value", "weight"],
      "additionalProperties": false
    },
    "rule": {
      "type": "object",
      "properties": {
        "key": { "type": "string" },
        "description": { "type": "string" },
        "segments": { "$ref": "#/$defs/group_segments" },
        "percentage": {
          "type": "number",
          "minimum": 0,
          "maximum": 100
        },
        "enabled": { "type": "boolean" },
        "variation": { "$ref": "#/$defs/variation_value" },
        "variables": {
          "type": "object",
          "additionalProperties": { "$ref": "#/$defs/value_or_null" }
        },
        "variationWeights": {
          "type": "object",
          "additionalProperties": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          }
        }
      },
      "required": ["key", "segments", "percentage"],
      "additionalProperties": false
    },
    "force_item": {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "segments": { "$ref": "#/$defs/group_segments" },
            "enabled": { "type": "boolean" },
            "variation": { "$ref": "#/$defs/variation_value" },
            "variables": {
              "type": "object",
              "additionalProperties": { "$ref": "#/$defs/value_or_null" }
            }
          },
          "required": ["segments"],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "conditions": {
              "oneOf": [
                { "$ref": "segment.json#/$defs/multiple_conditions" },
                { "$ref": "segment.json#/$defs/complex_condition" },
                { "$ref": "segment.json#/$defs/plain_condition" }
              ]
            },
            "enabled": { "type": "boolean" },
            "variation": { "$ref": "#/$defs/variation_value" },
            "variables": {
              "type": "object",
              "additionalProperties": { "$ref": "#/$defs/value_or_null" }
            }
          },
          "required": ["conditions"],
          "additionalProperties": false
        }
      ]
    },
    "expose_value": {
      "oneOf": [
        { "type": "boolean" },
        {
          "type": "array",
          "items": { "type": "string" }
        }
      ]
    },
    "rules_container": {
      "oneOf": [
        {
          "type": "array",
          "items": { "$ref": "#/$defs/rule" }
        },
        {
          "type": "object",
          "additionalProperties": {
            "type": "array",
            "items": { "$ref": "#/$defs/rule" }
          }
        }
      ]
    },
    "force_container": {
      "oneOf": [
        {
          "type": "array",
          "items": { "$ref": "#/$defs/force_item" }
        },
        {
          "type": "object",
          "additionalProperties": {
            "type": "array",
            "items": { "$ref": "#/$defs/force_item" }
          }
        }
      ]
    },
    "expose_container": {
      "oneOf": [
        { "$ref": "#/$defs/expose_value" },
        {
          "type": "object",
          "additionalProperties": { "$ref": "#/$defs/expose_value" }
        }
      ]
    }
  },
  "type": "object",
  "properties": {
    "archived": {
      "type": "boolean",
      "description": "Indicates whether the feature is archived or not."
    },
    "deprecated": {
      "type": "boolean",
      "description": "Indicates whether the feature is deprecated or not."
    },
    "description": {
      "type": "string",
      "description": "Human readable description of the feature for documentation purposes."
    },
    "tags": {
      "type": "array",
      "items": { "type": "string" },
      "description": "Array of tags"
    },
    "required": {
      "type": "array",
      "items": { "$ref": "#/$defs/required_dependency" }
    },
    "bucketBy": {
      "$ref": "#/$defs/bucket_by"
    },
    "disabledVariationValue": {
      "$ref": "#/$defs/variation_value"
    },
    "variablesSchema": {
      "type": "object",
      "additionalProperties": { "$ref": "#/$defs/variable_schema_entry" }
    },
    "variations": {
      "type": "array",
      "items": { "$ref": "#/$defs/variation" }
    },
    "expose": { "$ref": "#/$defs/expose_container" },
    "force": { "$ref": "#/$defs/force_container" },
    "rules": { "$ref": "#/$defs/rules_container" }
  },
  "required": ["description", "tags", "bucketBy", "rules"],
  "additionalProperties": false,
  "description": "JSON Schema for creating Featurevisor feature, expressed in YAML"
}
