from django.contrib.auth.models import User
from django.utils import timezone
from requests import post
from django.conf import settings
from .models import UserModel
from requests import get

ACCESS_TOKEN_URI = settings.HOST_URI + '/token'


def get_auth_header():
    # Make a header with access key for making request in google-my-business server.
    access_token = get(ACCESS_TOKEN_URI).text
    headers = {
        'authorization': 'Bearer ' + access_token,
        'content-type': 'application/json'
    }
    return headers


def has_expired(credentials):
    expiry_time = credentials['expiry']
    now = str(timezone.datetime.now())
    return now > expiry_time


def get_access_token(request):
    if 'credentials' in request.session and not has_expired(request.session['credentials']):
        cred = request.session['credentials']
        return cred['access_token']
    access_token, expires_in = refresh_access_token()
    expired_at = timezone.datetime.now() + timezone.timedelta(seconds=expires_in)
    expiry = str(expired_at)
    credentials = {
        'access_token': access_token,
        'expiry': expiry
    }
    request.session['credentials'] = credentials
    return credentials['access_token']


def refresh_access_token():
    user = User.objects.filter(username='admin@ercare').first()
    uid = user.id
    user = UserModel.objects.filter(pk=uid).first()
    if user:
        refresh_token = user.refresh_token
    else:
        return None

    client_id = settings.CLIENT_ID
    client_secret = settings.CLIENT_SECRET
    token_uri = settings.TOKEN_URI
    params = {
        "grant_type": "refresh_token",
        "client_id": client_id,
        "client_secret": client_secret,
        "refresh_token": refresh_token
    }

    response = post(token_uri, data=params).json()
    access_token = response.get('access_token')
    expires_in = response.get('expires_in')
    return access_token, expires_in


def get_google_account_id(access_token):
    uri = 'https://mybusiness.googleapis.com/v4/accounts'
    headers = {
        'authorization': 'Bearer '+access_token,
        'content-type': 'application/json'
    }
    res = get(uri, headers=headers).json()
    accounts_name = res['accounts'][0]['name']
    id = accounts_name.split('/')[-1]
    return id


def get_gmb_id():
    user = User.objects.get(username='admin@ercare')
    gmb_id = UserModel.objects.get(user=user).gmb_account_id
    return user, gmb_id
