import os
import json
import argparse
import sys
import pathlib
from datetime import date, datetime
from garminconnect import (
        Garmin,
        GarminConnectConnectionError,
        GarminConnectTooManyRequestsError,
        GarminConnectAuthenticationError,
)

TOKEN_DIR = "/var/lib/garminconnect"
OUTPUT_DIR = "/var/www/html/garmin/heartrate"

def init_api(email: str, password: str, token_dir: str = TOKEN_DIR):
        g = Garmin()

        try:
                g.login(token_dir)
                return g
        except (FileNotFoundError, GarminConnectAuthenticationError):
                try:
                        g = Garmin(email=email, password=password)
                        g.login()
                        g.garth.dump(token_dir)
                        return g
                except Exception:
                        raise

def get_heart_rate_for_date(client: Garmin, target_date: str):

        try:
        # Get heart rate data for the specified date
                hr_data = client.get_heart_rates(target_date)

                return {
                        "status": 1,
                        "date": target_date,
                        "data": hr_data
                }

        except (GarminConnectConnectionError, GarminConnectTooManyRequestsError, GarminConnectAuthenticationError) as err:
                return {
                        "status": 0,
                        "error": f"Garmin Connect error: {str(err)}",
                        "date": target_date
                }
        except Exception as err:
                return {
                        "status": 0,
                        "error": f"Unexpected error: {str(err)}",
                        "date": target_date
                }

def main():
        parser = argparse.ArgumentParser(description="Get heart rate data from Garmin Connect.")
        parser.add_argument('--username', required=True, help='Garmin Connect username')
        parser.add_argument('--password', required=True, help='Garmin Connect password')
        parser.add_argument('--date', required=True, help='Date to get heart rate data for (YYYY-MM-DD)')
        args = parser.parse_args()

        try:
                # Validate date format
                datetime.strptime(args.date, '%Y-%m-%d')
                client = init_api(args.username, args.password)
        except Exception as e:
                print(json.dumps({"status": 0, "error": f"Initialization error: {e}"}))
                return

        result = get_heart_rate_for_date(client, args.date)

        # Save to file in OUTPUT_DIR
        filename = f"{args.date}.json"
        output_path = os.path.join(OUTPUT_DIR, filename)

        try:
                with open(output_path, 'w') as f:
                        json.dump(result, f, indent=2, default=str)
        except Exception as e:
                # If file saving fails, modify result to indicate error but still return JSON
                result = {
                        "status": 0,
                        "error": f"File save error: {e}",
                        "date": args.date
                }

        # Always return JSON
        print(json.dumps(result, indent=2, default=str))

if __name__ == "__main__":
	main()
