import os
import socket
import time
import json
import random
#import IA_Generate

host = '127.0.0.1'
port = 3001
# Attendre 1 seconde
time.sleep(1)

# Créer un objet socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Se débarrasser du message d'erreur "ConnectionRefusedError: [Errno 111] Connection refused"
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# Se débarrasser du message d'erreur "Address already in use"
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# Se connecter au serveur Node.js
s.connect((host, port))

socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE = (1024 * 1024 * 1024)

s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 2 ^ 20)  # Buffer size = 1MB

# Envoyer des données au serveur
message = 'Bonjour, serveur!'
print('Envoi de:', message)
s.send(message.encode())  # Envoyer le message encodé en bytes

#IA_Generate.init_gpu()

while True:
    # Recevoir les données du serveur
    web_data_receive = s.recv(1024)  # Recevoir jusqu'à 1024 bytes

    if web_data_receive:
        print('Données reçues:',
              web_data_receive.decode())  # Décoder les bytes en string

        web_data = json.loads(web_data_receive.decode())

        web_data_info = web_data['ID']
        web_data_Prompt = web_data['Prompt']
        web_data_Prompt_NB_img = web_data['Prompt_NB_img']
        web_data_Prompt_Width = web_data['Prompt_Width']
        web_data_Prompt_Height = web_data['Prompt_Height']
        web_data_Prompt_Seed = web_data['Prompt_Seed']
        web_data_Prompt_Neg_Promt = web_data['Prompt_Neg_Promt']
        web_data_Prompt_Guidance = web_data['Prompt_Guidance']
        web_data_Prompt_Step = web_data['Prompt_Step']
        web_data_Utilisateur = web_data['Utilisateur']

        print('Données reçues:', web_data)  # Décoder les bytes en string

        # Envoyer des données au serveur
        message = 'Accusé de réception'
        # s.send(message.encode())  # Envoyer le message encodé en bytes

        # Envoyer les images comtenues dans le dossier "images-IA-py" au serveur node.js
        if web_data_info == 'images':
            print('Génération des images...')
            time.sleep(30)
            #IA_Generate.generate_image(web_data_Prompt, web_data_Prompt_Neg_Promt, web_data_Prompt_Width, web_data_Prompt_Height, web_data_Prompt_Guidance, web_data_Prompt_Seed, web_data_Prompt_Step, web_data_Prompt_NB_img, web_data_Utilisateur)
            print('Envoi des images au serveur...')
            # Lire les images
            images = os.listdir(
                '/home/gaetan/Bureau/SAE_4/python/images-IA-py/')
            for image in images:
                # Envoyer les images
                with open(
                        '/home/gaetan/Bureau/SAE_4/python/images-IA-py/' +
                        image, 'rb') as f:
                    image_data = f.read()
                    # Envoi de la taille du fichier
                    s.sendall(len(image_data).to_bytes(4, byteorder='big'))
                    time.sleep(0.1)
                    # Envoi du contenu du fichier
                    s.sendall(image_data)
                print('Image envoyée:', image)
                time.sleep(0.1)
                f.close()
            # envoyer le nom de l'utilisateur (int)
            utilisateur='utilisateur:'+str(web_data_Utilisateur)
            s.send(utilisateur.encode())
            #time.sleep(0.1)
            f.close()
            #gernerer une seed aléatoire pour les tests
            seed=random.randint(0, 1000000000)
            seed='seed:'+str(seed)
            s.send(seed.encode())
            #time.sleep(0.1)
            f.close()
            print('Envoi des images terminé.')
            gpu_status = 'GPU disponible'
            s.send(gpu_status.encode())  # Envoyer le message encodé en bytes
            f.close()

    if message == 'Fin':
        print('Fermeture de la connexion.')
        break

# Fermer la connexion
s.close()