# Design: Sistema Avanzado de In-Content Ads
## Context
El sitio analisisdepreciosunitarios.com ha experimentado una reduccion del 50% en ingresos de AdSense. El analisis indica que el sistema actual solo inserta anuncios despues de parrafos, desperdiciando oportunidades de insercion despues de otros elementos estructurales del contenido (encabezados, imagenes, listas, etc.).
### Stakeholders
- Propietario del sitio (monetizacion)
- Usuarios (experiencia de lectura)
- Google AdSense (politicas de densidad)
### Constraints
- Politicas de AdSense: No mas de 3 anuncios visibles simultaneamente en viewport
- UX: Mantener legibilidad del contenido
- Performance: No afectar tiempos de carga (lazy load existente)
## Goals / Non-Goals
### Goals
- Incrementar ubicaciones potenciales de anuncios de ~8 a ~15-20
- Proporcionar control granular por tipo de elemento
- Mantener cumplimiento con politicas de AdSense
- Mejorar ingresos sin sacrificar UX drasticamente
### Non-Goals
- No implementar insercion dentro de parrafos (mid-paragraph)
- No implementar anuncios de video
- No cambiar el sistema de delay/lazy load existente
---
## Decisions
### Decision 1: Tipos de ubicacion soportados
**Seleccionados:**
- Despues de parrafos (existente, mejorado)
- Despues de encabezados H2
- Despues de encabezados H3
- Despues de imagenes/figuras
- Despues de blockquotes
- Despues de listas (ul/ol completadas)
- Despues de tablas
**Rationale:** Estos elementos representan pausas naturales en la lectura donde un anuncio es menos intrusivo.
### Decision 2: Sistema de prioridades (CORREGIDO)
```
Prioridad (valores fijos, no configurables):
| Tipo | Prioridad | Justificacion |
|-------------------|-----------|----------------------------------|
| Despues de H2 | 10 | Ruptura tematica mayor |
| Despues de parrafos | 8 | Ubicacion tradicional, probada |
| Despues de H3 | 7 | Ruptura tematica menor |
| Despues de imagenes | 6 | Pausa visual natural |
| Despues de listas | 5 | Fin de enumeracion |
| Despues de blockquotes | 4 | Fin de cita |
| Despues de tablas | 3 | Fin de datos tabulares |
```
**Nota:** El orden numerico refleja la prioridad real. H2 > parrafos > H3 > imagenes.
### Decision 3: Modos de densidad
| Modo | Max Ads | Espaciado Min | Ubicaciones Activas por Defecto |
|------|---------|---------------|--------------------------------|
| Legacy | (usa config anterior) | (usa config anterior) | Solo parrafos |
| Conservador | 5 | 5 elementos | H2, parrafos |
| Balanceado | 8 | 3 elementos | H2, H3, parrafos, imagenes |
| Agresivo | 15 | 2 elementos | Todas |
| Personalizado | Configurable | Configurable | Configurable |
### Decision 4: Estrategia de campos legacy
**Problema:** Existen campos en el grupo `behavior` que se solapan con los nuevos:
| Campo Legacy | Campo Nuevo | Estrategia |
|--------------|-------------|------------|
| post_content_enabled | N/A | Se mantiene para modo legacy |
| post_content_max_ads (1-8) | incontent_max_total_ads (1-15) | Deprecacion suave |
| post_content_min_paragraphs_between | incontent_min_spacing | Deprecacion suave |
| post_content_random_mode | Probabilidades por tipo | Mapeo: true → 75% |
| post_content_after_paragraphs | N/A | Solo aplica en modo legacy |
**Solucion elegida:** Deprecacion suave con modo "legacy"
- Si `incontent_mode == "legacy"`: usar campos del grupo `behavior`
- Si `incontent_mode != "legacy"`: usar campos de `incontent_advanced`
- Mostrar banner de migracion en admin
### Decision 5: Enfoque de parsing HTML
**Opcion A: DOMDocument**
```php
$dom = new DOMDocument();
$dom->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'));
```
- Pros: Parsing robusto, manejo correcto de anidamiento
- Contras: Puede modificar HTML, mas lento
**Opcion B: Regex multiple (SELECCIONADA)**
```php
preg_split('/(<\/(?:p|h[2-3]|figure|ul|ol|table|blockquote)>)/i', $content, -1, PREG_SPLIT_DELIM_CAPTURE)
```
- Pros: Rapido, no modifica HTML
- Contras: No detecta contexto de anidamiento
**Justificacion:** Regex es suficiente para el caso de uso. El contexto de `` dentro de `