from datetime import datetime
from io import BytesIO

from docx import Document

from app.core.timezone import SANTIAGO
from app.services.document_service import build_docx, build_pdf
from app.services.template_preview import render_template_preview, sample_field_value


def test_template_preview_uses_entity_and_safe_sample_values():
    fields = [
        {"codigo": "cliente_profesion", "etiqueta": "Profesión", "tipo_dato": "TEXTO", "activo": True},
        {"codigo": "fecha_inicio", "etiqueta": "Fecha de inicio", "tipo_dato": "FECHA", "activo": True},
        {"codigo": "tipo_contrato", "etiqueta": "Tipo de contrato", "tipo_dato": "LISTA",
         "opciones_json": '["Indefinido", "Plazo fijo"]', "activo": True},
    ]
    content = (
        '<div style="text-align:center"><strong>{{entidad.nombre}}</strong></div>'
        '<p>[compareciente.1.nombreInformal], [compareciente.1.profesion], '
        '{{campo.fecha_inicio}}, {{campo.tipo_contrato}}.</p>'
    )
    rendered = render_template_preview(
        content,
        "Declaración de ejemplo",
        fields,
        {"nombre_fantasia": "Notaría de Prueba", "direccion": "Calle Uno 10",
         "comuna": "Copiapó", "ciudad": "Copiapó", "region": "Región de Atacama"},
        datetime(2026, 10, 27, 12, 0, tzinfo=SANTIAGO),
    )

    assert "Notaría de Prueba" in rendered
    assert "María Fernanda González Soto" in rendered
    assert "Ingeniera comercial" in rendered
    assert "27-10-2026" in rendered
    assert "Indefinido" in rendered
    assert "compareciente.1" not in rendered
    assert 'text-align:center' in rendered


def test_template_preview_builds_real_docx_and_pdf():
    rendered = render_template_preview(
        "<h2>Vista previa</h2><p>{{folio}} · {{documento.fecha}}</p>",
        "Documento de ejemplo",
        [],
        preview_date=datetime(2026, 10, 27, 12, 0, tzinfo=SANTIAGO),
    )
    docx = build_docx(rendered, "VISTA-PREVIA-NO-VALIDA")
    pdf = build_pdf(rendered, "VISTA-PREVIA-NO-VALIDA")

    assert docx.startswith(b"PK")
    assert pdf.startswith(b"%PDF")
    document = Document(BytesIO(docx))
    assert "DOC-VISTA-PREVIA" in "\n".join(paragraph.text for paragraph in document.paragraphs)
    assert "VISTA-PREVIA-NO-VALIDA" in document.sections[0].footer.paragraphs[0].text


def test_sample_field_value_does_not_confuse_compareciente_with_name():
    now = datetime(2026, 10, 27, 12, 0, tzinfo=SANTIAGO)
    assert sample_field_value({"codigo": "compareciente_1_profesion", "etiqueta": "Profesión",
                               "tipo_dato": "TEXTO"}, now) == "ingeniera comercial"
