# By: Riasat Ullah
# This class syncs up task instance data stored in db with that in cache.

from cache_queries import cache_users
from dbqueries import db_policies
from taskcallrest import settings


def get_user_policy_info(conn, client, timestamp, user_policy_ids, store_misses=True):
    '''
    Gets user policy info. Tries the cache first, and then tries the db if there are cache misses.
    :param conn: db connection
    :param client: cache client
    :param timestamp: timestamp the request is being made on
    :param user_policy_ids: (list) of user policy IDs
    :param store_misses: (boolean) True if cache misses should be stored in cache after retrieval from db
    :return: (dict) -> {pol ID: { dict }, ...}
    '''
    retrieved_user_info = dict()
    cache_miss_pol_ids = []

    if settings.CACHE_ON:
        retrieved_user_info = cache_users.get_multiple_users_policy_info(client, user_policy_ids)
        if len(retrieved_user_info) != len(user_policy_ids):
            cache_miss_pol_ids = list(set(user_policy_ids).difference(set(retrieved_user_info.keys())))
    else:
        cache_miss_pol_ids = user_policy_ids

    if len(cache_miss_pol_ids) > 0:
        user_info_from_db = db_policies.get_policy_dispatch_info(conn, timestamp, user_policy_ids)
        retrieved_user_info = {**retrieved_user_info, **user_info_from_db}

        if store_misses and settings.CACHE_ON and len(user_info_from_db) > 0:
            cache_users.store_multiple_user_policy_into(client, user_info_from_db)

    return retrieved_user_info


def update_user_policy_info(conn, client, timestamp, user_policy_id):
    '''
    Update the user policy info of a user.
    :param conn: db connection
    :param client: cache client
    :param timestamp: timestamp the request is being made on
    :param user_policy_id: (int) policy ID of the user
    '''
    if settings.CACHE_ON:
        if cache_users.is_user_policy_in_cache(client, user_policy_id):
            user_updated_info = db_policies.get_policy_dispatch_info(conn, timestamp, [user_policy_id])[user_policy_id]
            cache_users.store_single_user_policy_info(client, user_policy_id, user_updated_info)
