#!/usr/bin/env python3

import asyncio
import threading
import tkinter as tk
from datetime import datetime
from random import randint

import faker


class Application(tk.Frame):
    """main frame"""

    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()

        word_generator = faker.Faker()
        words = word_generator.words(5)
        self.messages = [(randint(0, 5), word) for word in words]
        print(self.messages)

        self.add_async_process()

    def add_async_process(self):
        """Add button to start the action
        """
        self.btn = tk.Button(self, text="Big button", command=self.action)
        self.btn.pack()

    def action(self):
        """initialize threading"""
        threading.Thread(target=self.run).start()

    def run(self):
        """start asyncio loop"""
        asyncio.run(self.async_process())

    async def async_process(self):
        self.start_time = datetime.now()
        self.new_area = tk.Button(
            self,
            text="\n".join(
                "\t".join((str(delay), message)) for delay, message in self.messages
            ),
        )
        self.new_area.pack()
        tasks = [
            asyncio.create_task(self.display_after(delay, what))
            for delay, what in self.messages
        ]
        done, pending = await asyncio.wait(tasks)

    async def display_after(self, delay, what):
        await asyncio.sleep(delay)
        now = datetime.now()
        msg = f"{now} \t {what}"
        parent = tk.Toplevel(self.master)
        EmptyFrame(parent, msg)


class EmptyFrame(tk.Frame):
    def __init__(self, parent, message):
        super().__init__(parent)
        self.root = parent
        self.message = message
        self.create_entry()
        self.pack()

    def create_entry(self):
        self.area = tk.Button(self, text=self.message)
        print("Message: ", self.message)
        self.area.pack()


if __name__ == "__main__":
    root = tk.Tk()
    app = Application(master=root)
    app.mainloop()
