from patch.include import *
from tqdm import tqdm
from cmf.system_data import scaffold_scheme_wf, scaffold_workflow, scaffold_status_codes, scaffold_logic_type


def scaffold_all():
    scaffold_status_codes()
    scaffold_workflow()
    scaffold_logic_type()
    scaffold_scheme_wf()

def update_documents():
    wf_standart = models.CmfWorkflow.get(code='default.system:default')
    wf_new = models.CmfWorkflow.get(code='document.base:default')

    status_map = {}
    status_open_newwf = wf_new.get_default_status(status_code='open')
    status_approved_newwf = wf_new.get_default_status(status_code='approved')

    status_map[wf_standart.get_default_status('OPEN')] = status_open_newwf
    status_map[wf_standart.get_default_status('IN_PROGRESS')] = status_open_newwf #wf_new.get_default_status('IN_REVIEW')
    status_map[wf_standart.get_default_status('CLOSED')] = status_approved_newwf

    with cmfutil.disable_acl(), cmfutil.disable_notify():
        while True:
            doclist = models.CmfDocument.list(fields=['workflow', 'status', 'cmf_version', 'need_approve', 'text_draft'],
                                              include_deleted=True, include_templates=True, slice=[0, 1000], filter=['workflow', '==', wf_standart])

            if not doclist:
                break

            for document in tqdm(doclist):
                # меняем документ
                # меняем wf
                document.workflow = wf_new

                document.doc_version = document.cmf_version
                document.publish_by_owner_only = document.need_approve

                # меняем историю
                last_hist = models.CmfDocumentHistory.get(
                    filter=['parent', '==', document],
                    order_by=['-cmf_version'],
                    fields=['approved', 'doc_version']
                )

                if last_hist:
                    document.cur_workflow_version = last_hist
                    last_hist.doc_version = document.doc_version
                    last_hist.cur_workflow = True

                    if last_hist.approved:
                        last_hist.status = status_approved_newwf
                        document.status = status_approved_newwf
                    else:
                        last_hist.status = status_open_newwf
                        document.status = status_open_newwf

                    last_hist.save(only_data=True, emit=False, notify=False)
                else:
                    new_cur_history = models.CmfDocumentHistory(text=document.text_draft, parent=document, status=status_open_newwf,
                                                                cur_workflow=True, doc_version=document.doc_version)
                    new_cur_history.save(emit=False, notify=False)
                    document.cur_workflow_version = new_cur_history
                    document.status = status_open_newwf

                if last_hist and last_hist.approved:
                    last_approved_hist = last_hist
                else:
                    last_approved_hist = models.CmfDocumentHistory.get(
                        filter=[['parent', '==', document], ['approved', '==', True]],
                        order_by=['-cmf_version'],
                        fields = ['approved', 'doc_version', 'cmf_version']
                    )

                if last_approved_hist:
                    document.cur_published_version = last_approved_hist
                    last_approved_hist.has_published = True
                    if not last_approved_hist.doc_version:
                        last_approved_hist.doc_version = last_approved_hist.cmf_version
                    last_approved_hist.status = status_approved_newwf
                    if last_approved_hist.approved_version:
                        last_approved_hist.official_number = last_approved_hist.approved_version
                    else:
                        last_approved_hist.official_number = 1

                    last_approved_hist.official_date = last_approved_hist.approved_at

                    last_approved_hist.save(only_data=True, emit=False, notify=False)

                document.save(only_data=True, emit=False, notify=False)

            commit_all_ds()
            print('1000 obj done')

@app_context(commit=True)
def patch():
    """
    Для тестирования патча: ( cd /opt/eva-app; python3 -m patch.202307181253_docflow )
    Здесь можно работать с моделями через models.CmfTask и т.д.
    Для прогрессбара используйте:
    for task in tqdm(models.CmfTask.list()):
        ...
    """
    print('Запуск патча docflow')
    print('Создаем объекты')
    scaffold_all()
    print('Меняем в документах БП/статус')
    update_documents()

if __name__ == "__main__":
    patch()
