from __future__ import annotations

import json

from app.jobs.push_cms_pages import build_cms_payload, clean_page_content, load_exported_pages


def test_load_exported_pages_accepts_comma_separated_objects(tmp_path):
    export = tmp_path / "pages.json"
    export.write_text(
        json.dumps({"identifier": "home", "title": "Home"})
        + ",\n"
        + json.dumps({"identifier": "about-us", "title": "About"}),
        encoding="utf-8",
    )

    pages = load_exported_pages(export)

    assert [page["identifier"] for page in pages] == ["home", "about-us"]


def test_clean_page_content_removes_pagebuilder_scaffolding_and_keeps_useful_content():
    content = (
        "<style>#html-body [data-pb-style=ABC]{display:flex}</style>"
        '<divclass="pagebuilder-column section-hero" data-content-type="column" '
        'data-background-images="{&quot;desktop_image&quot;:&quot;{{media url=wysiwyg/hero.jpg}}&quot;}" '
        'data-pb-style="ABC">'
        '<div data-content-type="html">&lt;p class="intro"&gt;Hello&lt;/p&gt;</div>'
        '<a class="pagebuilder-button-primary custom-link" href="/x">Shop</a>'
        "</div>"
    )

    cleaned = clean_page_content(content, identifier="home")

    assert "data-content-type" not in cleaned
    assert "data-pb-style" not in cleaned
    assert "#html-body" not in cleaned
    assert 'class="cms-column section-hero"' in cleaned
    assert "background-image:url('{{media url=wysiwyg/hero.jpg}}')" in cleaned
    assert '<p class="intro">Hello</p>' in cleaned
    assert 'class="action primary custom-link"' in cleaned


def test_build_cms_payload_maps_active_to_is_active_and_cleans_content():
    payload = build_cms_payload(
        {
            "identifier": "privacy",
            "title": "Privacy",
            "content": '<div data-content-type="text">Policy</div>',
            "active": False,
            "sort_order": "7",
        },
        include_base_styles=False,
    )

    assert payload["identifier"] == "privacy"
    assert payload["is_active"] is False
    assert payload["sort_order"] == 7
    assert "data-content-type" not in payload["content"]


def test_clean_page_content_preserves_non_pagebuilder_data_attributes():
    cleaned = clean_page_content(
        '<div data-content-type="html">&lt;div name="termly-embed" data-id="abc"&gt;&lt;/div&gt;</div>',
        identifier="privacy",
        include_base_styles=False,
    )

    assert 'data-id="abc"' in cleaned
    assert "data-content-type" not in cleaned
