from allauth.socialaccount.adapter import DefaultSocialAccountAdapter
from allauth.account.adapter import DefaultAccountAdapter
from django.core.exceptions import PermissionDenied
from django.contrib.auth.models import Group


class FairphoneAccountAdapter(DefaultSocialAccountAdapter):
    def is_open_for_signup(self, request, sociallogin):
        return True

    def save_user(self, request, sociallogin, form=None):
        u = DefaultSocialAccountAdapter.save_user(
            self, request, sociallogin, form=None
        )
        if u.email.split("@")[1] == "fairphone.com":
            g = Group.objects.get(name="FairphoneSoftwareTeam")
            g.user_set.add(u)
        return u

    def populate_user(self, request, sociallogin, data):
        u = DefaultSocialAccountAdapter.populate_user(
            self, request, sociallogin, data
        )
        if not u.email.split("@")[1] == "fairphone.com":
            raise PermissionDenied()
        return u


class FormAccountAdapter(DefaultAccountAdapter):
    def is_open_for_signup(self, request):
        return False
