#!/usr/bin/python3

"""Web page to show upcoming events."""

import inspect
import sys
import traceback
from datetime import date, datetime, timezone

import flask
import werkzeug
import werkzeug.debug.tbtools

from agenda import get_data

app = flask.Flask(__name__)
app.debug = True


@app.errorhandler(werkzeug.exceptions.InternalServerError)
def exception_handler(e: werkzeug.exceptions.InternalServerError) -> tuple[str, int]:
    """Handle exception."""
    exec_type, exc_value, current_traceback = sys.exc_info()
    assert exc_value
    tb = werkzeug.debug.tbtools.DebugTraceback(exc_value)

    summary = tb.render_traceback_html(include_title=False)
    exc_lines = "".join(tb._te.format_exception_only())

    last_frame = list(traceback.walk_tb(current_traceback))[-1][0]
    last_frame_args = inspect.getargs(last_frame.f_code)

    return (
        flask.render_template(
            "show_error.html",
            plaintext=tb.render_traceback_text(),
            exception=exc_lines,
            exception_type=tb._te.exc_type.__name__,
            summary=summary,
            last_frame=last_frame,
            last_frame_args=last_frame_args,
        ),
        500,
    )


@app.route("/")
def index() -> str:
    """Index page."""
    now = datetime.now()
    today = now.date()
    data = get_data(now)
    now_utc = datetime.now(timezone.utc)

    def days_hours(when: datetime) -> str:
        delta = when - (now if when.tzinfo is None else now_utc)
        return f"{delta.days:>5,d} days {delta.seconds // 3600:>2.0f} hours"

    def days(when: date) -> str:
        return "today" if when == today else f"{(when - today).days:,d} days"

    return flask.render_template("index.html", days=days, days_hours=days_hours, **data)


if __name__ == "__main__":
    app.run(host="0.0.0.0")