"""Reputation tasks"""
from django.core.cache import cache
from structlog import get_logger

from passbook.core.models import User
from passbook.policies.reputation.models import IPReputation, UserReputation
from passbook.policies.reputation.signals import (
    CACHE_KEY_IP_PREFIX,
    CACHE_KEY_USER_PREFIX,
)
from passbook.root.celery import CELERY_APP

LOGGER = get_logger()


@CELERY_APP.task()
def save_ip_reputation():
    """Save currently cached reputation to database"""
    keys = cache.keys(CACHE_KEY_IP_PREFIX + "*")
    objects_to_update = []
    for key in keys:
        score = cache.get(key)
        remote_ip = key.replace(CACHE_KEY_IP_PREFIX, "")
        rep, _ = IPReputation.objects.get_or_create(ip=remote_ip)
        rep.score = score
        objects_to_update.append(rep)
    IPReputation.objects.bulk_update(objects_to_update, ["score"])


@CELERY_APP.task()
def save_user_reputation():
    """Save currently cached reputation to database"""
    keys = cache.keys(CACHE_KEY_USER_PREFIX + "*")
    objects_to_update = []
    for key in keys:
        score = cache.get(key)
        username = key.replace(CACHE_KEY_USER_PREFIX, "")
        users = User.objects.filter(username=username)
        if not users.exists():
            LOGGER.info("User in cache does not exist, ignoring", username=username)
            continue
        rep, _ = UserReputation.objects.get_or_create(user=users.first())
        rep.score = score
        objects_to_update.append(rep)
    UserReputation.objects.bulk_update(objects_to_update, ["score"])