from typing import Any, Dict, Tuple, Union

import urllib.parse

from matemat.exceptions import AuthenticationError, HttpException
from matemat.webserver import pagelet, RequestArguments, PageletResponse, RedirectResponse, TemplateResponse
from matemat.primitives import User
from matemat.db import MatematDatabase


@pagelet('/touchkey')
def touchkey_page(method: str,
                  path: str,
                  args: RequestArguments,
                  session_vars: Dict[str, Any],
                  headers: Dict[str, str],
                  config: Dict[str, str])\
        -> Union[bytes, str, PageletResponse]:
    if 'user' in session_vars:
        return RedirectResponse('/')
    if method == 'GET':
        return TemplateResponse('touchkey.html',
                                username=str(args.username) if 'username' in args else None,
                                setupname=config['InstanceName'])
    elif method == 'POST':
        with MatematDatabase(config['DatabaseFile']) as db:
            try:
                user: User = db.login(str(args.username), touchkey=str(args.touchkey))
            except AuthenticationError:
                quoted = urllib.parse.quote_plus(bytes(args.username))
                return RedirectResponse(f'/touchkey?username={quoted}')
            session_vars['user'] = user
        return RedirectResponse('/')
    raise HttpException(405)