from app import app
import flask
from datetime import datetime
import markdown
from markupsafe import Markup
from urllib.parse import urlencode


@app.template_global()
def modify_query(**new_values):
    args = flask.request.args.copy()

    for key, value in new_values.items():
        args[key] = value

    return f"{flask.request.path}?{urlencode(args)}"


@app.template_filter("split")
def split(value: str, separator=" ", maxsplit: int = -1):
    return value.split(separator, maxsplit)


@app.template_filter("splitlines")
def splitlines(value: str, keepends: bool = False):
    return value.splitlines(keepends=keepends)


@app.template_filter("lstrip")
def lstrip(value: str, characters=None):
    return value.lstrip(characters)


@app.template_filter("rstrip")
def rstrip(value: str, characters=None):
    return value.rstrip(characters)


@app.template_filter("strftime")
def strftime(value: datetime, syntax: str):
    return value.strftime(syntax)


@app.template_filter("unixtime")
def unixtime(value: datetime):
    return round(value.timestamp())


@app.template_filter("decode")
def decode(value: bytes, codec: str = "UTF-8", errors: str = "strict"):
    return value.decode(codec, errors)


@app.template_filter("markdown")
def parse_markdown(value: str):
    return Markup(markdown.make_html(markdown.tokenise(value)))


@app.template_filter("inline_markdown")
def parse_inline_markdown(value: str):
    return Markup(markdown.make_html(markdown.parse_line(value)))


@app.template_filter("parse_diff_location")
def parse_diff_location(value: str):
    header = value.split("@@")[1].strip()
    return [tuple(int(j) for j in i.lstrip("-+").split(",")) for i in header.split(" ")]


@app.template_filter("harvester_protection")
def harvester_protection(value):
    return "".join(f"&#x{ord(char):x};" for char in value)


@app.template_filter("sort")
def sort(value):
    return sorted(value)
