import re

from django import template
from django.template.defaultfilters import urlize
from django.utils.safestring import mark_safe

register = template.Library()


def _external_links(html):
    return re.sub(r'<a ', '<a target="_blank" rel="noopener noreferrer" ', str(html))


def _linkify_plain_text(value):
    return _external_links(urlize(value, autoescape=True))


@register.filter
def linkify(value):
    """Turn plain-text URLs into clickable external links."""
    if not value:
        return ''
    return mark_safe(_linkify_plain_text(value))


@register.filter
def linkify_br(value):
    """Linkify URLs and preserve line breaks."""
    if not value:
        return ''
    normalized = str(value).replace('\r\n', '\n').replace('\r', '\n')
    linked = _linkify_plain_text(normalized)
    return mark_safe(str(linked).replace('\n', '<br />'))


@register.filter
def job_html(value):
    """Structured, safe HTML for a plain-text job description."""
    from jobs.formatting import format_job_text

    return format_job_text(value)[0]


@register.simple_tag
def job_outline(value):
    """List of (anchor, title) headings found in a description; used for a jump list on long ads."""
    from jobs.formatting import format_job_text

    return format_job_text(value)[1]
