from patch.include import *
from tqdm import tqdm

from modules.gantt.models.cmf_roadmap_view import PRESET_VIEWS


@app_context(commit=True)
def roadmap_view_presets():
    """
    Создает или обновляет стандартные системные виды на всех существующих CmfRoadmap

    Для тестирования патча: ( cd /opt/eva-app; python3 -m patch.202604210953_roadmap_view_presets )
    """
    print('Запуск патча roadmap_view_presets')

    roadmaps = models.CmfRoadmap.list(fields=['--', 'id'])
    print(f'Найдено roadmap: {len(roadmaps)}')

    updated = 0
    created = 0

    batch_size = 100

    for i, roadmap in enumerate(tqdm(roadmaps), 1):
        models.CmfRoadmapView.bulk_update(
            filter=[['parent', '==', roadmap], ['is_default', '==', True]],
            values={'is_default': False},
        )

        existing = models.CmfRoadmapView.list(parent=roadmap, view_scope='embedded', fields=['name', 'config', 'is_default'])
        existing_map = {v.name.value: v for v in existing}

        for preset in PRESET_VIEWS:
            name = preset['name']
            is_default = preset.get('is_default', False)
            config = preset['config']

            if name in existing_map:
                view = existing_map[name]
                view.config = config
                view.is_default = is_default
                view.save(only_data=True)
                updated += 1
            else:
                view = models.CmfRoadmapView()
                view.name = name
                view.parent = roadmap
                view.config = config
                view.view_scope = 'embedded'
                view.is_default = is_default
                view.save(notify=False, emit=False)
                created += 1

        if i % batch_size == 0:
            cmf_commit()

    print(f'Обновлено видов: {updated}, создано: {created}')


if __name__ == "__main__":
    roadmap_view_presets()
