import hashlib
from collections import defaultdict
from functools import partial
from itertools import chain

from sqlalchemy.orm import Session
from os.path import join
from src.config import settings


def create_lookup(key, items):
    d = defaultdict(list)
    for item in items:
        d[key(item)].append(item)
    return d


def merge_with_current_db_state(session: Session, *items):
    for item in chain(*items):
        session.merge(item)


def parse(path, parse_func):
    silent_parse = partial(parse_func, silence=True)
    return silent_parse(join(settings.import_path, path))


def extract_categorical_data(item):
    return {"code": str(item.code), "designation": item.description}


def get_set_of(key, session, query_type):
    return set(map(key, session.query(query_type).all()))
