# Konfigurace Jinjových šablon a pomocné funkce

from flask import url_for
import json
from html import escape
from markupsafe import Markup
from typing import Any
import urllib.parse

import mo.config as config
import mo.db as db
import mo.util_format as util_format
from mo.web import app
from mo.web.org_contest import contest_breadcrumbs
from mo.web.org_place import place_breadcrumbs
from mo.web.util import user_html_flags

# Konfigurace Jinjy

app.jinja_options['extensions'].append('jinja2.ext.do')
app.jinja_env.lstrip_blocks = True
app.jinja_env.trim_blocks = True

# Filtry definované v mo.util_format

app.jinja_env.filters.update(timeformat=util_format.timeformat)
app.jinja_env.filters.update(timeformat_short=util_format.timeformat_short)
app.jinja_env.filters.update(inflected=util_format.inflect_number)
app.jinja_env.filters.update(inflected_by=util_format.inflect_by_number)
app.jinja_env.filters.update(timedelta=util_format.timedelta)
app.jinja_env.filters.update(time_and_timedelta=util_format.time_and_timedelta)
app.jinja_env.filters.update(data_size=util_format.data_size)
app.jinja_env.filters.update(decimal=util_format.format_decimal)

# Exporty proměnných

app.jinja_env.globals.update(web_flavor=config.WEB_FLAVOR)

# Export enumů z mo.db:
app.jinja_env.globals.update(RoundState=db.RoundState)
app.jinja_env.globals.update(LogType=db.LogType)
app.jinja_env.globals.update(PartState=db.PartState)
app.jinja_env.globals.update(RoleType=db.RoleType)
app.jinja_env.globals.update(PaperType=db.PaperType)
app.jinja_env.globals.update(JobType=db.JobType)
app.jinja_env.globals.update(JobState=db.JobState)

# Další typy:
app.jinja_env.globals.update(Markup=Markup)

# Vlastní pomocné funkce

app.jinja_env.globals.update(contest_breadcrumbs=contest_breadcrumbs)
app.jinja_env.globals.update(place_breadcrumbs=place_breadcrumbs)
# Funkce asset_url se přidává v mo.ext.assets


@app.template_filter()
def user_link(u: db.User) -> Markup:
    return Markup('<a href="{url}">{name}{test}</a>').format(url=user_url(u), name=u.full_name(), test=" (test)" if u.is_test else "")


def user_url(u: db.User) -> str:
    if u.is_admin or u.is_org:
        return url_for('org_org', id=u.user_id)
    else:
        return url_for('org_user', id=u.user_id)


@app.template_filter()
def pion_link(u: db.User, contest_id: int) -> Markup:
    url = url_for('org_contest_user', contest_id=contest_id, user_id=u.user_id)
    return Markup('<a href="{url}">{name}{test}</a>').format(url=url, name=u.full_name(), test=" (test)" if u.is_test else "")


@app.template_filter()
def mailto(email: str) -> Markup:
    safe_email = urllib.parse.quote(email, safe='@')
    return Markup(f'<a href="mailto:{escape(safe_email)}">{escape(email)}</a>')


@app.template_filter()
def or_dash(s: Any) -> str:
    return str(s) if s else '–'


@app.template_filter()
def none_value(s: Any, none_value: Any) -> Any:
    return none_value if s is None else s


@app.template_filter()
def yes_no(a: bool) -> str:
    return "ano" if a else "ne"


@app.template_filter()
def jsescape(js: Any) -> str:
    return Markup(json_pretty(js))


@app.template_filter()
def json_pretty(js: Any) -> str:
    return json.dumps(js, sort_keys=True, indent=4, ensure_ascii=False)


@app.template_global()
def log_url(typ: str, id: int) -> str:
    return url_for('org_log', typ=typ, id=id)

@app.template_filter()
def user_flags(u: db.User) -> Markup:
    return user_html_flags(u)