# Lesson 7 HomeWork - Task 3

"""
Реализовать программу работы с органическими клетками.
Необходимо создать класс Клетка.
В его конструкторе инициализировать параметр, соответствующий количеству клеток (целое число).
В классе должны быть реализованы методы перегрузки арифметических операторов:
сложение (__add__()), вычитание (__sub__()), умножение (__mul__()), деление (__truediv__()).
Данные методы должны применяться только к клеткам и выполнять
увеличение, уменьшение, умножение и обычное (не целочисленное) деление клеток, соответственно.
В методе деления должно осуществляться округление значения до целого числа.

Сложение: Объединение двух клеток.
При этом число ячеек общей клетки должно равняться сумме ячеек исходных двух клеток.

Вычитание: Участвуют две клетки.
Операцию необходимо выполнять только если разность количества ячеек двух клеток больше нуля,
иначе выводить соответствующее сообщение.

Умножение: Создается общая клетка из двух.
Число ячеек общей клетки определяется как произведение количества ячеек этих двух клеток.

Деление: Создается общая клетка из двух.
Число ячеек общей клетки определяется как целочисленное деление количества ячеек этих двух клеток.

В классе необходимо реализовать метод make_order(),
принимающий экземпляр класса и количество ячеек в ряду.
Данный метод позволяет организовать ячейки по рядам.
Метод должен возвращать строку вида *****\n*****\n*****...,
где количество ячеек между \n равно переданному аргументу.
Если ячеек на формирование ряда не хватает, то в последний ряд записываются все оставшиеся.
Например, количество ячеек клетки равняется 12, количество ячеек в ряду — 5.
Тогда метод make_order() вернет строку: *****\n*****\n**.
Или, количество ячеек клетки равняется 15, количество ячеек в ряду — 5.
Тогда метод make_order() вернет строку: *****\n*****\n*****.
"""


class Cell:

    def __init__(self, cell_count):
        self.__cell_count = cell_count

    @property
    def cell_count(self):
        return self.__cell_count

    def __str__(self):
        return f'Количество ячеек - {self.cell_count}'

    def __add__(self, other):
        return Cell(self.cell_count + other.cell_count)

    def __sub__(self, other):
        return Cell(self.cell_count - other.cell_count if self.cell_count - other.cell_count > 0 else 'Невозможно '
                                                                                                      'выполнить '
                                                                                                      'операцию')

    def __mul__(self, other):
        return Cell(self.cell_count * other.cell_count)

    def __truediv__(self, other):
        return Cell(self.cell_count // other.cell_count if other.cell_count != 0 else 'На ноль делить нельзя')

    # def make_order(self, lines):
    #     line = ''
    #     for i in range(int(self.cell_count / lines)):
    #         line += f'{"*" * lines}\n'
    #     line += f'{"*" * (self.cell_count % lines)}'
    #     return line

    def make_order(self, lines):
        return '\n'.join('*' * min(self.cell_count - i, lines) for i in range(0, self.cell_count, lines))


a = Cell(12)
b = Cell(5)
print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(a.make_order(5))
print(b.make_order(5))
