from getpass import getpass

from django.contrib.auth import get_user_model
from django.core.management.base import BaseCommand, CommandError
from django.db import IntegrityError


class Command(BaseCommand):
    help = "Cree un utilisateur pouvant se connecter au dashboard avec email et mot de passe."

    def add_arguments(self, parser):
        parser.add_argument("--email", required=True, help="Email utilise pour la connexion.")
        parser.add_argument(
            "--password",
            help="Mot de passe. Si absent, il sera demande dans le terminal.",
        )
        parser.add_argument(
            "--username",
            help="Nom utilisateur Django. Par defaut, la partie avant @ de l'email.",
        )
        parser.add_argument(
            "--staff",
            action="store_true",
            help="Donne acces a l'admin Django.",
        )
        parser.add_argument(
            "--superuser",
            action="store_true",
            help="Cree un superutilisateur Django.",
        )
        parser.add_argument(
            "--update",
            action="store_true",
            help="Met a jour l'utilisateur s'il existe deja.",
        )

    def handle(self, *args, **options):
        email = options["email"].strip().lower()
        password = options.get("password")
        username = (options.get("username") or email.split("@", 1)[0]).strip()
        is_superuser = options["superuser"]
        is_staff = options["staff"] or is_superuser
        should_update = options["update"]

        if "@" not in email:
            raise CommandError("Email invalide.")

        if not password:
            password = getpass("Mot de passe: ")
            confirmation = getpass("Confirmer le mot de passe: ")

            if password != confirmation:
                raise CommandError("Les mots de passe ne correspondent pas.")

        if not password:
            raise CommandError("Le mot de passe est obligatoire.")

        User = get_user_model()
        existing_user = User.objects.filter(email__iexact=email).first()

        if existing_user and not should_update:
            raise CommandError(
                "Un utilisateur avec cet email existe deja. Utilise --update pour le modifier."
            )

        if existing_user:
            user = existing_user
            user.username = username
            user.email = email
            user.is_active = True
            user.is_staff = is_staff
            user.is_superuser = is_superuser
            user.set_password(password)
            user.save()
            self.stdout.write(self.style.SUCCESS(f"Utilisateur mis a jour: {email}"))
            return

        try:
            user = User.objects.create_user(
                username=username,
                email=email,
                password=password,
                is_staff=is_staff,
                is_superuser=is_superuser,
            )
        except IntegrityError as error:
            raise CommandError(f"Impossible de creer l'utilisateur: {error}") from error

        self.stdout.write(self.style.SUCCESS(f"Utilisateur cree: {user.email}"))
