from allauth.socialaccount import app_settings
from allauth.socialaccount.providers.base import (
    ProviderAccount,
    ProviderException,
)
from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider


class QuickBooksAccount(ProviderAccount):

    def to_str(self):
        dflt = super(QuickBooksAccount, self).to_str()
        name = self.account.extra_data.get('name', dflt)
        first_name = self.account.extra_data.get('givenName', None)
        last_name = self.account.extra_data.get('familyName', None)
        if first_name and last_name:
            name = first_name + ' ' + last_name
        return name


class QuickBooksOAuth2Provider(OAuth2Provider):
    id = 'quickbooks'
    # Name is displayed to ordinary users -- don't include protocol
    name = 'QuickBooks'
    account_class = QuickBooksAccount

    def extract_uid(self, data):
        if 'sub' not in data:
            raise ProviderException(
                'QBO error', data
            )
        return str(data['sub'])

    def get_profile_fields(self):
        default_fields = ['address',
                          'sub',
                          'phoneNumber',
                          'givenName',
                          'familyName',
                          'email',
                          'emailVerified',
                          ]
        fields = self.get_settings().get('PROFILE_FIELDS',
                                         default_fields)
        return fields

    def get_default_scope(self):
        scope = ['openid',
                 'com.intuit.quickbooks.accounting',
                 'profile',
                 'phone',
                 ]
        if app_settings.QUERY_EMAIL:
            scope.append('email')
        return scope

    def extract_common_fields(self, data):
        return dict(email=data.get('email'),
                    address=data.get('address'),
                    sub=data.get('sub'),
                    givenName=data.get('givenName'),
                    familynName=data.get('familyName'),
                    emailVerified=data.get('emailVerified'),
                    phoneNumber=data.get('phoneNumber'))


provider_classes = [QuickBooksOAuth2Provider]
