#!/usr/bin/env python3

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

import os
import sys

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

from patch.include import *


def parse_args():
    """ Разбор аргументов """
    parser = argparse.ArgumentParser()
    parser.description = "Привязываем пользователя в Eva."
    parser.add_argument('--admin', required=True, type=str, help='Email администратора')
    parser.add_argument('--phone', required=True, type=str, help='Телефон администратора')
    parser.add_argument('--company-name', required=True, type=str, help='Название компании')
    parser.add_argument('--user-name', required=False, type=str, help='ФИО', default=None)
    parser.add_argument('--hostname', required=True, type=str, help='Запрашиваемый адрес Eva')
    parser.add_argument('--landing-project', required=True, type=str, help='Установим лицензию')
    parser.add_argument('--vm-type', type=str, help='Чтобы кинуть $@ и не разбираться с unknown args')
    return parser.parse_args()


def rename_and_update_admin(email, phone, name):
    """ Переименуем админскую учетку и дополним ее """
    def_admin = 'default.admin@crm.evacrm.ru'
    admin = models.CmfPerson.get(login=def_admin, fields=['id', 'login', 'email', 'phone', 'rg_member_of'])
    assert admin, "Не найдена стандартная учётная запись администратора Eva"
    admin.code = admin.login = admin.email = email
    admin.name = email.split('@')[0]
    admin.rg_member_of = ['Admins', 'Users']
    admin.phone = phone
    if name:
        admin.name = name.replace('_', ' ')
    admin.save()
    return admin


def rename_org(company_name):
    """ Переименуем дефолтную компанию """
    company = models.CmfCompany.get(name='default.company')
    assert company, "Не найдена стандартная запись о компании"
    company.name = company_name.replace('_', ' ')
    company.save()


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=admin,
        name=doc.name,
        msg="Вы успешно зарегистрировались в системе EvaTeam.",
        notify_type="message"
    )


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()


def patch_emails(hostname):
    """ Поменяем у всех демо-пользователей дефолтные email """
    for person in models.CmfPerson.list(filter=['email', 'LIKE', '%default.company'], fields=['email']):
        person.email = person.email.value.replace('default.company', hostname)
        person.save()


def add_license_from_landing(landing_project):
    """
    Установим лицензию, пока у нас 3 актуальных лицензии,
    eva24, evaproject, evawiki
    по-умолчанию даем evawiki
    """
    landing_code = 'evawiki'
    if landing_project in ('eva24', 'evaproject', 'evawiki'):
        landing_code = landing_project
    models.CmfLicense.landing_page2license(code=landing_code)


@app_context(commit=True)
def main():
    logging.basicConfig(level=logging.INFO, format="%(message)s")
    args = parse_args()
    admin = rename_and_update_admin(args.admin, args.phone, args.user_name)
    rename_org(args.company_name)
    replace_greetings(admin)
    patch_cards()
    patch_emails(args.hostname)
    add_license_from_landing(args.landing_project)
    models.CmfPerson.account_sync_users.apply()


if __name__ == '__main__':
    main()
