#!/usr/bin/env python3

import sys
import os
import time
import subprocess
import io
import qrcode

umbrel_ascii = '''
              ,;###GGGGGGGGGGl#Sp
           ,##GGGlW""^'  '`""%GGGG#S,
         ,#GGG"                  "lGG#o
        #GGl^                      '$GG#
      ,#GGb                          \GGG,
      lGG"                            "GGG
     #GGGlGGGl##p,,p##lGGl##p,,p###ll##GGGG
    !GGGlW"""*GGGGGGG#""""WlGGGGG#W""*WGGGGS
     ""          "^          '"          ""


                @GGS         lG#
                !GGG        !GGG
                !GGG        !GGG
                !GGG        !GGG
                !GGG        !GGG
                !GGG        !GGG
                'GGG        $GGl
                 "GGG#psqp##GG#
                   "%GGGGGG#"
'''.strip('\n')

def create_qr(data):
    output_buffer = io.TextIOWrapper(io.BytesIO(), sys.stdout.encoding)

    qr = qrcode.QRCode(border=0, error_correction=qrcode.constants.ERROR_CORRECT_Q)
    qr.add_data(data)
    qr.print_ascii(out=output_buffer)

    output_buffer.seek(0)
    qr_ascii = output_buffer.read().strip()

    return qr_ascii

def combine_ascii(left_ascii, right_ascii, spacing=0):
    left_lines = left_ascii.split('\n')
    right_lines = right_ascii.split('\n')

    no_left_lines = len(left_lines)
    no_right_lines = len(right_lines)

    left_width = max(list(map(lambda line: len(line), left_lines)))
    max_height = max(no_left_lines, no_right_lines)

    lines = []
    for i in range(max_height):
        left_line = left_lines[i] if i < no_left_lines else ""
        right_line = right_lines[i] if i < no_right_lines else ""

        padding = " " * ((left_width - len(left_line)) + spacing)

        lines.append(left_line + padding + right_line)

    return "\n".join(lines)

def read_file_when_available(file_path, timeout):
    start = time.time()
    while not os.path.exists(file_path):
        if (time.time() - start) > timeout:
            return False
        time.sleep(1)

    with open(file_path, "r") as file:
        file_contents = file.read()

    return file_contents

def run(command):
    result = subprocess.run(command, stdout=subprocess.PIPE)
    return result.stdout.decode('utf-8').rstrip("\n")

def main():
    timeout = 30
    tor_hostname_file = "/home/umbrel/umbrel/tor/data/web/hostname"
    tor_hostname = read_file_when_available(tor_hostname_file, timeout)

    ip = run(['hostname', '-I']).split(" ")[0]

    if not tor_hostname or not ip:
        print("Couldn't get connection details")
        return

    tor_hostname_qr_ascii = create_qr(tor_hostname.strip())
    ascii_banner = combine_ascii(umbrel_ascii, tor_hostname_qr_ascii, spacing=10)

    connection_details = f"""


{ascii_banner}

    Your Umbrel is up and running at:

        http://umbrel.local
        http://{ip}
        http://{tor_hostname}
    """
    print(connection_details)

main()
