import tkinter as tk
from tkinter import messagebox
import json

# Load existing contacts from a file
def load_contacts():
    try:
        with open('contacts.json', 'r') as file:
            return json.load(file)
    except FileNotFoundError:
        return {}

# Save contacts to a file
def save_contacts(contacts):
    with open('contacts.json', 'w') as file:
        json.dump(contacts, file)

# Add a new contact
def add_contact(name, phone):
    contacts = load_contacts()
    contacts[name] = phone
    save_contacts(contacts)
    update_display()

# Edit an existing contact
def edit_contact(old_name, new_name, new_phone):
    contacts = load_contacts()
    if old_name in contacts:
        del contacts[old_name]
        contacts[new_name] = new_phone
        save_contacts(contacts)
        update_display()

# Delete a contact
def delete_contact(name):
    contacts = load_contacts()
    if name in contacts:
        del contacts[name]
        save_contacts(contacts)
        update_display()

# Search for a contact
def search_contact(query):
    contacts = load_contacts()
    matching_contacts = {name: num for name, num in contacts.items() if query.lower() in name.lower() or query in num}
    listbox.delete(0, tk.END)
    for name, num in matching_contacts.items():
        listbox.insert(tk.END, f"{name}: {num}")

# Update the listbox with contact names
def update_display():
    contacts = load_contacts()
    listbox.delete(0, tk.END)
    for name in contacts:
        listbox.insert(tk.END, name)

# GUI setup
root = tk.Tk()
root.title("Simple Contact Manager")

frame = tk.Frame(root)
frame.pack(pady=10)

listbox = tk.Listbox(frame, width=50, height=15)
listbox.pack(side=tk.LEFT)

scrollbar = tk.Scrollbar(frame, orient="vertical")
scrollbar.config(command=listbox.yview)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

listbox.config(yscrollcommand=scrollbar.set)

# Entry fields for name and phone number
name_label = tk.Label(root, text="Name:")
name_label.pack()
name_entry = tk.Entry(root, width=50)
name_entry.pack()

phone_label = tk.Label(root, text="Phone Number:")
phone_label.pack()
phone_entry = tk.Entry(root, width=50)
phone_entry.pack()

# Buttons for adding, editing, and deleting contacts
buttons_frame = tk.Frame(root)
buttons_frame.pack(pady=10)

add_button = tk.Button(buttons_frame, text="Add Contact", command=lambda: add_contact(name_entry.get(), phone_entry.get()))
add_button.pack(side=tk.LEFT, padx=5)

edit_button = tk.Button(buttons_frame, text="Edit Selected", command=lambda: edit_contact(listbox.get(tk.ACTIVE), name_entry.get(), phone_entry.get()))
edit_button.pack(side=tk.LEFT, padx=5)

delete_button = tk.Button(buttons_frame, text="Delete Selected", command=lambda: delete_contact(listbox.get(tk.ACTIVE)))
delete_button.pack(side=tk.LEFT, padx=5)

# Search functionality
search_label = tk.Label(root, text="Search Contact:")
search_label.pack()
search_entry = tk.Entry(root, width=50)
search_entry.pack()

search_button = tk.Button(root, text="Search", command=lambda: search_contact(search_entry.get()))
search_button.pack()

# Initial display update
update_display()

root.mainloop()


phone_label = tk.Label(root, text="Phone Number:")
phone_label.pack()
phone_entry = tk.Entry(root, width=50)
phone_entry.pack()

# Initial display update
update_display()

root.mainloop()
