{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://touristtaxtools.com/schemas/rule-policy.v1.schema.json",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:/-]{0,199}$"
    },
    "revision": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:/-]{0,199}$"
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "jurisdictionId": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:/-]{0,199}$"
    },
    "sourceRuleIds": {
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:/-]{0,199}$"
      },
      "minItems": 1,
      "maxItems": 100
    },
    "qualification": {
      "type": "object",
      "properties": {
        "status": {
          "const": "qualified"
        },
        "summary": {
          "type": "string",
          "minLength": 1,
          "maxLength": 10000
        },
        "evidenceIds": {
          "type": "array",
          "items": {
            "type": "string",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:/-]{0,199}$"
          },
          "minItems": 1,
          "maxItems": 100
        }
      },
      "required": ["status", "summary", "evidenceIds"],
      "additionalProperties": false
    },
    "effectiveFrom": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "effectiveTo": {
      "type": ["string", "null"],
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "currency": {
      "const": "EUR"
    },
    "calculation": {
      "type": "object",
      "properties": {
        "kind": {
          "const": "net_percentage"
        },
        "rate": {
          "type": "string",
          "pattern": "^(0|[1-9][0-9]{0,2})(\\.[0-9]{1,8})?$"
        },
        "rounding": {
          "enum": [
            "half_up_per_night",
            "half_up_per_stay",
            "exact_integral_minor_unit"
          ]
        }
      },
      "required": ["kind", "rate", "rounding"],
      "additionalProperties": false
    },
    "conditions": {
      "type": "object",
      "properties": {
        "accommodationTypes": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "minItems": 1,
          "maxItems": 100
        },
        "agreementFrom": {
          "type": ["string", "null"],
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
        },
        "agreementTo": {
          "type": ["string", "null"],
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
        },
        "maxStayCalendarMonths": {
          "type": ["integer", "null"],
          "minimum": 1,
          "maximum": 12
        },
        "factRequirements": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "fact": {
                "enum": [
                  "paidAccommodation",
                  "originalContractUnderSixMonths",
                  "basicHousingNeed",
                  "schoolTrip",
                  "registeredResidence",
                  "emergencyAccommodation",
                  "platformCollected",
                  "passThroughChosen"
                ]
              },
              "equals": {
                "type": "boolean"
              },
              "evidenceIds": {
                "type": "array",
                "items": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:/-]{0,199}$"
                },
                "minItems": 1,
                "maxItems": 100
              }
            },
            "required": ["fact", "equals", "evidenceIds"],
            "additionalProperties": false
          },
          "minItems": 0,
          "maxItems": 100
        }
      },
      "required": [
        "accommodationTypes",
        "agreementFrom",
        "agreementTo",
        "maxStayCalendarMonths",
        "factRequirements"
      ],
      "additionalProperties": false
    },
    "collection": {
      "type": "object",
      "properties": {
        "collector": {
          "const": "accommodation_operator"
        },
        "passThrough": {
          "enum": ["permitted", "required"]
        }
      },
      "required": ["collector", "passThrough"],
      "additionalProperties": false
    },
    "taxTreatment": {
      "type": "object",
      "properties": {
        "passedThroughVatBase": {
          "enum": ["accommodation", "unknown"]
        },
        "evidenceIds": {
          "type": "array",
          "items": {
            "type": "string",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:/-]{0,199}$"
          },
          "minItems": 0,
          "maxItems": 100
        }
      },
      "required": ["passedThroughVatBase", "evidenceIds"],
      "additionalProperties": false
    },
    "evidenceIds": {
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:/-]{0,199}$"
      },
      "minItems": 1,
      "maxItems": 100
    }
  },
  "required": [
    "id",
    "revision",
    "name",
    "jurisdictionId",
    "sourceRuleIds",
    "qualification",
    "effectiveFrom",
    "effectiveTo",
    "currency",
    "calculation",
    "conditions",
    "collection",
    "taxTreatment",
    "evidenceIds"
  ],
  "additionalProperties": false
}
