from bs4 import BeautifulSoup

from patch.include import *
from tqdm import tqdm
from modules.redmine.api import CmfRedmineApi
from cmf.modules.logs.log_config import get_logger

@app_context(commit=True)
def patch():
    """
    Для тестирования патча: ( cd /opt/crm; python3 -m patch.20220XXXXXXX_PATCHNAME )
    Здесь можно работать с моделями через models.CmfTask и т.д.
    Для прогрессбара используйте:
    for task in tqdm(models.CmfTask.list()):
        ...
    """
    logger = get_logger('patch')
    parser = argparse.ArgumentParser(
        prog='Import redmine',
        description='Import comments and attachments',
        epilog='RRRAAAAAMMMMM!')
    parser.add_argument('token')
    parser.add_argument('url')
    args = parser.parse_args()
    client = CmfRedmineApi(args.token, args.url)

    for task in tqdm(models.CmfTask.list(filter=['ext_id', '!=', None], fields=['ext_id', 'text', 'code'])):
        try:
            issue = client.api.issue.get(int(task.ext_id.value), include=['journals', 'attachments'])
            # print(task.code)
            logger.info(str(issue.id))
            soup = BeautifulSoup(task.text.value or '', "html.parser")
            checklist = None
            # Комментарии задач
            for journal in issue.journals:
                if journal.notes:
                    user = client.api.user.get(journal.user.id)
                    # print(f'user.mail={user.mail}')
                    # print(f'user.login={user.login}')
                    person = models.CmfPerson.get(first_name=user.firstname, last_name=user.lastname)
                    ext_id = str(journal.id)
                    comment = models.CmfComment.get(ext_id=ext_id, parent=task)
                    if not comment:
                        comment = models.CmfComment(ext_id=ext_id, parent=task)
                    comment.text = journal.notes

                    if person:
                        comment.cmf_author = person
                        comment.cmf_owner = person
                    comment.save()
                    comment.cmf_created_at = str(journal.created_on)
                    comment.cmf_modified_at = comment.cmf_created_at
                    comment.save(only_data=True)
                elif journal.details:
                    for row in journal.details:
                        if row['name'] == 'checklist':
                            checklist = soup.new_tag('ul', attrs={'class': 'tox-checklist', 'import-checklist': True})
                            checklist.contents = []
                            for option in json.loads(row['new_value']):
                                class_name = ''
                                if option['is_done']:
                                    class_name = 'tox-checklist--checked'
                                li = soup.new_tag('li', attrs={'class': class_name})
                                li.string = option['subject']
                                checklist.append(li)
                            break
                    # print(f'journal.updated_on={journal.created_on}')
                    # print(f'comment.cmf_modified_at={comment.cmf_modified_at}')
                    # return
            if checklist:
                import_checklist = soup.find('ul', attrs={'import-checklist': True})
                if import_checklist:
                    import_checklist.replace_with(checklist)
                else:
                    soup.append(checklist)
                task.text = str(soup)
                task.save(only_data=True)

            # Скачаем вложения
            for attach in issue.attachments:
                if not attach:
                    continue
                ext_id = str(attach.id)
                cmf_attach = models.CmfAttachment.get(ext_id=ext_id, parent=task)
                if not cmf_attach:
                    cmf_attach = models.CmfAttachment(ext_id=ext_id, parent=task)
                cmf_attach.name = str(attach)
                cmf_attach.save()
                response = attach.download()
                cmf_attach.upload_dir()
                logger.info(cmf_attach.full_path_file)
                with open(cmf_attach.full_path_file, 'wb+') as f:
                    for chunk in response.iter_content(chunk_size=1024):
                        f.write(chunk)
                cmf_attach.make_preview()
                logger.info(str(attach))
            # break
        except Exception as e:
            logger.exception(f'ERROR: Ошибка получения задачи по ext_id={task.ext_id}')


if __name__ == "__main__":
    patch()
