#!/usr/bin/env python

import sys
import json
import datetime
import time
import sqlite3
import mysql.connector
import socket
from pyrow import pyrow as pyrow
from pyrow.ergmanager import ErgManager


print('DB verbinden')

#sql_datenbank = sqlite3.connect('/var/underergo/underergo.db', check_same_thread=False)

#sql_datenbank.execute("PRAGMA synchronous = OFF;")
#sql_datenbank.execute("PRAGMA journal_mode = MEMORY;")
#sql_datenbank.commit()

sql_datenbank = mysql.connector.connect(
  host="localhost",
  user="underergo",
  password="wD!ofgh.F8"
)

print(sql_datenbank)

count = 0
count_array = {}

def send_socket(data_dict):
    global sql_datenbank, count, count_array


    zeiger = sql_datenbank.cursor()

    try:
        json_payload = json.dumps(data_dict)

        #print(json_payload.encode());

        data = data_dict['data']
        serial = data['serial']

        #print(data['serial'])
        #count_array.append(serial)

        #print(' - ' + data['serial'] + ' - ' + len(count_array) + ' - ' + repr(count_array))

        print(serial + ' - ' + data['strokestate'] + ' - count ' + str(count) + ' - ' + str(time.time()) + ' - ' + str(datetime.datetime.now()))

        if data['strokestate'] == 'Wait for min speed' or data['strokestate'] == 'Wait for acceleration':
            count = count + 1

        if (count < 2) or ((data['strokestate'] != 'Wait for min speed') and (data['strokestate'] != 'Wait for acceleration')):
            zeiger.execute("INSERT INTO underergo.underergo_puffer (puffer_text, puffer_geraet, puffer_uebertragen, puffer_erstellt) VALUES (%s, %s, 'nein', now());", [json_payload.encode(), serial]);
            sql_datenbank.commit()

            print('gespeichert')

        if (count > 10) or ((data['strokestate'] != 'Wait for min speed') and (data['strokestate'] != 'Wait for acceleration')):
            count = 0

        #print(time.time())
        #print(time.monotonic())
    except sqlite3.Error:
        print('senden fehlgeschlagen')

        ergman.stop()
        sys.exit(1)
        os._exit(1)

def new_erg_callback(erg):
    print('new_erg_callback')

def update_erg_callback(erg):
    global sql_datenbank
    global ergman
    #print("update_erg_callback ")

    data = erg.data
    #print(data['serial'])

    send_socket(data_dict={
        'pyerg': str(erg._pyerg),
        'id': str(erg.id),
        'name': str(erg),
        'status': str(erg._status_q),
        'rate': str(erg.rate),
        'zeitstempel': str(time.time()),
        'test': "false",
        'hostname': socket.gethostname(),
        'data': erg.data,
    })

    zeiger = sql_datenbank.cursor()
    zeiger.execute("SELECT befehl_id, befehl_text, befehl_guid, befehl_uebertragen, befehl_erstellt FROM underergo.underergo_befehl WHERE befehl_uebertragen = 'nein' ORDER BY befehl_erstellt ASC;");

    rows = zeiger.fetchall()

    sql_datenbank.commit()

    if len(rows) > 0:
        print('Befehle: ', len(rows))
        for row in rows:
            befehl_array = json.loads(row[1])
            data = erg.data
            print('Geraet: ', repr(data['serial']))
            print('Antwort-geraet: ', befehl_array['geraet'])
            print('Antwort-funktion: ', befehl_array['funktion'])
            print('Antwort-Array: ', repr(befehl_array))
            print('ID ', row[0])

            if befehl_array['funktion'] == 'set_workout':
                if data['serial'] == befehl_array['geraet']:
                    erg.set_workout(program=None, workout_time=befehl_array['zeit'], distance=befehl_array['distanz'], split=befehl_array['split'], pace=befehl_array['pace'])

                    zeiger.execute("UPDATE underergo.underergo_befehl SET befehl_uebertragen = 'ja' WHERE befehl_id = '" + str(row[0]) + "';");
                    sql_datenbank.commit()

        print(time.time())

    #print("Update {}: {}".format(erg, erg.data))


def main():
    global ergman
    ergman = ErgManager(pyrow,
                        add_callback=new_erg_callback,
                        update_callback=update_erg_callback,
			check_rate=2,
			update_rate=0.5)

if __name__ == "__main__":
    main()


