# By: Riasat Ullah
# This file contains queries that handle integration keys storage in cache.

from utils import cache_names
import json


def store_integration_keys(client, key_details):
    '''
    Store the details of all integration keys in cache.
    :param client: cache client
    :param key_details: (dict) -> {integration key: [integration ID, service ID, org ID], ...}
    '''
    assert isinstance(key_details, dict) and len(key_details) > 0
    data = dict()
    for key in key_details:
        data[str(key)] = json.dumps(key_details[key])
    client.hmset(cache_names.integration_keys, data)


def store_single_integration_key(client, key, details):
    '''
    Stores the details of a single integration key.
    :param client: cache client
    :param key: integration key
    :param details: (list) -> [integration ID, service ID, org ID]
    '''
    client.hset(cache_names.integration_keys, str(key), json.dumps(details))


def get_integration_key_details(client, key):
    '''
    Get the details of a particular integration key.
    :param client: cache client
    :param key: (UUID) integration key
    :return: (list) -> [integration ID, service ID, org ID]
    '''
    json_details = client.hget(cache_names.integration_keys, str(key))
    if json_details is not None:
        return json.loads(json_details)
    return None


def remove_integration_keys(client, key):
    '''
    Removes the details of a particular integration key from cache.
    :param client: cache client
    :param key: (str or list of str) integration key
    '''
    if isinstance(key, str):
        key = [key]
    key = [str(item) for item in key]
    if len(key) > 0:
        client.hdel(cache_names.integration_keys, *key)


def remove_all_integration_keys(client):
    '''
    Remove all integration keys from cache.
    :param client: cache client
    '''
    client.delete(cache_names.integration_keys)
