"""
STRAVA AUTH helpers
"""

import datetime
from django.utils import timezone
import requests
from decouple import config
from gpxporter.models import UserStravaSetting


CLIENT_ID = config('STRAVA_CLIENT_ID')
CLIENT_SECRET = config('STRAVA_CLIENT_SECRET')
SCOPE = 'activity:read_all'
REDIRECT_URI = config('SERVER_BASE_URL') + '/gpxporter/code/receive/'
STRAVA_URL_CODE = 'https://www.strava.com/oauth/authorize'
STRAVA_URL_GET_TOKENS = 'https://www.strava.com/oauth/token'


def get_user_strava_settings(user):
    try:
        if UserStravaSetting.objects.filter(user=user).exists():
            return UserStravaSetting.objects.get(user=user)
        else:
            return False
    except Exception as e:
        print("[HELPERS][STRAVA] can not load setting for user %s" % str(user))
        print(e)
        return False


def build_strava_authorize_uri(user):
    return STRAVA_URL_CODE + '?client_id=' + CLIENT_ID + '&redirect_uri=' + REDIRECT_URI + '&response_type=code&scope=' + SCOPE


def create_user_strava_setting(user, code):
    try:
        access_token, refresh_token, valid_until = get_access_and_refresh_tokens(code)
        new_setting = UserStravaSetting(
            user=user,
            code=code,
            access_token=access_token,
            refresh_token=refresh_token,
            valid_until=timezone.make_aware(datetime.datetime.fromtimestamp(valid_until))
        )
        new_setting.save()
        return True
    except Exception as e:
        print("[HELPERS][STRAVA] can not create setting for user %s with code %s" % (str(user), str(code)))
        print(e)
        return False


def get_access_and_refresh_tokens(code):
    try:
        params = {
            'client_id': CLIENT_ID,
            'client_secret': CLIENT_SECRET,
            'code': str(code),
            'grant_type': 'authorization_code'
        }
        print('[STRAVA][AUTH] requesting tokens...')
        response = requests.post(STRAVA_URL_GET_TOKENS, params=params)

        data = response.json()
        return data['access_token'], data['refresh_token'], data['expires_at']
    except Exception as e:
        print("[HELPERS][STRAVA] failed loading tokens with code %s" % str(code))
        print(e)
        return '', '', timezone.now()


def refresh_tokens(user):
    try:
        user_setting = UserStravaSetting.objects.get(user=user)
        params = {
            'client_id': CLIENT_ID,
            'client_secret': CLIENT_SECRET,
            'refresh_token': user_setting.refresh_token,
            'grant_type': 'refresh_token'
        }
        print('[STRAVA][AUTH] refreshing tokens...')
        response = requests.post(STRAVA_URL_GET_TOKENS, params=params)

        data = response.json()
        user_setting.access_token = data['access_token']
        user_setting.refresh_token = data['refresh_token']
        user_setting.valid_until = timezone.make_aware(datetime.datetime.fromtimestamp(data['expires_at']))
        user_setting.save()
        print('[STRAVA][AUTH] tokens refreshed!')
        return True
    except Exception as e:
        print("[HELPERS][STRAVA] failed refreshing tokens for user %s" % str(user))
        print(e)
        return False


def get_valid_access_token_for_requests(user):
    try:
        setting = UserStravaSetting.objects.get(user=user)
        if setting.valid_until < timezone.now():
            refresh_tokens(user)
        
        final_setting = UserStravaSetting.objects.get(user=user)
        return final_setting.access_token
    except Exception as e:
        print("[HELPERS][STRAVA][AUTH] failed getting valid access token for user %s" % str(user))
        print(e)
        return ''



# END
