from PyWeather.weather.stations.davis import VantagePro
import logging
import mariadb
import serial.tools.list_ports
import gc
import time
from pprint import pprint


logging.basicConfig(filename="Stations.log",
                    format='%(asctime)s %(message)s',
                    filemode='a')
logger = logging.getLogger('davis_api')
logger.setLevel(logging.DEBUG)


def write_data(device, station, send=True):
    try:
        #device.parse()
        data = device.fields
        print(data)
        if len(data) < 1:
            return
        else:
            print(data)
        fields = ['BarTrend', 'CRC', 'DateStamp', 'DewPoint', 'HeatIndex', 'ETDay', 'HeatIndex',
                  'HumIn', 'HumOut', 'Pressure', 'RainDay', 'RainMonth', 'RainRate', 'RainStorm',
                  'RainYear', 'SunRise', 'SunSet', 'TempIn', 'TempOut', 'WindDir', 'WindSpeed',
                  'WindSpeed10Min']

        if send:
            placeholders = ', '.join(['%s'] * len(fields))
            field_names = ', '.join(fields)
            sql = f"INSERT INTO weather_data ({field_names}) VALUES ({placeholders})"
            values = [data[field] for field in fields]
            cursor.execute(sql, values)
            conn.commit()
        else:
            pprint(data)

        del data
        del fields
        gc.collect()
    except Exception as e:
        logger.error(str(e))
        raise e

try:
    conn = mariadb.connect(
        user="wind",
        password="wind",
        host="193.124.203.110",
        port=3306,
        database="wind_towers"
    )
    cursor = conn.cursor()
except mariadb.Error as e:
    logger.error('DB_ERR: ' + str(e))
    raise e

try:
    ports = serial.tools.list_ports.comports()
    available_ports = {}

    for port in ports:
        if port.serial_number == '0001':
            available_ports[port.name] = port.vid

    devices = [VantagePro(port) for port in available_ports.keys()]
    print(available_ports)
    while True:
        for i in range(len(devices)):
            print(devices[i].fields)
            #write_data(devices[i], 'st' + str(available_ports[list(available_ports.keys())[i]]), True)
        time.sleep(1)
except Exception as e:
    logger.error('Device_error: ' + str(e))
    raise e