{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "formats.json",
  "title": "JSON Schema for UBLO v2 formats",
  "description": "UBLO v2 format declaration linter",
  "type": "object",
  "properties": {
    "$schema": { "type": "string" }
  },
  "additionalProperties": false,
  "patternProperties": {
    "^.*$": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "description": "Obligatoire. Nom du format affiché dans l'interface d'ajout de section."
        },
        "group": {
          "type": "string",
          "description": "Obligatoire. Groupe dans lequel le format esf affiché dans l'interface d'ajout de sections."
        },
        "description": {
          "type": "string",
          "description": "Optionnel. Description du format affichée dans l'interface d'ajout de sections."
        },
        "unique": {
          "type": "boolean",
          "description": "Optionnel. Affiche ou non un message d'avertissement dans l'interface d'ajout de sections signalant que cette section ne doit pas être utilisée plus d'une fois par page."
        },
        "preview": {
          "type": "boolean",
          "description": "Optionnel. Génère automatiquement une prévisualisation du bloc dans l'interface d'ajout de sections. Attention cette option ne fonctionne pas forcément avec tous les formats en fonction de leur taille et compléxité."
        },
        "cssClass": {
          "type": "string",
          "pattern": "[_a-zA-Z]+[_a-zA-Z0-9-]",
          "description": "Optionnel. Nom de classe apliqué à la <section>."
        },
        "variants": {
          "type": "array",
          "description": "Optionnel. Permet de déclarer une collection de variantes qui seront affichée dans l'interface d'ajout de sections et dans la popup des paramètres de la section.",
          "items": {
            "type": "object",
            "properties": {
              "name": { "type": "string" },
              "cssClass": {
                "type": "string",
                "pattern": "[_a-zA-Z]+[_a-zA-Z0-9-]"
              }
            },
            "required": ["name", "cssClass"],
            "additionalProperties": false
          }
        },
        "attributes": {
          "type": "array",
          "description": "Optionnel. Permet de déclarer une collection de de propriétés qui seront affichée dans l'onglet \"Propriétés\" de la popup des paramètres de la section.",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "Obligatoire. Nom de la propriétés (libellé du champ)."
              },
              "property": {
                "type": "string",
                "pattern": "data-[_a-z]+[_a-z0-9-]",
                "description": "Obligatoire. Nom de l'attribut appliqué à la section."
              },
              "placeholder": {
                "type": "string",
                "description": "Optionnel. Placeholder affiché dans le champs."
              },
              "options": {
                "type": "array",
                "items": { "type": "string" },
                "description": "Optionnel. Liste des valeurs autorisées."
              },
              "allowMultipleOptions": {
                "type": "boolean",
                "description": "Optionnel. Permet d'autoriser plus d'une valeur."
              }
            },
            "required": ["name", "property"],
            "additionalProperties": false
          }
        },
        "markup": {
          "type": "object",
          "description": "Obligatoire. Structure de la section.",
          "patternProperties": {
            "^.*$": {
              "type": "object",
              "$ref": "#/$defs/markup"
            }
          },
          "additionalProperties": false
        }
      },
      "required": ["name", "group", "markup"],
      "additionalProperties": false
    }
  },
  "$defs": {
    "markup": {
      "type": ["object", "string", "array"],
      "description": "Obligatoire. Structure interne de la section.",
      "properties": {
        "format": {
          "type": "string",
          "enum": [
            "TextFormat",
            "RichTextFormat",
            "ImgFormat",
            "PictureFormat",
            "LinkFormat",
            "IconFormat",
            "SlideshowFormat",
            "EsfBookingLinkFormat",
            "TableFormat",
            "TarifsTableFormat",
            "VideoFormat",
            "IframeFormat",
            "GoogleMapsFormat",
            "YoutubePlaylistFormat",
            "SpotifyPlaylistFormat"
          ],
          "description": "Type du format."
        },
        "markup": {
          "$ref": "#/$defs/markup"
        }
      },
      "patternProperties": {
        "(?!options)^.*$": {
          "$ref": "#/$defs/markup"
        }
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "format": { "enum": ["TextFormat", "RichTextFormat"] }
            }
          },
          "then": {
            "properties": {
              "options": {
                "type": "object",
                "description": "Options spécifiques à ce type de format.",
                "properties": {
                  "textLength": {
                    "type": "object",
                    "description": "Permet de définir une longueur optimale au TextFormat.",
                    "properties": {
                      "max": {
                        "type": "number",
                        "description": "Nombre de caractères maximum autorisé."
                      }
                    },
                    "required": ["max"]
                  }
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "format": { "const": "RichTextFormat" }
            }
          },
          "then": {
            "properties": {
              "options": {
                "type": "object",
                "description": "Options spécifiques à ce type de format.",
                "properties": {
                  "commands": {
                    "type": "array",
                    "description": "Commandes de formatage autorisées dans ce RichTextFormat.",
                    "items": {
                      "type": ["string", "object"],
                      "enum": [
                        "bold",
                        "italic",
                        "list",
                        "orderedList",
                        "left",
                        "center",
                        "right",
                        "justify",
                        "indent",
                        "outdent",
                        "link",
                        "unlink",
                        "cleanup",
                        "color",
                        "background",
                        "family",
                        "size",
                        "weight",
                        {}
                      ]
                    }
                  },
                  "allowHtmlEdit": {
                    "type": "boolean"
                  }
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "format": { "const": "PictureFormat" }
            }
          },
          "then": {
            "properties": {
              "options": {
                "type": "object",
                "description": "Options spécifiques à ce type de format.",
                "properties": {
                  "sizes": {
                    "description": "Définition des paliers affichés dans la popup d'édition de ce PictureFormat.",
                    "additionalProperties": {
                      "properties": {
                        "src": {
                          "type": "string",
                          "description": "TODO",
                          "pattern": "^https?://"
                        },
                        "width": {
                          "type": "number",
                          "description": "TODO"
                        },
                        "height": {
                          "type": "number",
                          "description": "TODO"
                        }
                      },
                      "required": ["src"]
                    }
                  }
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "format": { "const": "LinkFormat" }
            }
          },
          "then": {
            "properties": {
              "options": {
                "type": "object",
                "description": "Options spécifiques à ce type de format.",
                "properties": {
                  "defaultHref": {
                    "type": "string",
                    "description": "Attribut \"href\" associée par défaut à ce LinkFormat lorsque la section est placée dans une page."
                  },
                  "defaultTarget": {
                    "type": "string",
                    "description": "Attribut \"target\" associée par défaut à ce LinkFormat lorsque la section est placée dans une page.",
                    "enum": ["_blank", "_self", "_parent", "_top"]
                  }
                }
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "format": { "enum": ["TableFormat", "TarifsTableFormat"] }
            }
          },
          "then": {
            "properties": {
              "markup": {
                "items": {
                  "type": "object",
                  "properties": {
                    "name": { "type": "string" },
                    "markup": { "type": "string" }
                  },
                  "required": ["name", "markup"]
                }
              }
            }
          }
        }
      ]
    }
  }
}
