from django.core.management.base import BaseCommand
from django.db.models import Count

from allauth.account.models import EmailAddress
from allauth.account.utils import user_email
from allauth.utils import get_user_model


class Command(BaseCommand):
    def handle(self, *args, **options):
        for user in self.get_users_with_multiple_primary_email():
            self.unprimary_extra_primary_emails(user)

    def get_users_with_multiple_primary_email(self):
        user_pks = []
        for email_address_dict in (
            EmailAddress.objects.filter(primary=True)
            .values("user")
            .annotate(Count("user"))
            .filter(user__count__gt=1)
        ):
            user_pks.append(email_address_dict["user"])
        return get_user_model().objects.filter(pk__in=user_pks)

    def unprimary_extra_primary_emails(self, user):
        primary_email_addresses = EmailAddress.objects.filter(user=user, primary=True)

        for primary_email_address in primary_email_addresses:
            if primary_email_address.email == user_email(user):
                break
        else:
            # Didn't find the main email addresses and break the for loop
            print(
                "WARNING: Multiple primary without a user.email match for"
                "user pk %s; (tried: %s, using: %s)"
            ) % (
                user.pk,
                ", ".join(
                    [email_address.email for email_address in primary_email_addresses]
                ),
                primary_email_address,
            )

        primary_email_addresses.exclude(pk=primary_email_address.pk).update(
            primary=False
        )
