import hashlib
import hmac
import time

from allauth.socialaccount import providers
from allauth.socialaccount.helpers import (
    complete_social_login,
    render_authentication_error,
)

from .provider import TelegramProvider


def telegram_login(request):
    provider = providers.registry.by_id(TelegramProvider.id, request)
    data = dict(request.GET.items())
    hash = data.pop('hash')
    payload = '\n'.join(sorted([
        '{}={}'.format(k, v)
        for k, v in data.items()
    ]))
    token = provider.get_settings()['TOKEN']
    token_sha256 = hashlib.sha256(token.encode()).digest()
    expected_hash = hmac.new(
        token_sha256,
        payload.encode(),
        hashlib.sha256).hexdigest()
    auth_date = int(data.pop('auth_date'))
    if hash != expected_hash or time.time() - auth_date > 30:
        return render_authentication_error(
            request,
            provider_id=provider.id,
            extra_context={'response': data})

    login = provider.sociallogin_from_response(request, data)
    return complete_social_login(request, login)
