# Prompt: Generador de Tests JSON

Genera un único archivo JSON válido y bien formateado que contenga un Test de preguntas conforme a estas reglas.

## 1) Objetivo y salida
- Crea un archivo JSON (pretty-printed) con la estructura indicada más abajo.
- Devuélveme solo el JSON (sin explicaciones ni texto extra).

## 2) Estructura del fichero (raíz)
- El JSON será un array con un objeto que incluye:
  - `origin`: String (autor/fuente de las preguntas)
  - `title`: String (título del grupo)
  - `group`: String (clave id de grupo, debe cumplir la regex `/^[a-z0-9_]+$/i`)
  - `source`: String | Array[String] (fuentes / enlaces)
  - `queries`: Array[Question]

## 3) Estructura de cada Question (cada elemento de `queries`)
- `question`: String | Array[String] (texto de la pregunta; puede haber variantes)
- `rights`: Array[String] (una o más respuestas correctas)
- `wrongs`: Array[String] (mínimo 3 respuestas incorrectas)

Reglas obligatorias:
- No hay un número mínimo de preguntas, pero intentar siempre hacer cuántas más mejor.
- Por cada pregunta, cuántas más opciones para la misma pregunta, mejor.
- Cada pregunta debe tener al menos 1 elemento en `rights`, pero cuántas más mejor.
- Cada pregunta debe tener al menos 3 elementos en `wrongs`, pero cuántas más mejor.
- `rights` y `wrongs` pueden contener tantas opciones adicionales como quieras.
- Los strings pueden incluir estructuras tokenizadas (ver sección tokens). Cuantas más, más variedad pueden tener y por tanto, mejor, pero siempre han de ser coherentes y lógicas a su propósito. Cantidad con calidad.

## 4) Gramática de tokens permitidos (solo dentro de strings; NO como una respuesta completa)
- Formato general: `{nombre:parametros,valores}`
  - `nombre`: letras (p. ej. `rand`, `mix`, `select`, `range`, `serie`)
  - `parametros`: opcionales, separados por comas
  - `valores`: opciones separadas por `|`
- Tokens soportados (sintaxis y efecto):
  - `{rand:op1|op2|op3}` → sustituye por una de las opciones aleatorias.
    - Ej: `"La opción correcta es {rand:la A|la B|la C}"`
  - `{mix:sep,op1|op2|op3}` → mezcla `op1..opN` y devuelve la lista separada por comas, usando `sep` antes del último elemento.
    - Ej: `"{mix: y,rojo|azul|verde}"` → `"rojo, azul y verde"`
  - `{Mix:sep,op1|op2|op3}` → igual que `mix` pero capitaliza la primera letra del resultado.
  - `{select:desde-hasta,sep,op1|op2|op3}` → selecciona aleatoriamente entre N elementos (`rango desde-hasta`) sin repetir y los une con `sep`.
    - Ej: `"{select:1-2,y,manzana|pera|uva}"` puede dar `"Manzana y pera"` (si usas `Select` capitaliza).
  - `{range:n1-n2|n3|n4-n5}` → elige un número aleatorio dentro de uno de los rangos/secciones.
    - Ej: `"{range:3-8|11|20-50}"`
  - `{serie:n1-n2|n3|...}` → como `range`, pero mantiene memoria en el archivo: la primera aparición toma un valor; la siguiente aparición de la misma serie incrementa o iguala según el diseño. (Memoria scope: por archivo).
  - `{Mix:sep,op1|op2|op3}` → igual que `mix` pero capitaliza la primera letra del resultado.
  - `{select:desde-hasta,sep,op1|op2|op3}` → selecciona aleatoriamente entre N elementos (`rango desde-hasta`) sin repetir y los une con `sep`.
    - Ej: `"{select:1-2,y,manzana|pera|uva}"` puede dar `"Manzana y pera"` (si usas `Select` capitaliza).
  - `{range:n1-n2|n3|n4-n5}` → elige un número aleatorio dentro de uno de los rangos/secciones.
    - Ej: `"{range:3-8|11|20-50}"`
  - `{serie:n1-n2|n3|...}` → como `range`, pero mantiene memoria en el archivo: la primera aparición toma un valor; la siguiente aparición de la misma serie incrementa o iguala según el diseño. (Memoria scope: por archivo).
  - Capitalización general: `{Cap:texto}` daría `Texto`.

### Reglas de parseo (aclaración breve)
- Evaluación: los tokens se deben evaluar de dentro hacia fuera (innermost-first). Es decir, primero localizar y resolver el token más interior `{...}`, sustituir su texto resultante y continuar hasta no quedar tokens.
- Nombres de token: son case‑insensitive. El motor debe tratar `mix`, `Mix` o `MIX` como el mismo token funcional; ciertas variantes (por ejemplo `Mix` o `Select`) se definen aquí para indicar capitalización del resultado cuando se indique.


Reglas sobre tokens:
- Deben aparecer embebidos en texto (no pueden ser la única cosa de una opción).
- Pueden anidarse si es razonable, p. ej. `"{mix: y,{rand:a|b}|{rand:c|d}}"`
- Si usas `serie`, especifica en el texto si quieres reinicio o wrap (por defecto: incrementa hasta el máximo y vuelve al inicio).

## 5) Contenido temático y alcance
- Tema: Constitución Española (Art.87 y Art.166). Genera todas las preguntas que se te ocurran sobre esos artículos (tantas como el tema permita), mínimo 10 preguntas sensatas.
- Mantén fidelidad al texto: las `rights` deben ser correctas según los artículos; `wrongs` deben ser plausibles, pero incorrectas.
- Es importante entender que las preguntas pertenecen a una batería de preguntas que las une y por tanto, es importante determinar de qué se habla en las mismas para evitar ambigüedades.

## 6) Formato y validaciones exigidas por la salida
- El JSON resultante debe ser válido (parseable por un JSON parser).
- Validaciones automáticas a cumplir:
  - `group` cumple `/^[a-z0-9_]+$/i`
  - Cada `query` tiene >=1 `rights` y >=3 `wrongs`
  - Ninguna `rights` ni `wrongs` es null/empty
  - Tokens sólo embebidos en strings (no elementos token-only)
- Salida: devuelve SOLO el JSON (pretty-printed).

## 7) Malas prácticas

- Hacer uso de `rand`, `select` o `mix` para un único elemento, a excepción del `rand` para determinar si sale o no aleatoriamente.
- Hacer uso de `range` o `serie` para un único valor numérico.
- Hacer uso de un rango y no un valor fijo numérico para determinar un único valor en `range` y `serie`.
- Hacer uso de `Cap` para capitalizar un texto no dinámico.
- Hacer uso de `mix` en las respuestas "wrongs" y no `select` para implementar más difícultad y opciones.

## 8) Trucos

- Para determinar si un texto pueda salir o no aleatoriamente se puede hacer uso de `rand` de la siguiente forma: `Esto es un ejemplo{rand:|, que puede ser extendido o no}.`

## 9) Ejemplo mínimo de una pregunta válida
```json
{
  "question": "Según el art.87.1. ¿A quién corresponde la iniciativa legislativa?",
  "rights": ["{Mix:y,al Gobierno|al Congreso|al Senado}, de acuerdo con {mix:y,la Constitución|los Reglamentos de las Cámaras}"],
  "wrongs": [
    "Sólo {rand:al {rand:Gobierno|Congreso|Senado}|a las {rand:Cámaras|Cortes{rand:| Generales}|Comunidades Autónomas|Diputaciones{rand:| Provinciales}}|a la Constitución}",
    "{Cap:{rand:al {rand:Gobierno|Congreso|Senado}|a las {rand:Cámaras|Cortes{rand:| Generales}|Comunidades Autónomas|Diputaciones{rand:| Provinciales}}|a la Constitución}} exclusivamente.", 
    "{Select:1-5,y,al Gobierno|al Congreso|al Senado|a las Cámaras|a las Cortes Generales}{rand:|, de acuerdo con {Select:1-3,y,a las Comunidades Autónomas|a las Diputaciones{rand:| Provinciales}|a la Constitución}}."
  ]
}
```
