import tkinter as tk
from tkinter import messagebox
import json

class ContactManager:
    def __init__(self, root):
        self.root = root
        self.root.title("Contact Manager")

        # Initialize contacts list
        self.contacts = []

        # Load contacts from file
        self.load_contacts()

        # Create GUI elements
        self.contact_listbox = tk.Listbox(root, width=50)
        self.contact_listbox.pack(pady=10)

        self.name_entry = tk.Entry(root, width=30)
        self.name_entry.pack()
        self.name_entry.insert(0, "Name")

        self.phone_entry = tk.Entry(root, width=30)
        self.phone_entry.pack()
        self.phone_entry.insert(0, "Phone")

        add_button = tk.Button(root, text="Add Contact", command=self.add_contact)
        add_button.pack(pady=5)

        edit_button = tk.Button(root, text="Edit Contact", command=self.edit_contact)
        edit_button.pack(pady=5)

        delete_button = tk.Button(root, text="Delete Contact", command=self.delete_contact)
        delete_button.pack(pady=5)

        search_entry = tk.Entry(root, width=30)
        search_entry.pack(pady=5)
        search_entry.bind("<KeyRelease>", self.search_contacts)

        # Populate listbox with contacts
        self.update_contact_listbox()

    def add_contact(self):
        name = self.name_entry.get().strip()
        phone = self.phone_entry.get().strip()

        if name and phone:
            self.contacts.append({"name": name, "phone": phone})
            self.save_contacts()
            self.update_contact_listbox()
            self.name_entry.delete(0, tk.END)
            self.phone_entry.delete(0, tk.END)
        else:
            messagebox.showwarning("Warning", "Name and phone number cannot be empty!")

    def edit_contact(self):
        selected_index = self.contact_listbox.curselection()
        if selected_index:
            index = selected_index[0]
            name = self.name_entry.get().strip()
            phone = self.phone_entry.get().strip()
            if name and phone:
                self.contacts[index] = {"name": name, "phone": phone}
                self.save_contacts()
                self.update_contact_listbox()
                self.name_entry.delete(0, tk.END)
                self.phone_entry.delete(0, tk.END)
            else:
                messagebox.showwarning("Warning", "Name and phone number cannot be empty!")
        else:
            messagebox.showwarning("Warning", "Please select a contact to edit.")

    def delete_contact(self):
        selected_index = self.contact_listbox.curselection()
        if selected_index:
            index = selected_index[0]
            del self.contacts[index]
            self.save_contacts()
            self.update_contact_listbox()
        else:
            messagebox.showwarning("Warning", "Please select a contact to delete.")

    def search_contacts(self, event):
        search_term = event.widget.get().strip().lower()
        self.update_contact_listbox(search_term)

    def update_contact_listbox(self, search_term=None):
        self.contact_listbox.delete(0, tk.END)
        for contact in self.contacts:
            name = contact["name"]
            phone = contact["phone"]
            if not search_term or (search_term in name.lower() or search_term in phone):
                self.contact_listbox.insert(tk.END, f"{name} - {phone}")

    def save_contacts(self):
        with open("contacts.json", "w") as f:
            json.dump(self.contacts, f)

    def load_contacts(self):
        try:
            with open("contacts.json", "r") as f:
                self.contacts = json.load(f)
        except FileNotFoundError:
            pass

if __name__ == "__main__":
    root = tk.Tk()
    app = ContactManager(root)
    root.mainloop()
