import tkinter as tk
from tkinter import messagebox
import json

class NoteTakingApp:
    def __init__(self, root):
        self.root = root
        self.root.title("Note Taking App")
        self.notes = {}
        self.current_note = None

        # Load notes from file
        self.load_notes()

        # Widgets
        self.title_label = tk.Label(root, text="Note Title:")
        self.title_label.grid(row=0, column=0, sticky="w")

        self.title_entry = tk.Entry(root)
        self.title_entry.grid(row=0, column=1, sticky="ew")

        self.content_label = tk.Label(root, text="Note Content:")
        self.content_label.grid(row=1, column=0, sticky="w")

        self.content_text = tk.Text(root, height=10, wrap="word")
        self.content_text.grid(row=1, column=1, sticky="ew")

        self.note_listbox = tk.Listbox(root, height=10)
        self.note_listbox.grid(row=2, column=0, columnspan=2, sticky="nsew")

        self.scrollbar = tk.Scrollbar(root, orient="vertical", command=self.note_listbox.yview)
        self.scrollbar.grid(row=2, column=2, sticky="ns")
        self.note_listbox.config(yscrollcommand=self.scrollbar.set)

        self.search_entry = tk.Entry(root)
        self.search_entry.grid(row=3, column=0, columnspan=2, sticky="ew")
        self.search_entry.bind("<KeyRelease>", self.search_notes)

        self.create_button = tk.Button(root, text="Create Note", command=self.create_note)
        self.create_button.grid(row=4, column=0, sticky="ew")

        self.save_button = tk.Button(root, text="Save Note", command=self.save_note)
        self.save_button.grid(row=4, column=1, sticky="ew")

        self.delete_button = tk.Button(root, text="Delete Note", command=self.delete_note)
        self.delete_button.grid(row=5, column=0, sticky="ew")

        self.note_listbox.bind("<<ListboxSelect>>", self.load_selected_note)

        self.populate_note_list()

    def populate_note_list(self):
        self.note_listbox.delete(0, tk.END)
        for title in self.notes:
            self.note_listbox.insert(tk.END, title)

    def load_selected_note(self, event):
        try:
            index = self.note_listbox.curselection()[0]
            title = self.note_listbox.get(index)
            self.title_entry.delete(0, tk.END)
            self.title_entry.insert(tk.END, title)
            self.content_text.delete(1.0, tk.END)
            self.content_text.insert(tk.END, self.notes[title])
            self.current_note = title
        except IndexError:
            pass

    def create_note(self):
        title = self.title_entry.get()
        content = self.content_text.get(1.0, tk.END)
        if title.strip() != "":
            self.notes[title] = content
            self.populate_note_list()
            self.save_notes()
            self.clear_fields()

    def save_note(self):
        if self.current_note:
            title = self.title_entry.get()
            content = self.content_text.get(1.0, tk.END)
            self.notes[title] = content
            self.populate_note_list()
            self.save_notes()

    def delete_note(self):
        if self.current_note:
            del self.notes[self.current_note]
            self.populate_note_list()
            self.save_notes()
            self.clear_fields()

    def search_notes(self, event):
        query = self.search_entry.get().lower()
        self.note_listbox.delete(0, tk.END)
        for title in self.notes:
            if query in title.lower() or query in self.notes[title].lower():
                self.note_listbox.insert(tk.END, title)

    def clear_fields(self):
        self.title_entry.delete(0, tk.END)
        self.content_text.delete(1.0, tk.END)
        self.current_note = None

    def load_notes(self):
        try:
            with open("notes.json", "r") as file:
                self.notes = json.load(file)
        except FileNotFoundError:
            pass

    def save_notes(self):
        with open("notes.json", "w") as file:
            json.dump(self.notes, file)

if __name__ == "__main__":
    root = tk.Tk()
    app = NoteTakingApp(root)
    root.mainloop()
