"""authentik recovery createkey command"""
from datetime import timedelta
from getpass import getuser

from django.core.management.base import BaseCommand
from django.urls import reverse
from django.utils.timezone import now
from django.utils.translation import gettext as _
from structlog.stdlib import get_logger

from authentik.core.models import Token, TokenIntents, User

LOGGER = get_logger()


class Command(BaseCommand):
    """Create Token used to recover access"""

    help = _("Create a Key which can be used to restore access to authentik.")

    def add_arguments(self, parser):
        parser.add_argument(
            "duration",
            default=1,
            action="store",
            help="How long the token is valid for (in years).",
        )
        parser.add_argument(
            "user", action="store", help="Which user the Token gives access to."
        )

    def get_url(self, token: Token) -> str:
        """Get full recovery link"""
        return reverse("authentik_recovery:use-token", kwargs={"key": str(token.key)})

    def handle(self, *args, **options):
        """Create Token used to recover access"""
        duration = int(options.get("duration", 1))
        _now = now()
        expiry = _now + timedelta(days=duration * 365.2425)
        user = User.objects.get(username=options.get("user"))
        token = Token.objects.create(
            expires=expiry,
            user=user,
            intent=TokenIntents.INTENT_RECOVERY,
            description=f"Recovery Token generated by {getuser()} on {_now}",
        )
        self.stdout.write(
            (
                f"Store this link safely, as it will allow"
                f" anyone to access authentik as {user}."
            )
        )
        self.stdout.write(self.get_url(token))
