""" importa llibreries: """
import socket                  # la llibreria socket de MicroPython permet crear i gestionar servidors web
import miwifi                  # la nostra definició de la connexió a WiFi, desada a la carpeta lib del dispositiu
from machine import Pin        # importar la classe Pin

led = Pin (23, Pin.OUT)        # configurar el pin de connexió del LED

""" configuració del servidor: """
servidor = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # crea un objecte socket que he anomenat servidor
servidor.bind(('', 80))    # enllaça el sòcol amb l'adreça IP de l'ESP32 ('') i el port 80 (port per defecte per al protocol HTTP)
servidor.listen(5)         # permet que el servidor accepti peticions. 5 és el nombre màxim de connexions permeses

""" definició de la resposta del servidor a les peticions dels clients, que serà en format pàgina web: """
def pag_web( ):            # funció que conté una variable que anomenaré html. El seu valor serà el codi HTML de la pàgina web de resposta
    # utilitzarem una variable estat_led per definir l'estat del led
    if led.value( ) == 1:
        estat_led = "ON"
    else:
        estat_led = "OFF"

    html = """<html>
    <head><title>ESP32 Servidor Web</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style>html {text-align: center; font-family: Helvetica; margin: 10px auto;}
    p {font-size: 20px;} </style></head>
    <body><h1>Mi Servidor</h1>
    <p><strong>Hola, """ + addr[0]+ """</strong></p>
    <!-- nou codi a afegir: -->
    <p>estat LED: """ + estat_led + """</p>  <!-- la pàgina retornarà el valor de la variable estat_led -->
    <p><a href="/?led=on">ON</a></p> <!-- a href indica enllaç a una URL -->
    <p><a href="/?led=off">OFF</a></p>
    </body></html>"""
    return html            # per poder utilitzar la variable fora de la funció en que està definida

""" execució de la connexió a WiFi, definida en la funció connecta_wifi a l'arxiu miwifi.py: """
miwifi.connecta_wifi( )

""" escolta les sol·licituds i envia respostes: """
while True:
    conn, addr = servidor.accept( )            # quan un client es connecti, accepta la connexió
    addr = str(addr)                           # cal convertir el format a cadena de caracters (string)
    print ('Nova connexió des de', addr)       # imprimeix l'adreça del client, desada com str en la variable addr
    # conn: nou sòcol per escoltar les sol·licituds entrants i enviar el text HTML com a resposta
    # addr: variable on es desa l'adreça del client que es vol connectar al servidor

    peticio = conn.recv(1024)                  # desa la sol·licitud rebuda al sòcol en la variable peticio
    # l'argument 1024 especifica el màxim de dades que es poden rebre alhora
    peticio = str (peticio)                    # cal transformar el format a string perquè s'entingui després
    print (peticio)                            # imprimeix el contingut de la sol·licitud
    print ('==========')                       # separador per llegir millor a la consola

    # cal afegir la interacció amb el led en funció del botó premut a la pàgina web:
    # Al mètode GET, la informació enviada s'inclou a continuació de la URL després dels símbols /?
    led_on = peticio.find ('/?led=on')    
    led_off = peticio.find ('/?led=off')
    if led_on == 6:
        print ('LED ON')
        led.value (1)
    if led_off == 6:
        print ('LED OFF')
        led.value (0)

    # envia la resposta al client:
    conn.send ('HTTP/1.1 200 OK\n')            # codi de resposta HTTP (200: estat satisfactori) \n indica salt de línia
    conn.send ('Content-Type: text/html\n')
    conn.send ('Connection: close\n\n')
    conn.sendall (pag_web())                   # envia com a resposta el text html retornat per la funció pag_web 
    conn.close( )                              # tanca el sòcol creat