import tkinter as tk
from tkinter import messagebox
import re

class ContactManager:
    def __init__(self, root):
        self.root = root
        self.root.title("Contact Manager")
        
        self.contacts = []
        
        self.primary_color = "#333333"  
        
        
        self.name_label = tk.Label(root, text="Name:")
        self.name_label.grid(row=0, column=0, padx=5, pady=5)
        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, padx=5, pady=5)
        self.phone_entry = tk.Entry(root)
        self.phone_entry.grid(row=1, column=1, padx=5, pady=5)

        self.email_label = tk.Label(root, text="Email:")
        self.email_label.grid(row=2, column=0, padx=5, pady=5)
        self.email_entry = tk.Entry(root)
        self.email_entry.grid(row=2, column=1, padx=5, pady=5)

        self.add_contact_button = tk.Button(root, text="Add Contact", command=self.add_contact, bg="#008CBA", fg="white")
        self.add_contact_button.grid(row=3, column=0, columnspan=2, padx=5, pady=5)

        self.listbox = tk.Listbox(root, width=60)
        self.listbox.grid(row=4, column=0, columnspan=2, padx=5, pady=5)

        self.edit_button = tk.Button(root, text="Edit Contact", bg="#4CAF50", fg="white", command=self.edit_contact)
        self.edit_button.grid(row=5, column=0, padx=5, pady=5)

        self.delete_button = tk.Button(root, text="Delete Contact", bg="#f44336", fg="white", command=self.delete_contact)
        self.delete_button.grid(row=5, column=1, padx=5, pady=5)

        self.search_label = tk.Label(root, text="Search:")
        self.search_label.grid(row=6, column=0, padx=5, pady=5)
        self.search_entry = tk.Entry(root)
        self.search_entry.grid(row=6, column=1, padx=5, pady=5)

        self.search_button = tk.Button(root, text="Search", bg="#808080", fg="white", command=self.search_contact)
        self.search_button.grid(row=7, column=0, columnspan=2, padx=5, pady=5)

        self.load_contacts()
        self.update_listbox()
        
        self.root.configure( background=self.primary_color)

    def add_contact(self):
        name = self.name_entry.get()
        phone = self.phone_entry.get()
        email = self.email_entry.get()
        
        if name and phone and email:
            if self.validate_email(email):
                self.contacts.append((name, phone, email))
                self.update_listbox()
                self.save_contacts()
                self.name_entry.delete(0, tk.END)
                self.phone_entry.delete(0, tk.END)
                self.email_entry.delete(0, tk.END)
            else:
                messagebox.showerror("Error", "Please enter a valid email.")
        else:
            messagebox.showerror("Error", "Please enter name, phone number, and email.")

    def edit_contact(self):
        selected_index = self.listbox.curselection()
        if selected_index:
            selected_contact = self.listbox.get(selected_index)
            name, phone, email = selected_contact.split(" - ")
            self.name_entry.insert(0, name)
            self.phone_entry.insert(0, phone)
            self.email_entry.insert(0, email)
            self.contacts.pop(selected_index[0])
            self.update_listbox()
            self.save_contacts()
        else:
            messagebox.showerror("Error", "Please select a contact to edit.")

    def delete_contact(self):
        selected_index = self.listbox.curselection()
        if selected_index:
            self.contacts.pop(selected_index[0])
            self.update_listbox()
            self.save_contacts()
        else:
            messagebox.showerror("Error", "Please select a contact to delete.")

    def search_contact(self):
        search_term = self.search_entry.get().lower()
        search_results = [(name, phone, email) for name, phone, email in self.contacts if search_term in name.lower() or search_term in phone.lower() or search_term in email.lower()]
        sorted_results = sorted(search_results, key=lambda x: x[0].lower()) 
        self.listbox.delete(0, tk.END)
        for contact in sorted_results:
            self.listbox.insert(tk.END, f"{contact[0]} - {contact[1]} - {contact[2]}")

    def update_listbox(self):
        sorted_contacts = sorted(self.contacts, key=lambda x: x[0].lower())   
        self.listbox.delete(0, tk.END)
        for contact in sorted_contacts:
            self.listbox.insert(tk.END, f"{contact[0]} - {contact[1]} - {contact[2]}")

    def load_contacts(self):
        try:
            with open("contacts.txt", "r") as file:
                lines = file.readlines()
                for line in lines:
                    parts = line.strip().split(",")
                    if len(parts) == 3:
                        name, phone, email = parts
                        self.contacts.append((name, phone, email))
                    else:
                        print(f"Ignoring invalid line: {line}")
        except FileNotFoundError:
            pass
    
    def save_contacts(self):
        with open("contacts.txt", "w") as file:
            for contact in self.contacts:
                file.write(f"{contact[0]},{contact[1]},{contact[2]}\n")

    def validate_email(self, email):
        pattern = r'^[\w\.-]+@[\w\.-]+\.\w+$'
        return re.match(pattern, email)

if __name__ == "__main__":
    root = tk.Tk()
    app = ContactManager(root)
    root.mainloop()

 
    
        
    




 
             
            
        
    
               
         

        
        
    


        
    
    
    
  

       
        
    
    