"""
Заявку создали, статус "Согласовать ставку":
    - исполнитель ставится Денис, у него появляется кнопка "Согласовать"
    - почему-то нет будильника. баг?
Тут нет автоматики bzPython.

Далее БП по шагам:
1. Денис нажимает "Согласовать", статус меняется на "Завяка на поиск"
    - поменять исполнителя на автора/постановщика
    - добавить копию документа "Шаблон "Профиль должности" в разделе "Профили кандидатов"
    - и подвязать к задаче
    - создать дочернюю задачу на автора "Заполнить профиль должности"
2. После закрытия задачи на заполнение профиля
    - статус родителя меняется на "Заявка HR на подбор"
    - исполнитель меняется на Юлию
3. **Тут нет автоматики bzPython!** Юлия ставит статус "В работу" и связывается с постановщиком,
  обсуждает задачу
4. Далее переводит заявку в статус "Согласовать вакансию"
    - исполнитель должен смениться на автора
5. У автора появляется кнопка "Подтвердить", он нажимает кнопку "Подтвердить"
    - статус меняется на "Разместить вакансию"
    - исполнитель меняется на Юлию
6. **Тут нет автоматики bzPython!** Юлия выполняет задачу, ставит в "Подтверждение закрытия",
  меняется ожидание ответа на постановщика
"""

def create_or_update_task(name, obj, logic_type=None,
                    workflow=None, parent_task=None):
    """
    Создаст подзадачу и скопирует в неё нужные данные из родительской.
    """
    # Для задач тестирования
    if not parent_task:
        parent_task = obj
    task = models.CmfTask.get(parent_task=parent_task,name=name)
    if not task:
        task = models.CmfTask()
    task.name = name
    if logic_type:
        task.logic_type = logic_type
    # Для задач спеки и разработки
    if workflow:
        task.workflow = workflow
    task.parent_task = parent_task
    task.parent = obj.parent
    task.priority = obj.priority
    task.deadline = obj.deadline
    for tag in obj.tags.load():
        task.tags.append(tag)
    for comp in obj.components.load():
        task.components.append(comp)
    task.save()
    task.approved = True
    task.save()
    return task


def tie_doc_to_task(task, doc):
    """Привяжет документ к задаче"""
    task.local_links.append(doc)
    return None


def create_or_get_doc(obj, template):
    """Создаст документ или вернёт уже существующий и привязаный к основной задаче"""
    # По БП задача не может возвращаться в согласование ставки,
    # а если нужно пересогласование - открывается новая задача.
    # Потому это больше защита от дублей при тестах, чем реальный кейс. Может стоит удалить потом.
    for entity in obj.local_links:
        if isinstance(entity, models.CmfDocument) \
        and entity.tree_parent == template.tree_parent:
            return entity
    # Может лучше так
    # template.create_doc_from_template({'parent': template.parent,'name': 'test'})
    doc = template.copy(name=f'Профиль по задаче {obj.name}')
    # Не срабатывает. Может, правится после привязки?
    doc.do_publish()
    return doc


def run(self):
    """Основная функия для скриптов bzPython"""
    # Меняем ответственного
    self.responsible = self.cmf_owner
    self.waiting_for = self.cmf_owner
    # Привязывае документ
    template = models.CmfDocument.get(code='DOC-012845')
    doc = create_or_get_doc(self, template)
    tie_doc_to_task(self, doc)
    # Создаём поздазачу заполнить документ
    workflow = models.CmfWorkflow.get(name='HR. Заполнить профиль должности')
    subtask = create_or_update_task(f'Заполнить профиль должности', self,
                                logic_type=None, workflow=workflow)
    subtask.responsible = self.cmf_owner
    subtask.waiting_for = self.cmf_owner
    # Привязывае документ к поздаче
    tie_doc_to_task(subtask, doc)
    subtask.save()
