from influxdb_client import InfluxDBClient, Point
from influxdb_client.client.write_api import SYNCHRONOUS
from weather.stations.davis import VantagePro
import gc
from pprint import pprint
import time
import logging
import serial.tools.list_ports
import os
import sys
import psutil

logging.basicConfig(filename="Stations.log",
                    format='%(asctime)s %(message)s',
                    filemode='a')
logger = logging.getLogger('davis_api')
logger.setLevel(logging.DEBUG)
ef restart_program():
    try:
        p = psutil.Process(os.getpid())
        for handler in p.open_files() + p.connections():
            os.close(handler.fd)
    except Exception as e:
        logging.error(e)
    python = sys.executable
    os.execl(python,python,*sys.argv)


def write_data(device, station, send=True):
    try:
        device.parse()
        data = device.fields
        points = []
        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:
            for field in fields:
                points.append(Point(station).field(field, data[field]))
            write_api.write(bucket=bucket, record=points)
        else:
            pprint(data)
        # tables = query_api.query(f'from(bucket:"{bucket}") |> range(start: -1h)')
        del data
        del points
        del fields
        gc.collect()
    except Exception as e:
        logger.error(str(e))
        os.execl('runme.sh','')


try:
    token = "2CEePET3ss2khtjsdGrJap8mVzHhR2dRwuyK3NuFBvDgGtOMSi6Jstsrp2o-OANzD8fxB73PsTyIbqgbnokoXQ=="
    bucket = 'wind'
    org = "UlSTU"
    url = "http://influxdb.athene.tech/"
    client = InfluxDBClient(url=url, token=token, org=org)
    write_api = client.write_api(write_options=SYNCHRONOUS)
    query_api = client.query_api()
except Exception as e:
    logger.error('DB_ERR:' + str(e))

try:
    ports = serial.tools.list_ports.comports()
    available_ports = {}
    for port in ports:
#        print(port)
        if port.serial_number == '0001':
            available_ports['/dev/'+port.name] = port.vid
    # COM = 'COM8'  # '/dev/ttyUSB0'
    # COM1 = '/dev/ttyUSB1'
    # available_ports = {'/dev/ttyUSB0':'st1'}
    devices = [VantagePro(port) for port in available_ports.keys()]
 #   print(available_ports)
    while True:
        for i in range(len(devices)):
            write_data(devices[i], 'st' + str(available_ports[list(available_ports.keys())[i]]), True)
        time.sleep(15)
except Exception as e:
    logger.error('Device_error' + str(e))