import tkinter as tk
from tkinter import messagebox
from tkinter import filedialog

class TodoApp:
    def __init__(self, root):
        self.root = root
        root.title("To-Do List")

        # Create the task list
        self.listbox = tk.Listbox(root, width=50)
        self.listbox.pack(pady=10)

        # Create the entry field for new tasks
        self.entry = tk.Entry(root, font=("Arial", 12))
        self.entry.pack(pady=10)

        # Create the buttons
        self.button_frame = tk.Frame(root)
        self.button_frame.pack(pady=10)

        self.add_button = tk.Button(self.button_frame, text="Add Task", command=self.add_task)
        self.add_button.grid(row=0, column=0)

        self.delete_button = tk.Button(self.button_frame, text="Delete Task", command=self.delete_task)
        self.delete_button.grid(row=0, column=1)

        self.complete_button = tk.Button(self.button_frame, text="Complete Task", command=self.complete_task)
        self.complete_button.grid(row=0, column=2)

        self.save_button = tk.Button(root, text="Save Tasks", command=self.save_tasks)
        self.save_button.pack(pady=10)

        # Create the sort buttons
        self.sort_frame = tk.Frame(root)
        self.sort_frame.pack(pady=10)

        self.sort_label = tk.Label(self.sort_frame, text="Sort by:")
        self.sort_label.grid(row=0, column=0)

        self.priority_button = tk.Button(self.sort_frame, text="Priority", command=self.sort_by_priority)
        self.priority_button.grid(row=0, column=1)

        self.load_tasks()

    def add_task(self):
        task = self.entry.get()
        if task:
            self.listbox.insert(tk.END, (task, False))  # Add a tuple (task, completed)
            self.entry.delete(0, tk.END)
        else:
            messagebox.showwarning("Warning", "Please enter a task.")

    def delete_task(self):
        try:
            index = self.listbox.curselection()
            self.listbox.delete(index)
        except:
            messagebox.showwarning("Warning", "Please select a task to delete.")

    def complete_task(self):
        try:
            index = self.listbox.curselection()
            task, completed = self.listbox.get(index)
            self.listbox.delete(index)
            self.listbox.insert(index, (task, not completed))
            if not completed:
                self.listbox.itemconfig(index, fg="gray", bg="light green")
            else:
                self.listbox.itemconfig(index, fg="black", bg="white")
        except:
            messagebox.showwarning("Warning", "Please select a task to mark as completed.")

    def save_tasks(self):
        tasks = self.listbox.get(0, tk.END)
        file_path = filedialog.asksaveasfilename(defaultextension=".txt")
        if file_path:
            with open(file_path, "w") as file:
                for task, completed in tasks:
                    file.write(f"{task},{completed}\n")

    def sort_by_priority(self):
        tasks = list(self.listbox.get(0, tk.END))
        tasks.sort(key=lambda x: x[0].split(" ")[-1].lower())  # Sort by last word in task (assumed to be priority)
        self.listbox.delete(0, tk.END)
        for task in tasks:
            self.listbox.insert(tk.END, task)

    def load_tasks(self):
        file_path = filedialog.askopenfilename(defaultextension=".txt")
        if file_path:
            with open(file_path, "r") as file:
                for line in file:
                    task, completed = line.strip().split(",")
                    completed = completed == "True"
                    self.listbox.insert(tk.END, (task, completed))
                    if completed:
                        self.listbox.itemconfig(tk.END, fg="gray", bg="light green")

if __name__ == "__main__":
    root = tk.Tk()
    todo_app = TodoApp(root)
    root.mainloop()