"""
La lectura de `<lastmod>`, que hasta ahora no se leía en ninguna parte.

Es el dato que permite saber **qué** dirección cambió y cuándo, y por lo tanto
sobre cuál tiene sentido pedir una reindexación en vez de mandarlas todas.

Lo que estos tests defienden es que una fecha que no se entiende **no rompa la
lectura del sitemap**. `lastmod` es opcional en el protocolo y en la práctica
llega escrito de varias formas: tratar una fecha rara como archivo inválido
dejaría un sitio entero sin registrar por un campo que nadie está obligado a
publicar.
"""

from datetime import UTC, datetime

from apps.sitemaps.reader import parse


def sitemap(*entries: str) -> bytes:
    body = ''.join(entries)
    return (
        '<?xml version="1.0" encoding="UTF-8"?>'
        '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'
        f'{body}'
        '</urlset>'
    ).encode()


def entry(loc: str, lastmod: str | None = None) -> str:
    tail = f'<lastmod>{lastmod}</lastmod>' if lastmod else ''
    return f'<url><loc>{loc}</loc>{tail}</url>'


def test_a_full_timestamp_is_read_with_its_timezone():
    content = parse(sitemap(entry('https://ejemplo.test/a', '2026-08-25T10:30:00+00:00')))

    assert content.last_modified['https://ejemplo.test/a'] == datetime(
        2026, 8, 25, 10, 30, tzinfo=UTC
    )


def test_a_bare_date_is_taken_as_utc():
    """
    Es una suposición, y por eso este campo nunca afirma nada por sí solo.

    Puede correr el dato unas horas. Sirve para comparar contra el momento en
    que Google visitó la página, que es una pregunta que tolera esa holgura.
    """
    content = parse(sitemap(entry('https://ejemplo.test/a', '2026-08-25')))

    assert content.last_modified['https://ejemplo.test/a'] == datetime(2026, 8, 25, tzinfo=UTC)


def test_an_address_without_lastmod_simply_is_not_there():
    """
    Nada de fechas inventadas.

    Un `lastmod` ausente es lo normal, y rellenarlo con la fecha de lectura
    convertiría «el sitio no dice cuándo cambió» en «cambió hoy», que es una
    afirmación que nadie hizo.
    """
    content = parse(sitemap(entry('https://ejemplo.test/a')))

    assert content.locations == ['https://ejemplo.test/a']
    assert content.last_modified == {}


def test_a_date_that_cannot_be_understood_is_dropped_without_losing_the_address():
    """
    **El caso que no puede romper nada.**

    El archivo se leyó bien y sus direcciones sirven: descartar el sitemap
    entero por una fecha mal escrita dejaría el sitio sin registrar por un campo
    opcional.
    """
    content = parse(
        sitemap(
            entry('https://ejemplo.test/a', 'ayer a la tarde'),
            entry('https://ejemplo.test/b', '2026-08-25'),
        )
    )

    assert content.locations == ['https://ejemplo.test/a', 'https://ejemplo.test/b']
    assert list(content.last_modified) == ['https://ejemplo.test/b']


def test_lastmod_is_read_whether_it_comes_before_or_after_the_location():
    """El protocolo no fija el orden de los hijos, así que no se puede asumir."""
    content = parse(
        sitemap(
            '<url><lastmod>2026-08-25</lastmod><loc>https://ejemplo.test/a</loc></url>',
            entry('https://ejemplo.test/b', '2026-08-25'),
        )
    )

    assert set(content.last_modified) == {'https://ejemplo.test/a', 'https://ejemplo.test/b'}
