# exams/templatetags/math_tags.py
from django import template

register = template.Library()


@register.filter
def safe_pct(numerator, denominator):
    """ 
    Returns (numerator/denominator*100) formatted to 1 decimal place.
    Avoids divide-by-zero errors.
    """
    try:
        numerator = float(numerator)
        denominator = float(denominator)

        if denominator == 0:
            return "0.0"

        return f"{(numerator / denominator) * 100:.1f}"
    except:
        return "0.0"

@register.filter
def multiply(value, arg):
    """Multiply the value by the argument"""
    try:
        return int(value) * int(arg)
    except (ValueError, TypeError):
        return 0

@register.filter
def remainder(value, arg):
    """Return the remainder of value divided by arg"""
    try:
        return int(value) % int(arg)
    except (ValueError, TypeError, ZeroDivisionError):
        return 0

@register.filter
def index(sequence, position):
    """Return the element at a given position in a sequence"""
    try:
        return sequence[position]
    except (IndexError, TypeError, KeyError):
        return None
        
@register.filter
def add(value, arg):
    """Same as built-in add, but works for None."""
    try:
        value = float(value or 0)
        arg = float(arg or 0)
        return value + arg
    except:
        return 0


# In your templatetags file (e.g., report_extras.py)
from django import template

register = template.Library()

@register.filter
def sum_attribute(queryset, attribute):
    """Sum a specific attribute across a queryset"""
    return sum(getattr(item, attribute, 0) or getattr(item, attribute, 0) for item in queryset)

@register.filter
def avg_attribute(queryset, attribute):
    """Calculate average of a specific attribute across a queryset"""
    values = [getattr(item, attribute, 0) or getattr(item, attribute, 0) for item in queryset]
    if values:
        return sum(values) / len(values)
    return 0