import asyncio
import websockets
import json
import mysql.connector
import random
import string
from datetime import datetime

tiempo_qr = 15

mydb = mysql.connector.connect(
    host='localhost',
    user='root',
    password='',
    database='qrWS'
)

conexiones = {}

def generar_string_aleatorio(longitud):
    return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(longitud))

def cambioQR(id_conexion,v_qr): 
    
    mydb = mysql.connector.connect(
        host='localhost',
        user='root',
        password='',
        database='qrWS'
    )
    
    mycursor = mydb.cursor()
    sql = f'DELETE FROM `qr` WHERE id = {id_conexion}'
    mycursor.execute(sql)
    mydb.commit()

    sql = 'INSERT INTO `qr`(`id`, `qr`, `timer`) VALUES (%s,%s,%s)'
    fecha_hora = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    mycursor.execute(sql, (id_conexion, v_qr, fecha_hora))
    mydb.commit()
    mydb.close()

async def handle_connection(websocket):
    data = await websocket.recv()
    id_conexion = json.loads(data)['id_s']
    
    mydb = mysql.connector.connect(
        host='localhost',
        user='root',
        password='',
        database='qrWS'
    )

    mycursor = mydb.cursor()
    sql = f"SELECT * FROM `usr` WHERE id = {id_conexion}"
    mycursor.execute(sql)
    usr = mycursor.fetchone()
    mydb.close()

    if len(usr) != 0:
        v_qr = generar_string_aleatorio(10)
        
        mydb = mysql.connector.connect(
            host='localhost',
            user='root',
            password='',
            database='qrWS'
        )

        mycursor = mydb.cursor()
        sql = f'DELETE FROM `qr` WHERE id = {id_conexion}'
        mycursor.execute(sql)
        mydb.commit()

        sql = 'INSERT INTO `qr`(`id`, `qr`, `timer`) VALUES (%s,%s,%s)'
        fecha_hora = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        mycursor.execute(sql, (id_conexion, v_qr, fecha_hora))
        mydb.commit()
        mydb.close()

        qr = {'qr': v_qr}
        await websocket.send(json.dumps(qr))

        conexiones[id_conexion] = websocket
        print(f"Conexión establecida con {id_conexion}")

        async def enviar_qr():
            while True:
                try:
                    await asyncio.sleep(tiempo_qr)
                    v_qr = generar_string_aleatorio(10)
                    cambioQR(id_conexion,v_qr)
                    qr = {
                        'qr': v_qr
                          }
                    await websocket.send(json.dumps(qr))
                except websockets.exceptions.ConnectionClosedOK:
                    print('Conexión cerrada')
                    break

        tarea = asyncio.create_task(enviar_qr())
        while True:
            try:
                mensaje = await websocket.recv()
            except websockets.exceptions.ConnectionClosedOK:
                print('Conexión cerrada')
                del conexiones[id_conexion]
                tarea.cancel()
                break

async def main():
    async with websockets.serve(handle_connection, "192.168.0.100", 821):
        print("Servidor iniciado en 192.168.0.100:821")
        await asyncio.Future()  # Mantener el servidor en ejecución
        


asyncio.run(main())