---
name: generate_html_report
kind: function
lang: py
domain: core
version: "1.0.0"
purity: pure
signature: "generate_html_report(title: str, sections: list[dict]) -> str"
description: "Genera un reporte HTML autocontenido con CSS inline. Soporta secciones de tipo table (list[dict]), text (str con markdown basico), kpi (cards con label/value/delta) y list (list[str]). Para exportar resultados de pipelines sin servidor."
tags: [html, report, export, table, kpi, template, format, pendiente-usar]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: ["re"]
params:
  - name: title
    desc: "titulo del reporte HTML"
  - name: sections
    desc: "lista de dicts con campos heading, type, data para cada seccion"
output: "string HTML completo autocontenido con CSS inline y todas las secciones renderizadas"
tested: true
tests:
  - "reporte con una tabla"
  - "reporte con multiples secciones mixtas"
  - "kpi con deltas positivos y negativos"
  - "caracteres especiales html escapados en data"
  - "titulo con caracteres especiales"
test_file_path: "python/functions/core/generate_html_report_test.py"
file_path: "python/functions/core/generate_html_report.py"
---

## Ejemplo

```python
sections = [
    {
        "heading": "Resumen ejecutivo",
        "type": "kpi",
        "data": [
            {"label": "Revenue", "value": "$1.2M", "delta": "+15%"},
            {"label": "Churn", "value": "3.2%", "delta": "-0.5%"},
        ],
    },
    {
        "heading": "Top usuarios",
        "type": "table",
        "data": [
            {"usuario": "ana@example.com", "compras": 42},
            {"usuario": "bob@example.com", "compras": 38},
        ],
    },
    {
        "heading": "Notas",
        "type": "text",
        "data": "Datos del **trimestre Q1**. Ver [dashboard](https://example.com).",
    },
]

html = generate_html_report("Reporte Mensual", sections)
# Retorna string HTML completo con DOCTYPE, head con CSS inline, body con secciones
```

## Tipos de seccion

- **table**: `data` es `list[dict]` — renderiza `<table>` con headers extraidos de las keys
- **text**: `data` es `str` — soporta `**bold**` y `[text](url)`, escapa HTML
- **kpi**: `data` es `list[{"label", "value", "delta"}]` — cards con colores para delta positivo/negativo
- **list**: `data` es `list[str]` — renderiza `<ul><li>...</li></ul>`

## Notas

CSS completamente inline en `<style>`. Tema minimalista con max-width 960px, sans-serif,
tabla con zebra stripes, cards KPI con colores verde/rojo para deltas.
Todo el contenido del usuario pasa por HTML escape para proteger contra XSS.
