from django.conf import settings
from django.core.signing import base64_hmac
from django.template.loader import render_to_string
from django.urls import reverse

WIDTHS = {
    "a": 7,
    "b": 7,
    "c": 6,
    "d": 7,
    "e": 6,
    "f": 4,
    "g": 7,
    "h": 7,
    "i": 3,
    "j": 3,
    "k": 7,
    "l": 3,
    "m": 10,
    "n": 7,
    "o": 7,
    "p": 7,
    "q": 7,
    "r": 4,
    "s": 6,
    "t": 5,
    "u": 7,
    "v": 7,
    "w": 9,
    "x": 6,
    "y": 7,
    "z": 7,
    "0": 7,
    "1": 6,
    "2": 7,
    "3": 7,
    "4": 7,
    "5": 7,
    "6": 7,
    "7": 7,
    "8": 7,
    "9": 7,
    "A": 8,
    "B": 7,
    "C": 8,
    "D": 8,
    "E": 7,
    "F": 6,
    "G": 9,
    "H": 8,
    "I": 3,
    "J": 4,
    "K": 7,
    "L": 6,
    "M": 10,
    "N": 8,
    "O": 9,
    "P": 6,
    "Q": 9,
    "R": 7,
    "S": 7,
    "T": 7,
    "U": 8,
    "V": 8,
    "W": 11,
    "X": 7,
    "Y": 7,
    "Z": 7,
    "-": 4,
    "_": 6,
}

COLORS = {"up": "#4c1", "late": "#fe7d37", "down": "#e05d44"}


def get_width(s):
    total = 0
    for c in s:
        total += WIDTHS.get(c, 7)
    return total


def get_badge_svg(tag, status):
    w1 = get_width(tag) + 10
    w2 = get_width(status) + 10
    ctx = {
        "width": w1 + w2,
        "tag_width": w1,
        "status_width": w2,
        "tag_center_x": w1 / 2,
        "status_center_x": w1 + w2 / 2,
        "tag": tag,
        "status": status,
        "color": COLORS[status],
    }

    return render_to_string("badge.svg", ctx)


def check_signature(username, tag, sig):
    ours = base64_hmac(str(username), tag, settings.SECRET_KEY)
    ours = ours[:8]
    return ours == sig


def get_badge_url(username, tag, format="svg"):
    sig = base64_hmac(str(username), tag, settings.SECRET_KEY)

    if tag == "*":
        view = "hc-badge-json-all" if format == "json" else "hc-badge-all"
        url = reverse(view, args=[username, sig[:8]])
    else:
        view = "hc-badge-json" if format == "json" else "hc-badge"
        url = reverse(view, args=[username, sig[:8], tag])

    return settings.SITE_ROOT + url
