"""
Custom template filters for inventory app.
"""
from django import template
from decimal import Decimal

register = template.Library()


@register.filter(name='smart_quantity')
def smart_quantity(value):
    """
    Форматирует количество товара:
    - Если число целое (например 5.0, 10.000), показывает без дробной части: 5, 10
    - Если число дробное (например 2.5, 3.125), убирает лишние нули: 2,5 вместо 2,500

    Примеры:
        5.000 -> 5
        2.500 -> 2,5
        3.140 -> 3,14
        10.0 -> 10

    Args:
        value: число (int, float, Decimal или строка)

    Returns:
        str: отформатированное количество
    """
    if value is None:
        return ''

    try:
        # Преобразуем в Decimal для точности
        if isinstance(value, str):
            num = Decimal(value)
        elif isinstance(value, (int, float)):
            num = Decimal(str(value))
        elif isinstance(value, Decimal):
            num = value
        else:
            return str(value)

        # Проверяем, является ли число целым
        if num == num.to_integral_value():
            # Возвращаем как целое число
            return f"{int(num)}"
        else:
            # Убираем лишние нули справа и форматируем с запятой
            # Используем normalize() для удаления лишних нулей
            normalized = num.normalize()
            # Форматируем с запятой вместо точки (русский формат)
            result = str(normalized).replace('.', ',')
            return result

    except (ValueError, TypeError, ArithmeticError):
        # Если не удалось преобразовать, возвращаем как есть
        return str(value)


@register.filter(name='format_decimal')
def format_decimal(value, decimal_places=2):
    """
    Форматирует decimal число с заданным количеством знаков после запятой.
    Убирает лишние нули справа.

    Args:
        value: число для форматирования
        decimal_places: максимальное количество знаков после запятой

    Returns:
        str: отформатированное число
    """
    if value is None:
        return ''

    try:
        if isinstance(value, str):
            num = Decimal(value)
        elif isinstance(value, (int, float)):
            num = Decimal(str(value))
        elif isinstance(value, Decimal):
            num = value
        else:
            return str(value)

        # Округляем до заданного количества знаков
        quantize_value = Decimal(10) ** -decimal_places
        rounded = num.quantize(quantize_value)

        # Форматируем без научной нотации
        result = format(rounded, 'f')

        # Убираем лишние нули справа после десятичной точки
        if '.' in result:
            result = result.rstrip('0').rstrip('.')

        # Форматируем с запятой вместо точки
        result = result.replace('.', ',')
        return result

    except (ValueError, TypeError, ArithmeticError):
        return str(value)


@register.filter(name='multiply')
def multiply(value, arg):
    """
    Умножает значение на аргумент.

    Использование в шаблонах:
        {{ quantity|multiply:price }}

    Args:
        value: первое число
        arg: второе число (множитель)

    Returns:
        Decimal: результат умножения
    """
    try:
        if value is None or arg is None:
            return 0

        # Преобразуем в Decimal для точности
        if isinstance(value, str):
            val = Decimal(value)
        elif isinstance(value, (int, float)):
            val = Decimal(str(value))
        elif isinstance(value, Decimal):
            val = value
        else:
            val = Decimal(str(value))

        if isinstance(arg, str):
            multiplier = Decimal(arg)
        elif isinstance(arg, (int, float)):
            multiplier = Decimal(str(arg))
        elif isinstance(arg, Decimal):
            multiplier = arg
        else:
            multiplier = Decimal(str(arg))

        return val * multiplier

    except (ValueError, TypeError, ArithmeticError):
        return 0
