from patch.include import *
from tqdm import tqdm
from datetime import datetime


@app_context(commit=True)
def patch():
    """
    Для тестирования патча: ( cd /opt/crm; python3 -m patch.20220XXXXXXX_PATCHNAME )
    Здесь можно работать с моделями через models.CmfTask и т.д.
    Для прогрессбара используйте:
    for task in tqdm(models.CmfTask.list()):
        ...
    """
    if not config.IS_BOX_VERSION:
        print(f"Отключается только в box версиях")
        return
    import psycopg2
    from urllib.parse import urlparse

    # Разбор строки подключения
    url = urlparse("postgresql+psycopg2://postgres@/accountdb")
    # Подключение к базе данных
    conn = psycopg2.connect(
        host=url.hostname,
        port=url.port,
        user=url.username,
        password=url.password,
        database=url.path[1:]
    )

    # Получение данных из таблицы
    cur = conn.cursor()
    cur.execute("SELECT * FROM cmf_auth")
    rows = cur.fetchall()

    # Маппинг данных в словарь
    result = []
    for row in rows:
        user = dict()
        result.append(user)
        for i, col in enumerate(cur.description):
            user[col.name] = row[i]
    # Закрытие подключения к базе данных
    cur.close()
    conn.close()
    for user_dict in tqdm(result):
        print(user_dict)
        user = models.CmfAuth.get(login=user_dict['login'])
        if not user:
            user = models.CmfAuth(login=user_dict['login'])
        for key in user_dict:
            if key == 'id':
                continue
            if key in ('groups', 'auth_options'):
                setattr(user, key, user_dict[key] and json.loads(user_dict[key]))
            else:
                setattr(user, key, user_dict[key])
        user.save()
    commit_all_ds()

    # Скопируем ключи аккаунта в срм
    for key_name in ('jwt_rsa', 'jwt_rsa.pub'):
        acc_jwt_path = Path('/opt/account/custom') / key_name
        crm_jwt_path = Path('/opt/crm/custom') / key_name
        if acc_jwt_path.exists():
            if crm_jwt_path.exists():
                bk_jwt_path = crm_jwt_path.with_name(crm_jwt_path.name + f'.{datetime.now():%Y-%m-%d_%H%M%S}')
                crm_jwt_path.rename(bk_jwt_path)
            crm_jwt_path.write_text(acc_jwt_path.read_text())


if __name__ == "__main__":
    patch()
