'''
Przechowywanie pojedynczego artykułu w aplikacji Modny ciuch
Towar charakteryzuje się ceną, stanem magazynowym i zbiorem znaczników,
których można użyć do jego zlokalizowania
'''

import pickle

class StockItem(object):
    '''
    Artykuł magazynowy w sklepie z odzieżą
    '''

    show_instrumentation = False

    min_price = 0.5
    max_price = 500.0

    max_stock_add = 50
    
    @property
    def text_tags(self):
        '''
        Konwertuje zbiór towarów na rozdzielaną przecinkami listę 
        ciągów znaków w celu wyświetlania lub edycji
        '''
        tag_list = list(self.tags) 
        tag_list.sort()
        return ','.join(tag_list)

    @text_tags.setter
    def text_tags(self,tag_string):
        '''
        Konwertuje listę rozdzielaną przecinkami na zbiór 
        pojedynczych elementów
        Konwertuje tekst na małe litery i przycina każde 
        słowo.
        '''
        # Konwertuje ciąg znaków na małe litery
        tag_string = str.lower(tag_string)

        # Utworzenie listy wszystkich słów w ciągu znaków
        # rozdzielanym przecinkami
        tag_list = str.split(tag_string, sep=',')

        # Usunięcie wszystkich spacji z początku lub 
        # końcu każdego ciągu na liście
        tag_list = map(str.strip,tag_list)

        # zwrócenie zbioru utworzonego z listy
        self.tags = set(tag_list)

    def __init__(self, stock_ref, price, tags):
        if StockItem.show_instrumentation:
            print('**Wywołano metodę __init__ klasy StockItem')
        self.stock_ref = stock_ref
        self.__price = price
        self.__stock_level = 0
        self.StockItem_version = 1
        self.text_tags = tags

    def check_version(self):
        if StockItem.show_instrumentation:
            print('** Wywołano metodę check_version klasy StockItem')
        # To jest wersja 1 — nie ma potrzeby aktualizowania czegokolwiek
        pass

    def __str__(self): 
        if StockItem.show_instrumentation:
            print('**Wywołano metodę __str__ klasy StockItem')
        template = '''Symbol magazynowy: {0}
Cena: {1}
Stan magazynowy: {2}
Znaczniki: {3}''' 

        return template.format(self.stock_ref, 
                               self.price, self.stock_level, 
                               self.text_tags)

    def add_stock(self,count):
        '''
        Dostawa towaru do magazynu. 
        count oznacza liczbę sztuk towaru do dodania
        Zgłasza wyjątek, jeśli liczba jest nieprawidłowa.
        '''
        if StockItem.show_instrumentation:
            print('**Wywołano metodę add_stock klasy StockItem')
        if count < 0 or count > StockItem.max_stock_add:
            raise Exception('Nieprawidłowa liczba sztuk towaru do dodania')

        self.__stock_level = self.__stock_level + count

    def sell_stock(self, count):
        '''
        Sprzedaż towaru.
        count oznacza liczbę sztuk towaru do sprzedania
        Zgłasza wyjątek, jeśli liczba jest nieprawidłowa.
        '''
        if StockItem.show_instrumentation:
            print('**Wywołano metodę sell_stock klasy StockItem')
        if count < 1:
            raise Exception('Nieprawidłowa liczba sztuk towaru do sprzedaży')

        if count > self.stock_level:
            raise Exception('Za mało towaru w magazynie')

        self.__stock_level = self.__stock_level - count

    def set_price(self, new_price):
        if StockItem.show_instrumentation:
            print('**Wywołano metodę set_price klasy StockItem')
        if new_price < StockItem.min_price or new_price > StockItem.max_price:
            raise Exception('Nieprawidłowa cena')
        self.__price = new_price

    @property
    def price(self):
        if StockItem.show_instrumentation:
            print('** Wywołano metodę get właściwości price klasy StockItem')
        return self.__price

    @property
    def stock_level(self):
        if StockItem.show_instrumentation:
            print('** Wywołano metodę get właściwości stock_level klasy StockItem')
        return self.__stock_level


