from __future__ import annotations

import json
from decimal import Decimal

from django import template
from django.utils.safestring import mark_safe

register = template.Library()


@register.filter
def tojson(value):
    """Small compatibility shim for legacy Jinja templates."""
    return mark_safe(json.dumps(value, ensure_ascii=False, default=str))


@register.filter
def dict_get(mapping, key):
    if mapping is None:
        return None
    try:
        return mapping.get(key)
    except Exception:
        try:
            return mapping[key]
        except Exception:
            return None


@register.filter
def printf(value, fmt: str):
    """
    Minimal printf-style formatting for legacy patterns like '%.1f'|printf:x.
    """
    if value is None:
        return ""
    try:
        if isinstance(value, Decimal):
            value = float(value)
        return fmt % value
    except Exception:
        return str(value)


@register.filter
def sub(value, arg):
    try:
        return int(value) - int(arg)
    except (TypeError, ValueError):
        return 0


@register.filter
def contains(container, item) -> bool:
    """
    Template-safe membership test.
    Usage: {% if my_list|contains:x %} ... {% endif %}
    """
    if container is None:
        return False
    try:
        return item in container
    except Exception:
        return False


@register.simple_tag
def extraction_value(article, field) -> str:
    from rsl.services.extraction_prefill import extraction_display_value

    return extraction_display_value(article, field)

