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/steps"

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_steps_for_date(client: Garmin, target_date: str):

	try:
        # Get steps data for the specified date
		steps_data = client.get_steps_data(target_date)

		return {
			"status": 1,
			"date": target_date,
			"data": steps_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 steps 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 steps 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_steps_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()
