from django.utils.html import avoid_wrapping

from . import registry


def _format_size(bytes, callback):
    bytes = float(bytes)

    KB = 1 << 10
    MB = 1 << 20
    GB = 1 << 30
    TB = 1 << 40
    PB = 1 << 50

    if bytes < KB:
        return callback("", bytes)
    elif bytes < MB:
        return callback("K", bytes / KB)
    elif bytes < GB:
        return callback("M", bytes / MB)
    elif bytes < TB:
        return callback("G", bytes / GB)
    elif bytes < PB:
        return callback("T", bytes / TB)
    else:
        return callback("P", bytes / PB)


@registry.filter
def kbdetailformat(bytes):
    return avoid_wrapping(
        _format_size(
            bytes * 1024, lambda x, y: ["%d %sB", "%.2f %sB"][bool(x)] % (y, x)
        )
    )


@registry.filter
def kbsimpleformat(kb):
    return _format_size(kb * 1024, lambda x, y: "%.0f%s" % (y, x or "B"))
