"""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.text import slugify
from django.utils.timezone import now
from django.utils.translation import gettext as _

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


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)
        users = User.objects.filter(username=options.get("user"))
        if not users.exists():
            self.stderr.write(f"User '{options.get('user')}' not found.")
            return
        user = users.first()
        token = Token.objects.create(
            expires=expiry,
            user=user,
            intent=TokenIntents.INTENT_RECOVERY,
            description=f"Recovery Token generated by {getuser()} on {_now}",
            identifier=slugify(f"ak-recovery-{user}-{_now}"),
        )
        self.stdout.write(
            f"Store this link safely, as it will allow anyone to access authentik as {user}."
        )
        self.stdout.write(self.get_url(token))
