{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schemas.oondemand.com.br/central.app.v1.schema.json",
  "title": "Oon Central App Manifest",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "schemaVersion",
    "id",
    "name",
    "slug",
    "appKind",
    "modules",
    "capabilities",
    "compatibility"
  ],
  "properties": {
    "$schema": {
      "type": "string"
    },
    "schemaVersion": {
      "const": 1
    },
    "id": {
      "type": "string",
      "pattern": "^[a-z0-9][a-z0-9._-]*$"
    },
    "name": {
      "type": "string",
      "minLength": 1
    },
    "slug": {
      "type": "string",
      "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
    },
    "appKind": {
      "enum": [
        "root-central",
        "member-central",
        "portal-cockpit"
      ]
    },
    "tenancyModel": {
      "enum": [
        "none",
        "single_tenant",
        "multi_tenant"
      ]
    },
    "availability": {
      "enum": [
        "system",
        "common",
        "licensed"
      ]
    },
    "accessMode": {
      "enum": [
        "tenant_members",
        "explicit_users",
        "authenticated_users"
      ]
    },
    "authorizationMode": {
      "enum": [
        "none",
        "rbac"
      ]
    },
    "accessPolicy": {
      "enum": [
        "tenant_members",
        "explicit_users",
        "rbac"
      ],
      "description": "Compatibilidade legada. Novos manifestos devem usar accessMode e authorizationMode."
    },
    "deploymentMode": {
      "enum": [
        "singleton",
        "shared",
        "dedicated",
        "hybrid"
      ]
    },
    "auth": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "sessionScope": {
          "const": "ecosystem"
        }
      }
    },
    "modules": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "collections": {
          "type": "boolean"
        },
        "documents": {
          "type": "boolean"
        },
        "pipelines": {
          "type": "boolean"
        },
        "integrations": {
          "type": "boolean"
        },
        "omie": {
          "type": "boolean"
        },
        "assistants": {
          "type": "boolean"
        },
        "currencies": {
          "type": "boolean"
        }
      }
    },
    "capabilities": {
      "type": "array",
      "uniqueItems": true,
      "items": {
        "type": "string",
        "pattern": "^[a-z][a-z0-9]*(?:[._:-][a-z0-9][a-z0-9-]*)+$"
      }
    },
    "compatibility": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "core"
      ],
      "properties": {
        "core": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "minVersion"
          ],
          "properties": {
            "minVersion": {
              "type": "string",
              "pattern": "^\\d+\\.\\d+\\.\\d+(?:[-+][0-9A-Za-z.-]+)?$"
            },
            "maxVersionExclusive": {
              "type": "string",
              "pattern": "^\\d+\\.\\d+\\.\\d+(?:[-+][0-9A-Za-z.-]+)?$"
            }
          }
        }
      }
    },
    "activation": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "enabled": {
          "type": "boolean"
        },
        "configurationVersion": {
          "type": "integer",
          "minimum": 1
        },
        "fields": {
          "type": "array"
        }
      }
    },
    "rbac": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "roles"
      ],
      "properties": {
        "permissions": {
          "type": "array",
          "uniqueItems": true,
          "items": {
            "type": "string",
            "pattern": "^[a-z][a-z0-9-]*(?:\\.[a-z][a-z0-9-]*)+$"
          }
        },
        "invitationTtlHours": {
          "type": "integer",
          "minimum": 1,
          "maximum": 720
        },
        "roles": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "code",
              "name",
              "permissions"
            ],
            "properties": {
              "code": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_-]*$"
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "description": {
                "type": "string"
              },
              "admin": {
                "type": "boolean"
              },
              "permissions": {
                "type": "array",
                "uniqueItems": true,
                "items": {
                  "anyOf": [
                    {
                      "const": "*"
                    },
                    {
                      "type": "string",
                      "pattern": "^[a-z][a-z0-9-]*(?:\\.[a-z][a-z0-9-]*)+$"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    }
  },
  "allOf": [
    {
      "if": {
        "properties": {
          "accessMode": {
            "const": "authenticated_users"
          }
        },
        "required": [
          "accessMode"
        ]
      },
      "then": {
        "required": [
          "tenancyModel",
          "availability",
          "authorizationMode",
          "deploymentMode"
        ],
        "properties": {
          "tenancyModel": {
            "const": "none"
          },
          "availability": {
            "const": "common"
          },
          "authorizationMode": {
            "const": "rbac"
          },
          "deploymentMode": {
            "const": "singleton"
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "tenancyModel": {
            "const": "none"
          }
        },
        "required": [
          "tenancyModel"
        ]
      },
      "then": {
        "properties": {
          "accessMode": {
            "not": {
              "const": "tenant_members"
            }
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "tenancyModel": {
            "const": "single_tenant"
          }
        },
        "required": [
          "tenancyModel"
        ]
      },
      "then": {
        "properties": {
          "deploymentMode": {
            "not": {
              "const": "shared"
            }
          }
        }
      }
    }
  ]
}
