import tkinter as tk
from tkinter import messagebox
import json

class ContactManager:
    def __init__(self, master):
        self.master = master
        self.master.title("Contact Manager")
        
        self.contacts = []
        self.load_contacts()
        
        self.create_widgets()
        
    def create_widgets(self):
        self.contact_listbox = tk.Listbox(self.master, width=40)
        self.contact_listbox.pack(pady=10)
        self.refresh_contact_list()

        self.name_label = tk.Label(self.master, text="Name:")
        self.name_label.pack()
        self.name_entry = tk.Entry(self.master)
        self.name_entry.pack()

        self.phone_label = tk.Label(self.master, text="Phone:")
        self.phone_label.pack()
        self.phone_entry = tk.Entry(self.master)
        self.phone_entry.pack()

        self.add_button = tk.Button(self.master, text="Add Contact", command=self.add_contact)
        self.add_button.pack(pady=5)

        self.edit_button = tk.Button(self.master, text="Edit Contact", command=self.edit_contact)
        self.edit_button.pack()

        self.delete_button = tk.Button(self.master, text="Delete Contact", command=self.delete_contact)
        self.delete_button.pack()

        self.search_label = tk.Label(self.master, text="Search:")
        self.search_label.pack()
        self.search_entry = tk.Entry(self.master)
        self.search_entry.pack()
        
        self.search_button = tk.Button(self.master, text="Search", command=self.search_contact)
        self.search_button.pack()

    def add_contact(self):
        name = self.name_entry.get()
        phone = self.phone_entry.get()
        if name and phone:
            self.contacts.append({"name": name, "phone": phone})
            self.save_contacts()
            self.refresh_contact_list()
            self.name_entry.delete(0, tk.END)
            self.phone_entry.delete(0, tk.END)
        else:
            messagebox.showwarning("Warning", "Please enter name and phone number.")

    def edit_contact(self):
        selected_index = self.contact_listbox.curselection()
        if selected_index:
            index = selected_index[0]
            name = self.name_entry.get()
            phone = self.phone_entry.get()
            if name and phone:
                self.contacts[index] = {"name": name, "phone": phone}
                self.save_contacts()
                self.refresh_contact_list()
                self.name_entry.delete(0, tk.END)
                self.phone_entry.delete(0, tk.END)
            else:
                messagebox.showwarning("Warning", "Please enter name and phone number.")
        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.refresh_contact_list()
        else:
            messagebox.showwarning("Warning", "Please select a contact to delete.")

    def search_contact(self):
        query = self.search_entry.get().lower()
        if query:
            matching_contacts = [contact for contact in self.contacts if query in contact['name'].lower() or query in contact['phone']]
            self.contact_listbox.delete(0, tk.END)
            for contact in matching_contacts:
                self.contact_listbox.insert(tk.END, f"{contact['name']} - {contact['phone']}")
        else:
            self.refresh_contact_list()

    def refresh_contact_list(self):
        self.contact_listbox.delete(0, tk.END)
        for contact in self.contacts:
            self.contact_listbox.insert(tk.END, f"{contact['name']} - {contact['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

def main():
    root = tk.Tk()
    app = ContactManager(root)
    root.mainloop()

if __name__ == "__main__":
    main()