import time
import os
import ssl
import socketpool
import wifi
import adafruit_minimqtt.adafruit_minimqtt as MQTT
import board
import busio
import adafruit_requests
import json
import math

aio_username = os.getenv('ADAFRUIT_AIO_USERNAME')
aio_key = os.getenv('ADAFRUIT_AIO_KEY')
alphavantage_api_key = os.getenv('ALPHAVANTAGE_API_KEY')

move_feed = aio_username + "/feeds/move_feed"

uart = busio.UART(board.GP0, board.GP1, baudrate=115200)


mag7 = [ "META" ,"AAPL", "GOOGL", "MSFT", "AMZN","NVDA", "TSLA"]

def glob_quote(symbol, requests):
    base_url = "https://www.alphavantage.co/query"
    function = "GLOBAL_QUOTE"
    params = {"function": function, "symbol": symbol,"apikey": alphavantage_api_key}
    param_string = '&'.join([f'{k}={v}' for k, v in params.items()])
    url = f"{base_url}?{param_string}"
    print(f"Loading {symbol}")

    try:
        response = requests.get(url)
        if response.status_code == 200:
            try:
                data = response.json()
                global_quote = data.get("Global Quote")
                return global_quote
            except:
                print("error")
                return None        
    except:
        print("error")
        return None


def get_pctchg(symbol, requests):
    global_quote = glob_quote(symbol, requests)
    if global_quote and "10. change percent" in global_quote:
        pctchg_s = global_quote["10. change percent"]
        return float(pctchg_s.rstrip('%'))
    return None

def stdev(data):
    n = len(data)
    mean = sum(data) / n
    var1 = sum([(x - mean) ** 2 for x in data]) / n
    std_dev = math.sqrt(var1)
    return std_dev

def stdev_uart(requests):
    print("Stdev")
    percent_changes = []
    for symbol in mag7:
        change = get_pctchg(symbol, requests)
        percent_changes.append(change)
        time.sleep(1)

    if percent_changes:
        std_dev = stdev(percent_changes)
        uartres = f"Portfolio Stdev: {std_dev:.2f}%\n"
        print(uartres.strip())
        uart.write(uartres.encode('utf-8'))


def avg_pctchg1(requests):
    print("avg percent chg")
    percent_changes = []
    for symbol in mag7:
        change = get_pctchg(symbol, requests)
        percent_changes.append(change)

        time.sleep(1)
    if percent_changes:
        average_change = sum(percent_changes) / len(percent_changes)
        uartres = f"Portfolio Chg: {average_change:.2f}%\n"
        print(uartres)
        uart.write(uartres.encode('utf-8'))


def pctchange(requests):
    print("Percent chg")
    mag7_1 = []
    for symbol in mag7:
        global_quote = glob_quote(symbol, requests)
        if global_quote and "10. change percent" in global_quote:
            pctchg_s = global_quote["10. change percent"]
            mag7_1.append(f"{symbol}: {float(pctchg_s.rstrip('%')):.2f}%")

        time.sleep(1)

    if mag7_1:
        uartres = "     ".join(mag7_1)
        print(uartres.strip())
        uart.write(uartres.encode('utf-8'))


def closeprc(requests):
    mag7_1 = []
    for symbol in mag7:
        global_quote = glob_quote(symbol, requests)
        if global_quote and "08. previous close" in global_quote:
            closing_price = global_quote["08. previous close"]
            mag7_1.append(f"{symbol}: ${float(closing_price):.2f}")

        time.sleep(1)
    if mag7_1:
        uartres = "     ".join(mag7_1) + "\n"
        print(uartres.strip())
        uart.write(uartres.encode('utf-8'))



def vol_function(symbol, requests):
    global_quote = glob_quote(symbol, requests)
    if global_quote and "06. volume" in global_quote:
        volume = global_quote["06. volume"]
        return volume


def get_vol(requests):
    mag7_1 = []
    for symbol in mag7:
        volume = vol_function(symbol, requests)
        mag7_1.append(f"{symbol}: {volume}")

    if mag7_1:
        uartres = "     ".join(mag7_1) + "\n"
        uart.write(uartres.encode('utf-8'))



def connected(client, userdata, flags, rc):
    print("Connected")
    client.subscribe(move_feed)

def disconnected(client, userdata, rc):
    print("Disconnected ")

def message(client, topic, message):
    print(f"topic: {topic}, message: {message}")
    if topic == move_feed:
        io_button = message
        print(io_button)
        if io_button == "1":
            pctchange(requests)
        elif io_button == "2":
            closeprc(requests)
        elif io_button == "3":
            avg_pctchg1(requests)

        elif io_button == "4":
            stdev_uart(requests)
        elif io_button == "5":
            get_vol(requests)



wifi.radio.connect(os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD"))
print("WiFi connected")

pool = socketpool.SocketPool(wifi.radio)
mqtt_client = MQTT.MQTT(broker=os.getenv("BROKER"), port=os.getenv("PORT"), username=aio_username, password=aio_key, socket_pool=pool, ssl_context=ssl.create_default_context())

mqtt_client.on_connect = connected
mqtt_client.on_disconnect = disconnected
mqtt_client.on_message = message

requests = adafruit_requests.Session(pool, ssl.create_default_context())

mqtt_client.connect()

while True:
    mqtt_client.loop()


