"""
STRAVA ACTIVITY helpers
"""


import requests
import pandas
import gpxpy.gpx
from datetime import datetime, timedelta

from django.utils.dateparse import parse_datetime
from gpxporter.models import UserStravaSetting, Activity
from gpxporter.helpers import strava_auth


STRAVA_URL_GET_ACTIVITIES = 'https://www.strava.com/api/v3/athlete/activities'
STRAVA_URL_GET_GPX = 'https://www.strava.com/activities/{{activityid}}/export_gpx'


def update_user_activities(user):
    try:
        data = get_activities_from_strava(user)
        handle_activity_data(data, user)
        return True
    except:
        return False


def get_user_activities(user):
    try:
        return Activity.objects.filter(user=user).order_by('-started_at')
    except Exception as e:
        print('[STRAVA][ACTIVITY] Failed load activities for user!')
        print(e)
        return []


def get_activities_from_strava(user):
    try:
        params = {
            'access_token': strava_auth.get_valid_access_token_for_requests(user)
        }
        response = requests.get(STRAVA_URL_GET_ACTIVITIES, params=params)
        return response.json()
    except Exception as e:
        print('[STRAVA][ACTIVITY] Failed load activities!')
        print(e)
        return []


def handle_activity_data(data, user, limit=3):
    try:
        counter = 0
        for element in data:
            if Activity.objects.filter(uid=element['id']).exists():
                print('[STRAVA][ACTIVITY] Activity already in database. Skipping...')
            else:
                started_at = parse_datetime(element['start_date_local'])
                new_activity = Activity(
                    uid=element['id'],
                    name=element['name'],
                    user=user,
                    started_at=parse_datetime(element['start_date_local']),
                    gpx_data=get_activity_gpx_stream(element['id'], user, element['start_date_local'])
                )
                new_activity.save()
                counter += 1

            if counter >= limit:
                print('[STRAVA][ACTIVITY] Limit reached. Stopped collecting activity data.')
                break

        return True
    except Exception as e:
        print('[STRAVA][ACTIVITY] Failed handling activities!')
        print(e)
        return False


def get_activity_gpx(activity_id, user):
    # DEPRECATED
    try:
        params = {
            'access_token': strava_auth.get_valid_access_token_for_requests(user)
        }
        response = requests.get(STRAVA_URL_GET_GPX.replace('{{activityid}}', str(activity_id)), params=params)
        return response.text
    except Exception as e:
        print('[STRAVA][ACTIVITY] Failed getting activity gpx data!')
        print(e)
        return ''


def get_activity_gpx_download_data(activity_id):
    try:
        activity = Activity.objects.get(uid=activity_id)
        return activity.gpx_data
    except Exception as e:
        print('[STRAVA][ACTIVITY] Failed getting activity data for download!')
        print(e)
        return ''


def get_activity_gpx_stream(activity_id, user, started_at):
    # https://stackoverflow.com/questions/68457696/strava-api-to-export-gpx-file-of-activity
    try:
        # Get access token
        access_token = strava_auth.get_valid_access_token_for_requests(user)

        # Make API call
        url = f"https://www.strava.com/api/v3/activities/{activity_id}/streams"
        header = {'Authorization': 'Bearer ' + access_token}
        lat_long = requests.get(url, headers=header, params={'keys': ['latlng']}).json()[0]['data']
        time_list = requests.get(url, headers=header, params={'keys': ['time']}).json()[1]['data']
        altitude = requests.get(url, headers=header, params={'keys': ['altitude']}).json()[1]['data']

        # Create dataframe to store data 'neatly'
        data = pandas.DataFrame([*lat_long], columns=['lat', 'long'])
        data['altitude'] = altitude
        start = datetime.strptime(started_at, "%Y-%m-%dT%H:%M:%SZ")
        data['time'] = [(start + timedelta(seconds=t)) for t in time_list]

        gpx = gpxpy.gpx.GPX()
        # Create first track in our GPX:
        gpx_track = gpxpy.gpx.GPXTrack()
        gpx.tracks.append(gpx_track)
        # Create first segment in our GPX track:
        gpx_segment = gpxpy.gpx.GPXTrackSegment()
        gpx_track.segments.append(gpx_segment)
        # Create points:
        for idx in data.index:
            gpx_segment.points.append(gpxpy.gpx.GPXTrackPoint(
                data.loc[idx, 'lat'],
                data.loc[idx, 'long'],
                elevation=data.loc[idx, 'altitude'],
                time=data.loc[idx, 'time']
            ))

        return str(gpx.to_xml())
    except Exception as e:
        print('[STRAVA][ACTIVITY] Failed getting activity gpx data!')
        print(e)
        return ''


# END
