from tkinter import *
import csv
from tkinter import messagebox

phonelist = []
header = []

def ReadCSVFile():
    global header
    try:
        with open('PhoneData.csv') as csvfile:
            csv_reader = csv.reader(csvfile, delimiter=',')
            header = next(csv_reader)
            for row in csv_reader:
                phonelist.append(row)
        set_select()
        print(phonelist)
    except FileNotFoundError:
        messagebox.showerror("Error", "CSV file not found.")

def WriteInCSVFile(phonelist):
    with open('PhoneData.csv', 'w', newline='') as csv_file:
        writeobj = csv.writer(csv_file, delimiter=',')
        writeobj.writerow(header)
        for row in phonelist:
            writeobj.writerow(row)

def WhichSelected():
    if len(select.curselection()) == 0:
        messagebox.showerror("Error", "Please Select the Name")
    else:
        return int(select.curselection()[0])

def AddDetail():
    if E_name.get() != "" and E_last_name.get() != "" and E_contact.get() != "":
        phonelist.append([E_name.get() + ' ' + E_last_name.get(), E_contact.get()])
        print(phonelist)
        WriteInCSVFile(phonelist)
        set_select()
        EntryReset()
        messagebox.showinfo("Confirmation", "Successfully Add New Contact")
    else:
        messagebox.showerror("Error", "Please fill in the information")

def UpdateDetail():
    if E_name.get() and E_last_name.get() and E_contact.get():
        phonelist[WhichSelected()] = [E_name.get() + ' ' + E_last_name.get(), E_contact.get()]
        WriteInCSVFile(phonelist)
        messagebox.showinfo("Confirmation", "Successfully Update Contact")
        EntryReset()
        set_select()
    else:
        if len(select.curselection()) == 0:
            messagebox.showerror("Error", "Please Select the Name and press Load button")
        else:
            messagebox.showerror("Error", "Please fill in the information")

def EntryReset():
    E_name_var.set('')
    E_last_name_var.set('')
    E_contact_var.set('')

def DeleteEntry():
    if len(select.curselection()) != 0:
        result = messagebox.askyesno('Confirmation', 'You Want to Delete Contact\n Which you selected')
        if result:
            del phonelist[WhichSelected()]
            WriteInCSVFile(phonelist)
            set_select()
    else:
        messagebox.showerror("Error", 'Please select the Contact')

def LoadEntry():
    if len(select.curselection()) != 0:
        name, phone = phonelist[WhichSelected()]
        name_parts = name.split(' ')
        E_name_var.set(name_parts[0])
        E_last_name_var.set(name_parts[1])
        E_contact_var.set(phone)
    else:
        messagebox.showerror("Error", "Please select a contact first.")

def set_select():
    phonelist.sort(key=lambda record: record[1])
    select.delete(0, END)
    i = 0
    for name, phone in phonelist:
        i += 1
        select.insert(END, f"{i}  |    {name}   |   {phone}")

def search_contacts():
    search_query = E_search_var.get()
    search_results = []

    for name, phone in phonelist:
        if search_query.lower() in name.lower() or search_query == phone:
            search_results.append(f"{name} | {phone}")

    if search_results:
        select.delete(0, END)
        for contact in search_results:
            select.insert(END, contact)
    else:
        messagebox.showinfo("Information", "No contacts found matching the search criteria.")

window = Tk()
window.title("Contacts Management")

# تعيين خلفية النافذة باللون الوردي
window.configure(background="#FFC0CB")

Frame1 = LabelFrame(window, text="Enter the Contact Detail")
Frame1.grid(padx=15, pady=15)

Inside_Frame1 = Frame(Frame1)
Inside_Frame1.grid(row=0, column=0, padx=15, pady=15)

l_name = Label(Inside_Frame1, text="Frist Name")
l_name.grid(row=0, column=0, padx=5, pady=5)
E_name_var = StringVar()
E_name = Entry(Inside_Frame1, width=30, textvariable=E_name_var)
E_name.grid(row=0, column=1, padx=5, pady=5)

l_last_name = Label(Inside_Frame1, text="LastName")
l_last_name.grid(row=1, column=0, padx=5, pady=5)
E_last_name_var = StringVar()
E_last_name = Entry(Inside_Frame1, width=30, textvariable=E_last_name_var)
E_last_name.grid(row=1, column=1, padx=5, pady=5)

l_contact = Label(Inside_Frame1, text="Phone number")
l_contact.grid(row=2, column=0, padx=5, pady=5)
E_contact_var = StringVar()
E_contact = Entry(Inside_Frame1, width=30, textvariable=E_contact_var)
E_contact.grid(row=2, column=1, padx=5, pady=5)

Frame2 = Frame(window)
Frame2.grid(row=0, column=1, padx=15, pady=15, sticky=E)

Add_button = Button(Frame2, text="Add", width=15, bg="#6B69D6", fg="#FFFFFF", command=AddDetail)
Add_button.grid(row=0, column=0, padx=8, pady=8)

Update_button = Button(Frame2, text="Edit", width=15, bg="#6B69D6", fg="#FFFFFF", command=UpdateDetail)
Update_button.grid(row=1, column=0, padx=8, pady=8)

Reset_button = Button(Frame2, text="Reset", width=15, bg="#6B69D6", fg="#FFFFFF", command=EntryReset)
Reset_button.grid(row=2, column=0, padx=8, pady=8)

DisplayFrame = Frame(window)
DisplayFrame.grid(row=1, column=0, padx=15, pady=15)

scroll = Scrollbar(DisplayFrame, orient=VERTICAL)
select = Listbox(DisplayFrame, yscrollcommand=scroll.set, font=("Arial Bold", 10), bg="#DCD5D7", fg="#100c08", width=40, height=10, borderwidth=3, relief="groove")
scroll.config(command=select.yview)
select.grid(row=0, column=0, sticky=W)
scroll.grid(row=0, column=1, sticky=N+S)

ActionFrame = Frame(window)
ActionFrame.grid(row=1, column=1, padx=15, pady=15, sticky=E)

Delete_button = Button(ActionFrame, text="Delete", width=15, bg="#D20000", fg="#FFFFFF", command=DeleteEntry)
Delete_button.grid(row=0, column=0, padx=5, pady=5, sticky=S)

Loadbutton = Button(ActionFrame, text="Load", width=15, bg="#6B69D6", fg="#FFFFFF", command=LoadEntry)
Loadbutton.grid(row=1, column=0, padx=5, pady=5)

SearchFrame = Frame(window)
SearchFrame.grid(row=2, column=0, padx=15, pady=15, sticky=W)

l_search = Label(SearchFrame, text="Search:")
l_search.grid(row=0, column=0, padx=5, pady=5)

E_search_var = StringVar()
E_search = Entry(SearchFrame, width=30, textvariable=E_search_var)
E_search.grid(row=0, column=1, padx=5, pady=5)

Search_button = Button(SearchFrame, text="Search", width=15, bg="#6B69D6", fg="#FFFFFF", command=search_contacts)
Search_button.grid(row=0, column=2, padx=5, pady=5)

ReadCSVFile()

window.mainloop()