from patch.include import *
from tqdm import tqdm

from cmf.system_data import init_system_users, scaffold_status_codes, scaffold_workflow, scaffold_event_type, scaffold_project_notify_scheme


def fix_old_statuses():
    # TO Коля Крать или кто будет принимать. По словам Саши Е. таких немного, если они вообще есть
    # Удаляем статус Открыто в sd_service_request
    wf = models.CmfWorkflow.get(code='task.sd_service_request:default')
    old_status_open = models.CmfStatus.get(workflow=wf, status_type='OPEN', code='open')
    if old_status_open:
        new_status_open = models.CmfStatus.get(workflow=wf, status_type='OPEN', code='sd_waiting_for_support_open')
        old_status_open_tasks = models.CmfTask.list(workflow=wf, status=old_status_open)
        for task in old_status_open_tasks:
            task.status = new_status_open
            task.save(only_data=True) # Без only_data ругается на отсутствие транзишена

        old_status_open.system=False
        old_status_open.delete()


    # Удаляем статус Открыто в sd_service_request_with_approvals
    wf = models.CmfWorkflow.get(code='task.sd_service_request_with_approvals:default')
    old_status_open = models.CmfStatus.get(workflow=wf, status_type='OPEN', code='open')
    if old_status_open:
        new_status_open = models.CmfStatus.get(workflow=wf, code='sd_waiting_for_support')
        old_status_open_tasks = models.CmfTask.list(workflow=wf, status=old_status_open)
        for task in old_status_open_tasks:
            task.status = new_status_open
            task.save(only_data=True)

        old_status_open.system = False
        old_status_open.delete()


    # Удаляем статус "ожидание одобрения" в sd_service_request_with_approvals
    wf = models.CmfWorkflow.get(code='task.sd_service_request_with_approvals:default')
    old_status = models.CmfStatus.get(workflow=wf, code='sd_waiting_for_approval')
    if old_status:
        new_status = models.CmfStatus.get(workflow=wf, code='sd_pending')
        old_status_tasks = models.CmfTask.list(workflow=wf, status=old_status)
        for task in old_status_tasks:
            task.status = new_status
            task.save(only_data=True)

        old_status.system = False
        old_status.delete()


    # Удаляем статус sd_waiting_for_support в task.sd_service_request:default с неправильным кодом статуса
    wf = models.CmfWorkflow.get(code='task.sd_service_request:default')
    old_status = models.CmfStatus.get(workflow=wf, code='sd_waiting_for_support')
    if old_status:
        new_status = models.CmfStatus.get(workflow=wf, code='sd_waiting_for_support_open')
        old_status_tasks = models.CmfTask.list(workflow=wf, status=old_status)
        for task in old_status_tasks:
            task.status = new_status
            task.save(only_data=True)

        old_status.system = False
        old_status.delete()

@app_context(commit=True)
def sdeskapprfw():
    """
    Для тестирования патча: ( cd /opt/eva-app; python3 -m patch.202309071526_sdeskapprfw )
    Здесь можно работать с моделями через models.CmfTask и т.д.
    Для прогрессбара используйте:
    for task in tqdm(models.CmfTask.list()):
        ...
    """
    print('Запуск патча sdeskapprfw')
    with cmfutil.disable_acl(), cmfutil.disable_notify():
        init_system_users()
        models.CmfPerson.dp.commit()
        scaffold_event_type()
        scaffold_project_notify_scheme()

        scaffold_status_codes()
        scaffold_workflow()
        fix_old_statuses()

if __name__ == "__main__":
    sdeskapprfw()
