"""Handling of local secret used for encrypted backups.
Separated out for circular dependency reasons
"""

from __future__ import annotations
import secrets

from selfprivacy_api.utils.redis_pool import RedisPool


REDIS_KEY = "backup:local_secret"

redis = RedisPool().get_connection()


class LocalBackupSecret:
    @staticmethod
    def get() -> str:
        """A secret string which backblaze/other clouds do not know.
        Serves as encryption key.
        """
        if not LocalBackupSecret.exists():
            LocalBackupSecret.reset()
        return redis.get(REDIS_KEY)  # type: ignore

    @staticmethod
    def set(secret: str):
        redis.set(REDIS_KEY, secret)

    @staticmethod
    def reset():
        new_secret = LocalBackupSecret._generate()
        LocalBackupSecret.set(new_secret)

    @staticmethod
    def _full_reset():
        redis.delete(REDIS_KEY)

    @staticmethod
    def exists() -> bool:
        return redis.exists(REDIS_KEY) == 1

    @staticmethod
    def _generate() -> str:
        return secrets.token_urlsafe(256)