"""Convierte un run de texto de python-pptx en un hyperlink interno "ir a la diapositiva".

python-pptx expone ``run.hyperlink.address`` para URLs externas, pero NO ofrece una
API pública para saltar a otra diapositiva del mismo deck. Esta función crea ese salto
interno manipulando el XML: añade una relación ``slide -> slide`` y un
``<a:hlinkClick>`` con la acción ``ppaction://hlinksldjump`` en el run, de modo que al
pulsar el texto en PowerPoint (o en visores que respetan esa acción) se navega a la
diapositiva de destino.
"""

from pptx.opc.constants import RELATIONSHIP_TYPE as RT
from pptx.oxml.ns import qn


def pptx_link_run_to_slide(run, source_slide, target_slide) -> bool:
    """Convierte un run de texto en un hyperlink interno "ir a la diapositiva".

    Añade una relación ``slide -> slide`` desde la slide origen al part de la slide
    destino y crea un ``<a:hlinkClick>`` con ``action="ppaction://hlinksldjump"`` como
    primer hijo del ``<a:rPr>`` del run (orden válido del schema
    ``CT_TextCharacterProperties``). La operación es idempotente: un ``hlinkClick``
    previo en el mismo run se elimina antes de insertar el nuevo.

    Args:
        run: el ``pptx.text.text._Run`` cuyo texto se vuelve clicable.
        source_slide: la ``Slide`` que contiene el run.
        target_slide: la ``Slide`` de destino del salto.

    Returns:
        True si se aplicó el hyperlink; False si algo impidió aplicarlo (no lanza).
    """
    try:
        rId = source_slide.part.relate_to(target_slide.part, RT.SLIDE)
        rPr = run._r.get_or_add_rPr()
        # Elimina un hlinkClick previo si lo hubiera (idempotente).
        for existing in rPr.findall(qn("a:hlinkClick")):
            rPr.remove(existing)
        hlink = rPr.makeelement(
            qn("a:hlinkClick"),
            {
                qn("r:id"): rId,
                "action": "ppaction://hlinksldjump",
            },
        )
        # a:hlinkClick debe ir como primer hijo de rPr
        # (orden del schema CT_TextCharacterProperties).
        rPr.insert(0, hlink)
        return True
    except Exception:
        return False
