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


def scaffold_logic_type_custom():
    def get_data():
        SYSTEM_DATA_PATH = f'{config.CMF_FOLDER}/contrib/system_data.json'
        with open(SYSTEM_DATA_PATH) as fd:
            return json.loads(fd.read())
    # версия скафолда с исправлениями
    data = get_data()
    all_lt = data['logic_type']
    for lt_data in all_lt:
        lt = models.CmfLogicType.get(filter=['code', '=', lt_data['code']],
           include_deleted=True, order_by=['cmf_created_at'])
        if lt:
            # 2023-08-17 https://bcrm.carbonsoft.ru/project/Document/DOC-000838#spec-patch##KwzVFgl1gAuMA8
            # работаем только на insert
            continue
        if not lt:
            # if only_update:
            #     continue
            lt = models.CmfLogicType()
        lt.name = lt_data['name']
        lt.system = lt_data.get('system', False)
        lt.obj_code_prefix = lt_data.get('obj_code_prefix', None)
        lt.ui_color = lt_data.get('ui_color', '#3f82d8')

        if 'code' in lt_data:
            lt.code = lt_data['code']
        if lt_data.get('alias'):
            lt.alias.load()
            if not lt.alias.value:
                lt.alias.value = list()
            lt.alias.value.extend(lt_data['alias'])
            lt.alias = list(set(lt.alias))
        lt.filter_activity = models.CmfActivity.get(code=lt_data['activity'])
        lt.cmf_model_name = lt_data['cmf_model_name']
        if 'default_workflow' in lt_data:
            wf = models.CmfWorkflow.get(filter=[
                ['code', '=', lt_data['default_workflow']]
            ])
            lt.default_workflow = wf
        else:
            lt.default_workflow = None
        lt.save(only_data=True)
    return


def scaffold_all():
    scaffold_status_codes()
    scaffold_workflow()
    scaffold_logic_type_custom()
    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()
