import hashlib

from social.utils import handle_http_errors
from social.backends.base import BaseAuth


class LastFmAuth(BaseAuth):
    """
    Last.Fm authentication backend. Requires two settings:
        SOCIAL_AUTH_LASTFM_KEY
        SOCIAL_AUTH_LASTFM_SECRET

    Don't forget to set the Last.fm callback to something sensible like
        http://your.site/lastfm/complete
    """
    name = 'lastfm'
    AUTH_URL = 'http://www.last.fm/api/auth/?api_key={api_key}'
    EXTRA_DATA = [
        ('key', 'session_key')
    ]

    def auth_url(self):
        return self.AUTH_URL.format(api_key=self.setting('KEY'))

    @handle_http_errors
    def auth_complete(self, *args, **kwargs):
        """Completes login process, must return user instance"""
        key, secret = self.get_key_and_secret()
        token = self.data['token']

        signature = hashlib.md5(''.join(
            ('api_key', key, 'methodauth.getSession', 'token', token, secret)
        ).encode()).hexdigest()

        response = self.get_json('http://ws.audioscrobbler.com/2.0/', data={
            'method': 'auth.getSession',
            'api_key': key,
            'token': token,
            'api_sig': signature,
            'format': 'json'
        }, method='POST')

        kwargs.update({'response': response['session'], 'backend': self})
        return self.strategy.authenticate(*args, **kwargs)

    def get_user_id(self, details, response):
        """Return a unique ID for the current user, by default from server
        response."""
        return response.get('name')

    def get_user_details(self, response):
        fullname, first_name, last_name = self.get_user_names(response['name'])
        return {
            'username': response['name'],
            'email': '',
            'fullname': fullname,
            'first_name': first_name,
            'last_name': last_name
        }
