#!/usr/bin/env python3

# coding: utf-8
"""
Закрепление виртуальной машины за администратором.
"""

import os
import sys

# При использовании wildcard импортов из cmf мы переопределим datetime.datetime в просто datetime
# Поэтому вместо импорта вида:
# from datetime import datetime, timedelta, timezone
# используем полный путь ко всем функциям в коде, чтобы не было
# AttributeError: module 'datetime' has no attribute 'now'
from random import random

# чтобы сработал запуск из другой директории и импорт всего чего надо
for func in (os.chdir, sys.path.append):
    func('/opt/crm')

from patch.include import *


def parse_args():
    """ Разбор аргументов"""
    parser = argparse.ArgumentParser()
    parser.description = "Удаляем тестовых лидов созданных для проверки выдачи VM."
    parser.add_argument('--admin', '--admin', required=True, type=str, help='Email администратора')
    return parser.parse_args()


def replace_greetings(admin):
    """ TODO: Вообще странная тема. Если мы его заменяем всё равно, какой тогда смысл его заранее создавать? """
    # Удаляем стандартное приветствие
    from cmf.demo_data import GREETINGS_DOC_ID_PATH
    with open(GREETINGS_DOC_ID_PATH) as f:
        doc_id = f.read()
    for welcome in models.CmfNotify.list(obj_id=doc_id):
        welcome.delete()

    # Создаём новое
    doc = models.CmfDocument.get(id=doc_id)
    if os.getenv('LOAD', '1') == '0' and not doc:
        return
    assert doc, "Не найден приветственный документ"
    welcome = models.CmfNotify.place_notify(
        obj=doc,
        person_id=admin.id.value,
        name=doc.name,
        msg="Вы успешно зарегистрировались в системе EvaTeam.",
        notify_type="message"
    )
    welcome.save()


def patch_cards():
    """
    Поскольку мы всё равно здесь сохраняем таски, можно сдвинуть их немного,
    чтобы при выдаче залежавшейся виртуалки
    клиента не встретило окно о том, что его рабочее место заблокировано.
    :return:
    """
    my_task_count = 0
    today = datetime.datetime.now(datetime.timezone.utc)
    for task_id in set([card.obj_id for card in models.CmfCard.list(fields=['obj_id'])]):
        task = getattr(models, task_id.split(':')[0]).get(id=task_id)
        if task is None:
            print('not found', task_id, task)
            continue
        if task_id.startswith('CmfTask'):
            delta = -datetime.timedelta(days=random())
            if my_task_count > 1:
                delta = datetime.timedelta(days=30)
            elif task.cache_status_type in ('OPEN', 'IN_PROGRESS'):
                my_task_count += 1
            task.alarm_date = today + delta
            task.status_modified_at = today
        task.save()


@app_context(commit=True)
def main():
    logging.basicConfig(level=logging.INFO, format="%(message)s")
    args = parse_args()
    admin = models.CmfPerson.get(login=args.admin, fields=['id'])
    assert admin, "Не удалось найти учётную запись администратора"
    replace_greetings(admin)
    patch_cards()


if __name__ == '__main__':
    main()
