from tkinter import *
from tkinter import messagebox
import datetime


class TodoList:
    def __init__(self, root):
        self.root = root
        self.root.title("To-Do List")
        self.root.geometry("400x400")
        
        self.tasks = []
        
        self.task_label = Label(root, text="Task:")
        self.task_label.pack()
        
        self.task_entry = Entry(root, width=30)
        self.task_entry.pack()
        
        self.add_button = Button(root, text="Add Task", command=self.add_task)
        self.add_button.pack()
        
        self.task_listbox = Listbox(root, width=50)
        self.task_listbox.pack()
        
        self.complete_button = Button(root, text="Mark as Complete", command=self.mark_as_complete)
        self.complete_button.pack()
        
        self.remove_button = Button(root, text="Remove Task", command=self.remove_task)
        self.remove_button.pack()
        
        self.sort_button = Button(root, text="Sort by Priority", command=self.sort_by_priority)
        self.sort_button.pack()
        
        self.save_button = Button(root, text="Save Tasks", command=self.save_tasks)
        self.save_button.pack()
        
        self.load_button = Button(root, text="Load Tasks", command=self.load_tasks)
        self.load_button.pack()
        
        self.load_tasks()
        
    def add_task(self):
        task = self.task_entry.get()
        if task:
            self.tasks.append({"task": task, "completed": False, "timestamp": datetime.datetime.now()})
            self.update_task_listbox()
            self.task_entry.delete(0, END)
        else:
            messagebox.showwarning("Warning", "Please enter a task.")
        
    def update_task_listbox(self):
        self.task_listbox.delete(0, END)
        for task in self.tasks:
            task_text = task["task"]
            if task["completed"]:
                task_text += " (Completed)"
            self.task_listbox.insert(END, task_text)
        
    def mark_as_complete(self):
        selected_task_index = self.task_listbox.curselection()
        if selected_task_index:
            task = self.tasks[selected_task_index[0]]
            task["completed"] = not task["completed"]
            self.update_task_listbox()
        
    def remove_task(self):
        selected_task_index = self.task_listbox.curselection()
        if selected_task_index:
            self.tasks.pop(selected_task_index[0])
            self.update_task_listbox()
        
    def sort_by_priority(self):
        self.tasks.sort(key=lambda x: x["completed"])
        self.update_task_listbox()
        
    def save_tasks(self):
        with open("tasks.txt", "w") as file:
            for task in self.tasks:
                file.write(f"{task['task']},{task['completed']},{task['timestamp']}\n")
        messagebox.showinfo("Save", "Tasks saved successfully.")
        
    def load_tasks(self):
        try:
            with open("tasks.txt", "r") as file:
                lines = file.readlines()
                self.tasks = []
                for line in lines:
                    task, completed, timestamp = line.split(",")
                    self.tasks.append({"task": task, "completed": completed == "True", "timestamp": datetime.datetime.fromisoformat(timestamp.strip())})
                self.update_task_listbox()
        except FileNotFoundError:
            messagebox.showwarning("File Not Found", "No saved tasks found.")


root = Tk()
todo_list = TodoList(root)
root.mainloop()

