from tkinter import *

from StockItem import StockItem

class StockItemEditor(object):
    '''
    Edytor obiektów StockItem
    Właściwość frame reprezentuje ramkę moduły Tkinter
    wykorzystywaną do wyświetlania w edytorze
    '''

    def __init__(self,root):
        '''
        Utworzenie egzemplarza edytora. Parametr root dostarcza
        do modułu Tkintera główną ramkę edytora
        '''
        self.frame = Frame(root,borderwidth=5)

        stock_ref_label = Label(self.frame,text='Symbol magazynowy:')
        stock_ref_label.grid(sticky=E, row=0, column=0, padx=5, pady=5)
        self._stock_ref_entry = Entry(self.frame, width=30)
        self._stock_ref_entry.grid(sticky=W, row=0, column=1, padx=5, pady=5)

        price_label = Label(self.frame,text='Cena:')
        price_label.grid(sticky=E, row=1, column=0, padx=5, pady=5)
        self._price_entry = Entry(self.frame, width=30)
        self._price_entry.grid(sticky=W, row=1, column=1, padx=5, pady=5)

        self._stock_level_label = Label(self.frame,text='Stan magazynowy: 0')
        self._stock_level_label.grid( row=2, column=0, columnspan=2, padx=5, pady=5)

        tags_label = Label(self.frame,text='Znaczniki:')
        tags_label.grid(sticky=E+N, row=3, column=0, padx=5, pady=5)

        self._tags_text = Text(self.frame, width=50, height=5)
        self._tags_text.grid(row=3, column=1, padx=5, pady=5)

    def load_into_editor(self, item):
        '''
        Ładuje obiekt StockItem do edytora.
        Argument item to referencja do obiektu StockItem,
        który jest ładowany do obszaru wyświetlania.
        '''
        self.clear_editor()
        self._stock_ref_entry.insert(0, item.stock_ref)
        self._price_entry.insert(0, str(item.price))
        self._stock_level_label.config(text = 'Stan magazynowy : ' + str(item.stock_level))
        self._tags_text.insert('0.0', item.text_tags)

    def get_from_editor(self,item):
        '''
        Pobiera zaktualizowane wartości z ekranu. 
        Argument item to referencja do obiektu StockItem,
        do którego będą przekazane zaktualizowane wartości.
        Zgłasza wyjątek, jeśli wprowadzonej ceny
        nie można przekształcić na liczbę.
        '''
        item.set_price(int(self._price_entry.get()))
        item.stock_ref = self._stock_ref_entry.get()
        item.text_tags = self._tags_text.get('1.0',END)

    def item_edited(self, item):
        '''
        Sprawdza, czy są jakieś różnice między  
        obiektem item przekazanym za pomocą parametru
        a wyświetlanym na ekranie.
        Zwraca wartość True, jeśli element uległ zmianie
        '''
        if item.stock_ref != self._stock_ref_entry.get():
            return True
        if item.price != float(self._price_entry.get()):
            return True
        if item.text_tags.strip() != self._tags_text.get('1.0',END).strip():
            return True
        return False

    def clear_editor(self):
        '''
        Czyści okno edytora
        '''
        self._stock_ref_entry.delete(0, END) 
        self._price_entry.delete(0, END)
        self._tags_text.delete('0.0', END)
        self._stock_level_label.config(text = 'Pusty')

