{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://clinicaneurobee.com.br/neurodados/schemas/comum.schema.json",
  "title": "Definições comuns do NeuroDados Brasil",
  "description": "Blocos usados por todas as bases: data, fonte, afirmação, classificação, relação entre registros, faixa etária, revisão e histórico.",
  "$defs": {
    "data": {
      "type": "string",
      "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$",
      "description": "Data no formato AAAA-MM-DD."
    },
    "id_fonte": {
      "type": "string",
      "pattern": "^f[0-9]+$",
      "description": "Identificador da fonte dentro do registro (f1, f2...)."
    },
    "id_registro": {
      "type": "string",
      "pattern": "^[a-z]+\\.[a-z0-9]+(?:-[a-z0-9]+)*$",
      "description": "Identificador de um registro de qualquer base, como neurobase.tea."
    },
    "fonte": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "tipo", "titulo", "autor", "ano", "url", "consultado_em"],
      "properties": {
        "id": { "$ref": "#/$defs/id_fonte" },
        "tipo": {
          "enum": [
            "lei",
            "norma",
            "documento_oficial",
            "diretriz_clinica",
            "classificacao_oficial",
            "estatistica_oficial",
            "artigo_revisado_por_pares",
            "revisao_sistematica",
            "livro",
            "site_institucional"
          ]
        },
        "titulo": { "type": "string", "minLength": 3, "maxLength": 400 },
        "autor": { "type": "string", "minLength": 2, "maxLength": 400, "description": "Órgão, instituição ou autores." },
        "ano": { "type": "integer", "minimum": 1900, "maximum": 2100 },
        "url": { "type": "string", "pattern": "^https?://" },
        "doi": { "type": "string", "pattern": "^10\\.[0-9]{4,9}/\\S+$" },
        "referencia": { "type": "string", "maxLength": 200, "description": "Onde, dentro da fonte: artigo, seção, página, código." },
        "trecho": { "type": "string", "maxLength": 600, "description": "Trecho literal da fonte. Só para texto de domínio público (lei, norma) ou citação curta com autoria." },
        "consultado_em": { "$ref": "#/$defs/data" }
      }
    },
    "afirmacao": {
      "type": "object",
      "additionalProperties": false,
      "required": ["texto", "fontes"],
      "properties": {
        "texto": { "type": "string", "minLength": 10, "maxLength": 700 },
        "fontes": {
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": { "$ref": "#/$defs/id_fonte" }
        }
      }
    },
    "classificacao": {
      "type": "object",
      "additionalProperties": false,
      "required": ["sistema", "codigo", "titulo", "fonte"],
      "properties": {
        "sistema": { "enum": ["CID-10", "CID-11", "DSM-5-TR"] },
        "codigo": { "type": "string", "minLength": 1, "maxLength": 20 },
        "titulo": { "type": "string", "minLength": 2, "maxLength": 300 },
        "fonte": { "$ref": "#/$defs/id_fonte" }
      }
    },
    "relacionamento": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "tipo"],
      "properties": {
        "id": { "$ref": "#/$defs/id_registro" },
        "tipo": { "enum": ["relacionado", "parte_de", "inclui", "diferenciar_de", "costuma_coexistir"] }
      }
    },
    "faixa_etaria": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "de_meses": { "type": "integer", "minimum": 0, "maximum": 1200 },
        "ate_meses": { "type": "integer", "minimum": 0, "maximum": 1200 },
        "descricao": { "type": "string", "maxLength": 200 }
      }
    },
    "revisor": {
      "type": "object",
      "additionalProperties": false,
      "required": ["nome", "conselho", "registro", "data"],
      "properties": {
        "nome": { "type": "string", "minLength": 3 },
        "conselho": { "type": "string", "minLength": 2, "description": "Sigla do conselho, como CRP-05." },
        "registro": { "type": "string", "minLength": 2 },
        "data": { "$ref": "#/$defs/data" }
      }
    },
    "revisao": {
      "type": "object",
      "additionalProperties": false,
      "required": ["situacao", "conferido_em", "revisores"],
      "properties": {
        "situacao": {
          "enum": ["conferido_nas_fontes", "em_revisao", "revisado"],
          "description": "conferido_nas_fontes: cada afirmação foi conferida na fonte citada, sem revisão de profissional. em_revisao: um profissional está revisando. revisado: um profissional com registro no conselho revisou e assina."
        },
        "conferido_em": { "$ref": "#/$defs/data" },
        "revisores": { "type": "array", "items": { "$ref": "#/$defs/revisor" } }
      }
    },
    "historico": {
      "type": "object",
      "additionalProperties": false,
      "required": ["versao", "data", "mudanca"],
      "properties": {
        "versao": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+$" },
        "data": { "$ref": "#/$defs/data" },
        "mudanca": { "type": "string", "minLength": 5, "maxLength": 400 }
      }
    }
  }
}
