from patch.include import *
from tqdm import tqdm
import csv
import os


def load(filename, dictinary, orderno):
    from cmf.include import models
    import csv
    if models.CmfSynonym.get(filter=['dict_name', '=', dictinary]):
        print(f'Error! Словарь синонимов с именем {dictinary} уже загружен')
        return
    print(f'Загружаем словарь {dictinary}')
    # fixme прямой sql это зло, надо сделать bulk_insert
    sql = '''INSERT INTO cmf_synonym (
                id, cmf_created_at, cmf_modified_at, cmf_deleted, cmf_archived, system,
                stat_usage, stat_search, name, text, dict_name, stat_lang_usage, orderno,
                import_original, is_favorite, has_tree_nodes, tree_node_is_branch,
                tree_hidden, perm_public, perm_has_acl, perm_inherit, perm_encrypt, sl_owner_lock, full_search_type
            ) VALUES (
                :id, now(), now(), FALSE, FALSE, TRUE, 0, 0, :word, :syns, :dictinary,
                :word_stat, :orderno, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
                FALSE, FALSE, FALSE, :full_search_type
            );'''
    with open(filename, 'r', newline='') as csvfile:
        reader = csv.reader(csvfile, delimiter=';',
                            quotechar='"', quoting=csv.QUOTE_MINIMAL)
        values = []
        i = 0
        for row in reader:
            word = row[0]
            syns = row[1]
            syns = row[1]
            syns = syns.replace('|', ',')

            values.append({
                'id': models.CmfSynonym.gen_id(),
                'word': word,
                'syns': syns,
                'dictinary': dictinary,
                'word_stat': 0,
                'orderno': orderno,
                'full_search_type': models.CmfSynonym.full_search_type.default,
            })

            if i % 1000 == 0:
                models.CmfSynonym.dp.data_driver.Session().execute(sql, values)
                models.CmfSynonym.dp.commit()
                values = []
            i += 1
        if values:
            models.CmfSynonym.dp.data_driver.Session().execute(sql, values)
            models.CmfSynonym.dp.commit()



@app_context(commit=True)
def patch():
    # Загрузите файл в /root/custom_synonym.load в формате
    # слово;синоним1,синоним2
    # или
    # слово;синоним1|синоним2
    filename = '/root/custom_synonym.load'
    orderno = 1100
    dictinary = 'ru_syn_custom'

    # порядковый номер для "общих словарей языка" orderno от 1000 до 10000
    # для словарей предметной области от 100 до 1000
    # для "ручных" от 0 до 100

    with cmfutil.disable_acl(), cmfutil.disable_notify():
        load(filename, dictinary, orderno)


if __name__ == "__main__":
    os.environ["NO_CACHE"] = "1"
    patch()
