from io import BytesIO

from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from reportlab.lib.enums import TA_CENTER
from reportlab.lib.pagesizes import LETTER
from reportlab.platypus import SimpleDocTemplate

from app.services.rich_text import append_docx_html, parse_rich_blocks, reportlab_story, sanitize_template_html


def test_sanitizer_keeps_document_format_and_removes_active_content():
    result = sanitize_template_html(
        '<p style="text-align:center;font-family:Arial;font-size:18px">'
        '<strong>Hola</strong><script>alert(1)</script></p>'
    )
    assert "text-align:center" in result
    assert "font-family:Arial" in result
    assert "<strong>Hola</strong>" in result
    assert "script" not in result
    assert "alert" not in result


def test_legacy_plain_text_becomes_rich_paragraphs():
    assert sanitize_template_html("Línea 1\nLínea 2") == "<p>Línea 1</p><p>Línea 2</p>"


def test_browser_legacy_alignment_survives_save_and_render():
    content = sanitize_template_html(
        '<div align="center"><strong>Título centrado</strong></div>'
        '<p align="right">Firma</p>'
        '<center>Notario público</center>'
    )
    assert 'style="text-align:center"' in content
    assert 'style="text-align:right"' in content
    assert [block.align for block in parse_rich_blocks(content)] == ["center", "right", "center"]


def test_browser_css_font_and_size_survive_save_and_docx_render():
    content = sanitize_template_html(
        '<div style="text-align:center">'
        '<span style="font-family:Arial, sans-serif;font-size:24px;font-weight:700">'
        'Texto con formato</span></div>'
    )
    assert 'style="text-align:center"' in content
    assert 'font-family:Arial' in content
    assert 'font-size:24px' in content

    blocks = parse_rich_blocks(content)
    assert blocks[0].align == "center"
    assert blocks[0].runs[0].font == "Arial"
    assert blocks[0].runs[0].size == 18.0
    assert blocks[0].runs[0].bold is True

    word = Document()
    append_docx_html(word, content)
    paragraph = word.paragraphs[-1]
    run = paragraph.runs[0]
    assert paragraph.alignment == WD_ALIGN_PARAGRAPH.CENTER
    assert run.font.name == "Arial"
    assert run.font.size.pt == 18.0
    assert run.bold is True

    pdf_paragraph = reportlab_story(content)[0]
    assert pdf_paragraph.style.alignment == TA_CENTER
    assert pdf_paragraph.frags[0].fontName == "Helvetica-Bold"
    assert pdf_paragraph.frags[0].fontSize == 18.0


def test_rich_content_renders_to_docx_and_pdf():
    content = sanitize_template_html(
        '<h1 style="text-align:center"><font face="Georgia" size="5" color="#cc0000">Título</font></h1>'
        '<p><b>Nombre:</b> Pablo González</p>'
    )
    word = Document()
    append_docx_html(word, content)
    docx_output = BytesIO()
    word.save(docx_output)
    pdf_output = BytesIO()
    SimpleDocTemplate(pdf_output, pagesize=LETTER).build(reportlab_story(content))
    assert docx_output.getvalue().startswith(b"PK")
    assert pdf_output.getvalue().startswith(b"%PDF")
