# filename: demand.py
"""Данный модуль содержит определение класса Demand , используемый для представления сущности 'Требование'.
'Требование' содержит элементы, включающие название монеты и имя коллекционера, выставившего данное требование.
Экземпляр класса 'Требование' содержит список указателей на списки строк - 'имитация двумерного массива'.
Список строк, элемент списка, содержит обработанные данные заявок, прочитанные из файла 'требования'.
"""
from myparser import *  # Импорт данных из модуля 'парсинга' строк
class Demand:
    """Класса Demand" - 'Требование' описывает заявки коллекционеров на нужные им монеты"""
    def __init__(self):
        """Конструктор класса 'Требование'"""
        self.demand = []  # список списков строк-требований коллекционеров на проведение обмена.
        self.names = []  # список имен моллекционеров монет, участвующих в процедуре обмена
        # Лот предложения представляет собой список, содержащий две строки в формате <Название_монеты> и <Имя>
        self.listDemands = []  # Формируемый список строк, содержащих описание лотов, заявленных в требовании
        self.pars = Parser()  # Внутренний объект - экземпляр класса 'Парсер', используемый для обработки строк требований
    # END constructor method Demand.__init__()

    def setDemand(self, listDemand):
        """Подготовка данных - Определение значения атрибут экземпляра класса.
        Данный метод выполняет процедуру инициализации списка строк требований коллекционеров на обмен
        Параметр listDemands - ссылка на список списков строк-требований, подготовленных методом Parser.parsing()"""
        self.demands = listDemand
    # END method Demand.setDemand

    def make(self):
        """Метод, определяющий процесс создания списка - лота предложения на обмен. Вся информация для формирования
                лота предложения находится в списке self.offerts."""
        self.names.clear()  # Очистка списка выполняется в качестве защиты от возможного повторного вызова метода...
        self.listDemands.clear()  # Очиска результрующего списка лотов предложений
        moneys = []  # Ссылка на локальный список монет, выставленных коллекционером в предложении
        for demand in self.demands:  # Цикл перебора списка строк 'Предложений'
            lenStr = 0  # Количество строк-записей в 'Предложении', заявленном коллекционером
            line = self.pars.parsing(demand)
            lenStr = len(line)
            name = line[0]  # Извлекаемое из спписка строк имя коллекционера
            # Список содердит <Имя_коллекционера> и набор из <Названий_монет>. Длина списка lenStr равна количеству
            # строк <Имен_монет> плюс один (первый элемент - строка <Имя_коллекционера>).
            self.names.append(name)  # Заносим в список извлеченное имя коллекционера, предложившего монеты на обмен
            line.pop(0)  # Удалаяем из списка лота предложения коллекционера строку, содержащую имя коллекционера.
            # Теперь список line содержит только список названий монет, выставленных коллекционером на обмен.
            for money in line:  # Цикл по списку монет, выставленных коллекционером на обмен
                temp = []  # Формируемый список лот предложения, содержащий название монеты и имя коллекционера
                temp.append(money)
                temp.append(name)
                # Лот предложения по монете от текущего коллекционера сформирован, его нужно занести в список
                # self.listOfferts
                self.listDemands.append(temp)  # Данные лота предложения занесены в конец списка
            # END circle - Конец цикла формирования списка предложений от одного коллекционера
        # END circle - Конец цикла обработки списка строк предложений, считанных из файла
    # END method make

# END class Demand
# Блок процедур тестирования модуля
if __name__ == '__main__':
    demand = ["Bob Smith  : 1Rubl, 2ShnedCron , 5Franc , 1Funt, , ",
              "Ann : 1Taller, 100Lir, 1000Pesets, 10Marks, 5Penny"]
    obj = Demand()
    obj.setDemand(demand)
    obj.make()
    # В результате вызове метода Demand.make() формируется список, содержащий данные заявок - 'Требований' на обмен,
    # которые заносятся в атрибут члена класса Demand, список listDemands.
    print(obj.listDemands)