import base64

from utils.logger import Log
from http.server import BaseHTTPRequestHandler, HTTPServer


class TransferServer(BaseHTTPRequestHandler):
    """
    Transfer server is an HTTP-server that waits for an incoming SSO token.
    """
    received_token = ''

    def do_GET(self):
        if self.path == '/favicon.ico':
            # Don't serve favicon
            self.send_response(404)
            self.send_header('Content-type', 'text/html')
            self.end_headers()
            return

        TransferServer.received_token = self.path

        # Token recieved
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(("Moodle Downloader - " +
                          "Token was successfully transferred."
                          ).encode('utf-8'))

    def log_message(self, format, *args):
        return


def extract_token(address: str) -> str:
    """
    Extracts a token from a returned URL
    """
    splitted = address.split('token=')

    if (len(splitted) < 2):
        return None

    decoded = str(base64.b64decode(splitted[1]))

    splitted = decoded.split(':::')
    if (len(splitted) < 2):
        return None

    return splitted[1]


def receive_token() -> str:
    """
    Starts an HTTP server to receive the SSO token from browser.
    It waits till a token was received.
    """
    server_address = ('localhost', 80)
    try:
        httpd = HTTPServer(server_address, TransferServer)
    except PermissionError:
        Log.error('Permission denied: Please start the' +
                  ' downloader once with administrator rights, so that it' +
                  ' can wait on port 80 for the token.')
        exit(1)

    extracted_token = None

    while extracted_token is None:
        httpd.handle_request()

        extracted_token = extract_token(TransferServer.received_token)

    httpd.server_close()

    return extracted_token