#!/usr/bin/env python3

import os
import tkinter as tk
from tkinter import ttk, StringVar
from tkinter.messagebox import showinfo, showwarning
from datetime import datetime
from PIL import Image, ImageTk

now = datetime.now()
YEAR = now.strftime("%Y")
MONTH = now.strftime("%m")
DAY = now.strftime("%d")
journal_filename = "%s-%s-%s-Journal.txt" % (YEAR, MONTH, DAY)

# Determine journal file path
journal_filename_path = "./%s" % journal_filename

# Create the file if it doesn't exist
if os.path.exists(journal_filename_path):
    with open(journal_filename_path, "a", encoding="utf-8"):
        pass
else:
    with open(journal_filename_path, "w", encoding="utf-8"):
        pass

# Initialize main window
journal_root = tk.Tk()

# Set fullscreen dimensions and background image
image_location = 'background.jpg'
width = journal_root.winfo_screenwidth()
height = journal_root.winfo_screenheight()
journal_root.geometry("%dx%d" % (width, height))
journal_root.title("Ameland Kinderjournal")

img = ImageTk.PhotoImage(Image.open(image_location).resize((width, height), Image.ADAPTIVE))
label = tk.Label(journal_root, image=img)
label.img = img  # Keep a reference
label.place(relx=0.5, rely=0.5, anchor='center')

# Store name and message
name = tk.StringVar()
message = tk.StringVar()

# Create main journal frame
journal = ttk.Frame(journal_root)
journal.pack(pady=100, side=tk.TOP)

# Name input
name_label = ttk.Label(journal, text="Dein Name mit Nachname:")
name_label.grid(sticky='w', column=0, row=0, padx=5, pady=5)
name_entry = ttk.Entry(journal, textvariable=name, width=65)
name_entry.grid(sticky='e', column=0, row=0, padx=100, pady=5)
name_entry.focus()

# Textbox height
textbox_height: int = 40
if height > 1080:
    textbox_height = height - 1400

# Message input
message_label = tk.Label(journal, text="Deine Nachricht:")
message_label.grid(column=0, row=1, sticky='w', padx=5)
message_text = tk.Text(journal, height=textbox_height)
message_text.grid(column=0, row=2, padx=5)

# List of swear-words we need to check against
swear_words = [
    "mistkerl", "mistkerle", "mistkerl*", "mist kerl", "mister kerl",
    "arsch",
    "hure", "hurensohn", "huso", "h*****sohn",
    "Sex", "S**",
    "ficken", "firken", "fi***en",
    "bumsen", "bomsen", "b*msen", "bu*sen",
    "fotze", "schlampe", "bitch",
    "arschloch", "arschl***", "arsch loch", "arsch-loch", "arschloch*",
    "depp", "deppen", "depp*", "deppchen", "depp!",
    "idiot", "idioten", "id***", "idioot", "idot",
    "trottel", "trottel*", "trottelchen", "trottel-", "trottl",
    "dummkopf", "dummköpfe", "dummkopf*", "dumm-kopf", "dummkopf-",
    "blödmann", "blödmänner", "bloeddman", "bloeddmänner"
]
# Function to check message validity
# validity consists of:
## 1. not more than 1000 Characters message length
## 2. no words from the bad-words-list contained
def is_message_valid():
    current_message = message_text.get("1.0", "end-1c")

    # ceck for message length
    if len(current_message) > 1000:
        showwarning("Warnung", "Deine Nachricht ist zu lang, bitte beschränke Dich auf 1000 Zeichen")
        message_text.focus_set()
        return False

    # check for bad words case-insenstive (by making everything lower-case for the check)
    if not set(word.lower() for word in current_message.split()).isdisjoint(swear_words):
        showwarning("Warnung", "Deine Nachricht enthält fragwürdige Wörter - so können wir den Text nicht übernehmen.")
        message_text.focus_set()
        return False

    return True

# Send button action
def send_button_clicked():
    if not is_message_valid():
        return
    with open(journal_filename_path, "a", encoding="utf-8") as journal_of_the_day:
        journal_of_the_day.write("Eintrag von: " + name.get() + " um " + datetime.now().strftime("%Y-%m-%d %H:%M:%S") + "\n")
        journal_of_the_day.write(message_text.get(1.0, "end-1c") + "\n")
        journal_of_the_day.write("-----------------\n")
        message_text.delete('1.0', "end-1c")
        name.set("")
        showinfo(title="Information", message="Deine Nachricht wurde gespeichert")

# Save and quit action
def save_and_quit_button_clicked():
    if not is_message_valid():
        return
    with open(journal_filename_path, "a", encoding="utf-8") as journal_of_the_day:
        journal_of_the_day.write(name.get() + "\n")
        journal_of_the_day.write(message_text.get(1.0, "end-1c") + "\n")
        journal_of_the_day.write("-----------------\n")
        if not name.get():
            journal_of_the_day.write("Speichern und Beenden von: " + "<noname>" + " um " + datetime.now().strftime("%Y-%m-%d %H:%M:%S") + "\n")
        else:
            journal_of_the_day.write("Speichern und Beenden von: " + name.get() + " um " + datetime.now().strftime("%Y-%m-%d %H:%M:%S") + "\n")
        journal_root.quit()

# Send Button
button_send = ttk.Button(
    journal,
    text="Speichern und Abschicken",
    command=send_button_clicked
)
button_send.grid(sticky='w', column=0, row=3, ipady=8, padx=5, pady=5)

# Quit Button
button_quit = ttk.Button(
    journal,
    text="Beenden",
    command=save_and_quit_button_clicked
)
button_quit.grid(sticky='e', column=0, row=3, ipady=8, padx=5, pady=5)

# Start application
journal_root.mainloop()
