import tkinter as tk
from tkinter import messagebox
import json

class ContactManagerGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("Contact Manager")

        self.contacts = []

        self.name_label = tk.Label(root, text="Name:")
        self.name_label.grid(row=0, column=0, sticky=tk.W)
        self.name_entry = tk.Entry(root)
        self.name_entry.grid(row=0, column=1, padx=5, pady=5)

        self.phone_label = tk.Label(root, text="Phone:")
        self.phone_label.grid(row=1, column=0, sticky=tk.W)
        self.phone_entry = tk.Entry(root)
        self.phone_entry.grid(row=1, column=1, padx=5, pady=5)

        self.add_button = tk.Button(root, text="Add Contact", command=self.add_contact)
        self.add_button.grid(row=2, column=0, columnspan=2, padx=5, pady=5)

        self.contacts_listbox = tk.Listbox(root)
        self.contacts_listbox.grid(row=3, column=0, columnspan=2, padx=5, pady=5)
        self.contacts_listbox.bind("<<ListboxSelect>>", self.select_contact)

        self.edit_button = tk.Button(root, text="Edit Contact", command=self.edit_contact)
        self.edit_button.grid(row=4, column=0, padx=5, pady=5)

        self.delete_button = tk.Button(root, text="Delete Contact", command=self.delete_contact)
        self.delete_button.grid(row=4, column=1, padx=5, pady=5)

        self.search_entry = tk.Entry(root)
        self.search_entry.grid(row=5, column=0, padx=5, pady=5)
        self.search_button = tk.Button(root, text="Search", command=self.search_contacts)
        self.search_button.grid(row=5, column=1, padx=5, pady=5)

        self.load_contacts()

    def add_contact(self):
        name = self.name_entry.get().strip()
        phone = self.phone_entry.get().strip()

        if name and phone:
            contact = {"name": name, "phone": phone}
            self.contacts.append(contact)
            self.contacts_listbox.insert(tk.END, name + " - " + phone)
            self.clear_entries()
            self.save_contacts()
        else:
            messagebox.showwarning("Error", "Please enter a name and phone number.")

    def edit_contact(self):
        selected_index = self.contacts_listbox.curselection()

        if selected_index:
            name = self.name_entry.get().strip()
            phone = self.phone_entry.get().strip()

            if name and phone:
                contact = self.contacts[selected_index[0]]
                contact["name"] = name
                contact["phone"] = phone

                self.contacts_listbox.delete(selected_index)
                self.contacts_listbox.insert(selected_index, name + " - " + phone)
                self.clear_entries()
                self.save_contacts()
            else:
                messagebox.showwarning("Error", "Please enter a name and phone number.")
        else:
            messagebox.showwarning("Error", "Please select a contact to edit.")

    def delete_contact(self):
        selected_index = self.contacts_listbox.curselection()

        if selected_index:
            response = messagebox.askokcancel("Confirmation", "Are you sure you want to delete this contact?")
            if response:
                self.contacts.pop(selected_index[0])
                self.contacts_listbox.delete(selected_index)
                self.clear_entries()
                self.save_contacts()
        else:
            messagebox.showwarning("Error", "Please select a contact to delete.")

    def select_contact(self, event):
        selected_index = self.contacts_listbox.curselection()

        if selected_index:
            contact = self.contacts[selected_index[0]]
            self.name_entry.delete(0, tk.END)
            self.name_entry.insert(tk.END, contact["name"])
            self.phone_entry.delete(0, tk.END)
            self.phone_entry.insert(tk.END, contact["phone"])

    def search_contacts(self):
        search_term = self.search_entry.get().strip().lower()

        self.contacts_listbox.delete(0, tk.END)

        for contact in self.contacts:
            if search_term in contact["name"].lower() or search_term in contact["phone"].lower():
                self.contacts_listbox.insert(tk.END, contact["name"] + " - " + contact["phone"])

    def clear_entries(self):
        self.name_entry.delete(0, tk.END)
        self.phone_entry.delete(0, tk.END)

    def save_contacts(self):
        with open("contacts.json", "w") as file:
            json.dump(self.contacts, file)

    def load_contacts(self):
        try:
            with open("contacts.json", "r") as file:
                self.contacts = json.load(file)

            for contact in self.contacts:
                self.contacts_listbox.insert(tk.END, contact["name"] + " - " + contact["phone"])
        except FileNotFoundError:
            pass

root = tk.Tk()
app = ContactManagerGUI(root)
root.mainloop()