import gzip
import PySimpleGUI as sg
import os
# Fonction pour compresser le fichier HTML
def compresser_html(html_file_path, gzip_file_path):
    try:
        with open(html_file_path, 'rb') as f_in:
            with gzip.open(gzip_file_path, 'wb') as f_out:
                f_out.writelines(f_in)
        #sg.popup('Compression réussie!')
    except Exception as e:
        sg.popup_error(f"Erreur lors de la compression : {e}", icon=sg.SYSTEM_TRAY_MESSAGE_ICON_CRITICAL)
# Fonction pour lire le fichier compressé et le convertir en tableau de uint8_t
def lire_gzip(gzip_file_path):
    try:
        with open(gzip_file_path, 'rb') as f:
            return f.read()
    except Exception as e:
        sg.popup_error(f"Erreur lors de la lecture du fichier gzip : {e}", icon=sg.SYSTEM_TRAY_MESSAGE_ICON_CRITICAL)
        return None
# Fonction pour écrire le tableau dans un fichier .h
def ecrire_header(header_file_path, byte_array, array_name):
    try:
        with open(header_file_path, 'w') as f:
            f.write(f'#ifndef {array_name.upper()}_H\n')
            f.write(f'#define {array_name.upper()}_H\n\n')
            f.write('#include <stdint.h>\n\n')
            f.write(f'const uint8_t {array_name}[] = {{')
            f.write(', '.join(f'0x{byte:02x}' for byte in byte_array))
            f.write('};\n\n')
            f.write(f'const size_t {array_name}_len = {len(byte_array)};\n\n')
            f.write(f'#endif // {array_name.upper()}_H\n')
        #sg.popup('Fichier header créé avec succès!')
    except Exception as e:
        sg.popup_error(f"Erreur lors de l'écriture du fichier header : {e}", icon=sg.SYSTEM_TRAY_MESSAGE_ICON_CRITICAL)
        return False
    return True
# Fonction pour supprimer le fichier compressé
def supprimer_fichier(fichier_path):
    try:
        os.remove(fichier_path)
        #sg.popup('Fichier compressé supprimé avec succès!')
    except Exception as e:
        sg.popup_error(f"Erreur lors de la suppression du fichier compressé : {e}", icon=sg.SYSTEM_TRAY_MESSAGE_ICON_CRITICAL)
# Définir la mise en page de l'interface graphique
sg.theme('TanBlue')  # Choisir un thème
tab1_layout = [
    [sg.Text('Chemin vers le fichier HTML', size=(22, 1), font=('Helvetica', 12, 'bold')), sg.InputText(key='html_file', font=('Helvetica', 12, 'bold')), sg.FileBrowse(font=('Helvetica', 12, 'bold'))],
    [sg.Button('Compresser et Convertir', size=(22, 1),font=('Helvetica', 12, 'bold')), sg.Button('Quitter', size=(10, 1), font=('Helvetica', 12, 'bold'))],
    [sg.Multiline(size=(100, 20), key='header_content', disabled=True, font=('Helvetica', 10, 'bold'))]
]
tab2_layout = [
    [sg.Text('Exemple', font=('Helvetica', 12, 'bold'))],
    [sg.Radio('Asynchrone', 'mode', key='asynchrone', font=('Helvetica', 12)), sg.Radio('Synchrone', 'mode', key='synchrone', font=('Helvetica', 12))],
    [sg.Button('Générer', size=(10, 1))],
    [sg.Multiline(size=(100, 20), key='integration_example', disabled=True, font=('Helvetica', 10, 'bold'))]
]
layout = [
    [sg.TabGroup([[sg.Tab('Compression', tab1_layout), sg.Tab('Exemple d\'intégration', tab2_layout, visible=False)]], key='tabs', font=('Helvetica', 14, 'bold'))]
]
# Créer la fenêtre
window = sg.Window('Compresser HTML et Convertir en Header', layout, finalize=True)
# Masquer l'onglet "Exemple d'intégration" au démarrage
window['tabs'].Widget.tab(1, state='hidden')
# Boucle d'événements
while True:
    event, values = window.read()
    if event == sg.WINDOW_CLOSED or event == 'Quitter':
        break
    if event == 'Compresser et Convertir':
        html_file_path = values['html_file']
        if not os.path.isfile(html_file_path):
            sg.popup_error("Le fichier HTML spécifié n'existe pas.", icon=sg.SYSTEM_TRAY_MESSAGE_ICON_CRITICAL)
            continue
        gzip_file_path = html_file_path + '.gz'
        base_name = os.path.splitext(os.path.basename(html_file_path))[0]
        header_file_path = os.path.join(os.path.dirname(html_file_path), base_name + '_html.h')
        array_name = base_name
        
        compresser_html(html_file_path, gzip_file_path)
        byte_array = lire_gzip(gzip_file_path)
        if byte_array:
            if ecrire_header(header_file_path, byte_array, array_name):
                supprimer_fichier(gzip_file_path)
                with open(header_file_path, 'r') as f:
                    header_content = f.read()
                window['header_content'].update(header_content)
                sg.popup('Conversion terminée!')
                window['tabs'].Widget.tab(1, state='normal')  # Afficher l'onglet "Exemple d'intégration"
    if event == 'Générer':
        mode = 'Asynchrone' if values['asynchrone'] else 'Synchrone'
        if mode == 'Synchrone':
            example_code = f"""#include <Arduino.h>
#include <WiFi.h>
#include <WebServer.h>
#include "{base_name}_html.h"
const char* ssid = "VOTRE_SSID";
const char* password = "VOTRE_PASSWORD";
WebServer server(80);
void handleRoot() {{
    server.sendHeader("Content-Encoding", "gzip");
    server.send_P(200, "text/html", (const char*){array_name}, {array_name}_len);
}}
void setup() {{
    Serial.begin(115200);
    Serial.print("Connexion au réseau : ");
    Serial.println(ssid);
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {{
        delay(1000);
        Serial.print(".");
    }}
    Serial.println();
    Serial.print("Connecté au WiFi, IP: ");
    Serial.println(WiFi.localIP());
    // Définir la route pour servir la page HTML décompressée
    server.on("/",handleRoot);
    server.begin();
}}
void loop() {{
    server.handleClient();
}}"""            
        else:
            example_code = f"""#include <Arduino.h>
#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include "{base_name}_html.h"
const char* ssid = "VOTRE_SSID";
const char* password = "VOTRE_PASSWORD";
AsyncWebServer server(80);
void setup() {{
    Serial.begin(115200);
    delay(1000);
    Serial.println();
    Serial.print("Connexion au réseau : ");
    Serial.println(ssid);
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {{
        delay(1000);
        Serial.print(".");
    }}
    Serial.println();
    Serial.print("Connecté au WiFi, IP: ");
    Serial.println(WiFi.localIP());
    // Définir la route pour servir la page HTML décompressée
    server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {{
        AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", {array_name}, {array_name}_len);
        response->addHeader("Content-Encoding", "gzip");
        request->send(response);
    }});
    server.begin();
}}
void loop() {{
    // Rien à faire ici
}}"""
        window['integration_example'].update(example_code)
window.close()