import tkinter as tk
from tkinter import messagebox
import datetime

class TodoApp:
    def __init__(self, master):
        self.master = master
        master.title("To-Do List App")
        master.configure(bg='black')

        self.tasks = []

        self.label = tk.Label(master, text="Task:", bg='black', fg='white', font=('Helvetica', 12))
        self.label.grid(row=0, column=0)

        self.entry = tk.Entry(master)
        self.entry.grid(row=0, column=1)

        self.add_button = tk.Button(master, text="Add Task", command=self.add_task, bg='navy', fg='white', font=('Helvetica', 10, 'bold'))
        self.add_button.grid(row=0, column=2)

        self.task_list = tk.Listbox(master, bg='black', fg='white', font=('Helvetica', 12))
        self.task_list.grid(row=1, column=0, columnspan=3, padx=10, pady=10)

        self.remove_button = tk.Button(master, text="Remove Task", command=self.remove_task, bg='navy', fg='white', font=('Helvetica', 10, 'bold'))
        self.remove_button.grid(row=2, column=0)

        self.complete_button = tk.Button(master, text="Mark as Completed", command=self.complete_task, bg='navy', fg='white', font=('Helvetica', 10, 'bold'))
        self.complete_button.grid(row=2, column=1)

        self.save_button = tk.Button(master, text="Save Tasks", command=self.save_tasks, bg='navy', fg='white', font=('Helvetica', 10, 'bold'))
        self.save_button.grid(row=2, column=2)

        self.load_tasks()

    def add_task(self):
        task = self.entry.get()
        if task:
            self.tasks.append({"task": task, "completed": False})
            self.update_task_list()
            self.entry.delete(0, tk.END)

    def remove_task(self):
        try:
            selected_index = self.task_list.curselection()[0]
            del self.tasks[selected_index]
            self.update_task_list()
        except IndexError:
            messagebox.showinfo("Error", "Please select a task to remove.")

    def complete_task(self):
        try:
            selected_index = self.task_list.curselection()[0]
            self.tasks[selected_index]["completed"] = True
            self.update_task_list()
        except IndexError:
            messagebox.showinfo("Error", "Please select a task to mark as completed.")

    def update_task_list(self):
        self.task_list.delete(0, tk.END)
        for task in self.tasks:
            if task["completed"]:
                self.task_list.insert(tk.END, "✔ " + task["task"])
            else:
                self.task_list.insert(tk.END, task["task"])

    def save_tasks(self):
        with open("tasks.txt", "w") as file:
            for task in self.tasks:
                file.write(task["task"] + "|" + str(task["completed"]) + "\n")

    def load_tasks(self):
        try:
            with open("tasks.txt", "r") as file:
                for line in file:
                    task, completed = line.strip().split("|")
                    self.tasks.append({"task": task, "completed": eval(completed)})
            self.update_task_list()
        except FileNotFoundError:
            pass

def main():
    root = tk.Tk()
    app = TodoApp(root)
    root.mainloop()

if __name__ == "__main__":
    main()