{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "cata-checklist-import/v1",
  "title": "Importação de checklists Cata (v1)",
  "description": "Perguntas e checklists para importar no Cata. Perguntas são identificadas pelo código; checklists, pelo nome. A importação só cria rascunhos: nada é publicado automaticamente.",
  "type": "object",
  "required": ["format"],
  "anyOf": [{ "required": ["questions"] }, { "required": ["checklists"] }],
  "additionalProperties": false,
  "properties": {
    "$schema": { "type": "string" },
    "format": { "const": "cata-checklist-import/v1" },
    "questions": {
      "description": "Perguntas novas ou alteradas. Uma pergunta que já existe no Cata com o mesmo código ganha uma nova versão se o conteúdo mudar.",
      "type": "array",
      "maxItems": 5000,
      "items": { "$ref": "#/$defs/question" }
    },
    "checklists": {
      "description": "Checklists completos. Um checklist que já existe no Cata com o mesmo nome recebe um novo rascunho com este conteúdo.",
      "type": "array",
      "maxItems": 1000,
      "items": { "$ref": "#/$defs/checklist" }
    }
  },
  "$defs": {
    "label": { "type": "string", "minLength": 1, "maxLength": 120 },
    "question": {
      "type": "object",
      "required": ["code", "statement", "type"],
      "additionalProperties": false,
      "properties": {
        "code": {
          "description": "Identificador permanente da pergunta: letras sem acento, números, ponto, hífen ou sublinhado, sem espaços.",
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]*$",
          "maxLength": 40
        },
        "statement": { "description": "Enunciado exibido ao vistoriador.", "type": "string", "minLength": 1, "maxLength": 300 },
        "type": {
          "description": "texto = resposta livre; selecao = escolha de uma opção; c_nc_a = Conforme / Não conforme / Ausente; sim_nao_na = Sim / Não / Não aplicável.",
          "enum": ["texto", "selecao", "c_nc_a", "sim_nao_na"]
        },
        "options": {
          "description": "Somente para selecao: pelo menos duas opções, sem repetição.",
          "type": "array",
          "maxItems": 50,
          "items": { "$ref": "#/$defs/label" }
        },
        "subitems": {
          "description": "Somente para c_nc_a e sim_nao_na: abrem quando a resposta é NC ou Não e são respondidos com Aprovado ou Reprovado.",
          "type": "array",
          "maxItems": 50,
          "items": { "$ref": "#/$defs/label" }
        }
      },
      "allOf": [
        { "if": { "properties": { "type": { "const": "selecao" } } }, "then": { "required": ["options"], "properties": { "options": { "minItems": 2 } } } }
      ]
    },
    "checklist": {
      "type": "object",
      "required": ["name", "categories"],
      "additionalProperties": false,
      "properties": {
        "name": { "description": "Nome do checklist, único no Cata.", "type": "string", "minLength": 1, "maxLength": 120 },
        "categories": {
          "type": "array",
          "minItems": 1,
          "maxItems": 100,
          "items": {
            "type": "object",
            "required": ["name", "items"],
            "additionalProperties": false,
            "properties": {
              "name": { "type": "string", "minLength": 1, "maxLength": 120 },
              "items": {
                "description": "Perguntas da categoria, em ordem. Cada pergunta aparece uma só vez no checklist.",
                "type": "array",
                "minItems": 1,
                "maxItems": 300,
                "items": {
                  "oneOf": [
                    { "description": "Código de uma pergunta (obrigatória).", "type": "string", "minLength": 1 },
                    {
                      "type": "object",
                      "required": ["question"],
                      "additionalProperties": false,
                      "properties": {
                        "question": { "description": "Código da pergunta.", "type": "string", "minLength": 1 },
                        "required": { "description": "false torna a pergunta opcional. O padrão é true.", "type": "boolean" }
                      }
                    }
                  ]
                }
              }
            }
          }
        }
      }
    }
  }
}
