import asyncio
import sys
import signal
from battery import BMS

MAX_RETRIES = 5
RETRY_DELAY = 30  # seconds
battery = None
running=True

async def read_battery_data(address, delay):
    global battery
    global running
    battery = BMS(address)

    # Retry loop for connecting
    for attempt in range(MAX_RETRIES):
        try:
            await battery.connect()
            if battery.client.is_connected:
                break
        except Exception as e:
            print(f"statusFailed to connect: {e}")
        if attempt < MAX_RETRIES - 1:
            print(f"Retrying in {RETRY_DELAY} seconds...")
            await asyncio.sleep(RETRY_DELAY)
        else:
            print("Maximum connection attempts reached. Exiting.")
            return

    try:
        while running:
            if battery.client.is_connected:
                await battery.get_basic()
            else:
                print("Lost connection. Attempting to reconnect...")
                await battery.connect()
                await battery.get_basic()
                continue
            await asyncio.sleep(delay)
    finally:
        await battery.disconnect()
        
def handle_exit_signal(signum, frame):
    global running
    if battery and battery.client.is_connected:
        running = False


def main():

    signal.signal(signal.SIGTERM, handle_exit_signal)  # Handle termination signal
    signal.signal(signal.SIGINT, handle_exit_signal)   # Handle interrupt signal (Ctrl+C)
    
    if len(sys.argv) != 3:
        print("Usage: python foo.py <NAME> <DELAY_IN_SECONDS>")
        return

    device_address = sys.argv[1]
    delay = float(sys.argv[2])

    loop = asyncio.get_event_loop()
    loop.run_until_complete(read_battery_data(device_address, delay))

if __name__ == "__main__":
    main()
