# EG9-07 Proste kontakty z metodą inicjującą

from BTCInput import *
import pickle

# Utworzenie klasy Contact 

class Contact:
    def __init__(self, name, address, telephone):
        self.name=name
        self.address=address
        self.telephone=telephone

def new_contact():
    '''
    Czyta nowy kontakt i go zapisuje
    '''
    print('Stwórz nowy kontakt')
    # dodanie atrybutów danych
    name=read_text('Wprowadź nazwisko: ')
    address=read_text('Wprowadź adres: ')
    telephone=read_text('Wprowadź telefon kontaktowy: ')
    # stworzenie nowego egzemplarza klasy
    new_contact=Contact(name=name,address=address,telephone=telephone)
    # dodanie nowego kontaktu do listy kontaktów
    contacts.append(new_contact)

def find_contact(search_name):
    '''
    Znajduje kontakt o pasującym nazwisku 
    Zwraca egzemplarz kontaktu lub None, jeśli nie istnieje 
    kontakt o podanym nazwisku
    '''
    # usuń wszelkie białe spacje wokół nazwy do wyszukiwania
    search_name = search_name.strip()
    # konwertuj wyszukiwane nazwisko na małe litery
    search_name = search_name.lower()
    for contact in contacts:
        # pobierz nazwisko z kontaktu 
        name=contact.name
        # usuń wszelkie białe spacje wokół nazwy do wyszukiwania
        name=name.strip()
        # konwertuj wyszukiwane nazwisko na małe litery
        name = name.lower()
        # sprawdź, czy nazwiska do siebie pasują
        if name.startswith(search_name):
            # zwrócenie znalezionego kontaktu
            return contact
    # jeśli dotarliśmy do tego miejsca, to nie znaleziono kontaktu
    # o podanym nazwisku
    return None
    
def display_contact():
    '''
    Wczytuje nazwisko do wyszukania, a następnie wyświetla
    informacje dotyczące tego nazwiska lub
    komunikat informujący o tym, że nazwiska nie znaleziono
    '''
    print('Znajdź kontakt')
    search_name = read_text('Wprowadź nazwisko: ')
    contact=find_contact(search_name)
    if contact!=None:
        # Znaleziono szukany kontakt
        print('Nazwisko: ',contact.name)
        print('Adres: ',contact.address)
        print('Telefon: ',contact.telephone)
    else:              
        print('Wprowadzone nazwisko nie zostało znalezione.')

def edit_contact():
    '''
    Czyta nazwisko do wyszukiwania, a następnie pozwala
    użytkownikowi edytować szczegóły wyszukanego kontaktu.
    Jeśli kontakt nie zostanie znaleziony, funkcja wyświetla
    komunikat informujący o tym, że nazwiska nie znaleziono
    '''
    print('Edytuj kontakt')
    search_name=read_text('Wprowadź nazwisko:')
    contact=find_contact(search_name)
    if contact!=None:
        # Znaleziono szukany kontakt
        print('Nazwisko: ',contact.name)
        new_name=read_text('Wprowadź nowe nazwisko lub . aby pozostawić je bez zmian: ')
        if new_name!='.':
            contact.name=new_name
        new_address=read_text('Wprowadź nowy adres lub ., aby pozostawić go bez zmian: ')
        if new_address!='.':
            contact.address=new_address
        new_phone=read_text('Wprowadź nowy numer telefonu lub ., aby pozostawić go bez zmian: ')
        if new_phone!='.':
            contact.telephone=new_phone
    else:              
        print('Wprowadzone nazwisko nie zostało znalezione.')

def save_contacts(file_name):
    '''
    Zapisuje kontakty w pliku o podanej nazwie
    Kontakty są przechowywane w postaci binarnej, w pliku .pickle
    Jeśli zapis nie powiedzie się, program zgłosi wyjątki 
    '''
    print('zapisywanie kontaktów')
    with open(file_name,'wb') as out_file:
        pickle.dump(contacts,out_file)

def load_contacts(file_name):
    '''
    Ładuje kontakty z pliku o podanej nazwie
    Kontakty są przechowywane w postaci binarnej, w pliku .pickle
    Jeśli ładowanie pliku się nie powiedzie, funkcja będzie zgłaszała wyjątki
    '''
    global contacts
    print('Ładowanie kontaktów')
    with open(file_name,'rb') as input_file:
        contacts=pickle.load(input_file)

menu='''Proste kontakty

1. Nowy kontakt
2. Znajdź kontakt
3. Edytuj kontakt
4. Wyjście z programu

Wprowadź polecenie: '''

filename='contacts.pickle'
try:
    load_contacts(filename)
except:
    print('Nie znaleziono pliku kontaktów')
    contacts=[]

while True:
    command=read_int_ranged(prompt=menu,min_value=1,max_value=4)
    if command==1:
        new_contact()
    elif command==2:
        display_contact()
    elif command==3:
        edit_contact()
    elif command==4:
        save_contacts(file_name)
        break
