"""
Serveur Web dynamique minimaliste
 -- Choisir votre IP
 -- Choisir la valeur du PORT associé à votre serveur (8000, 8080, 9000 ...)
 -- Compléter la fonction reponse_a_GET pour qu'il gère de nouvelles requêtes GET si vous le voulez
 -- Compléter la fonction reponse_a_POST pour qu'il gère de nouvelles requêtes POST si vous le voulez
 -- Créer les pages HTML correspondantes
 -- Vérifier que code_serveur.py est bien présent dans votre dossier
 -- Lancer le script configuration.py
 
Ce code fait référence à une activité se trouvant ici :
www.infoforall.fr/act/javascript/gestion-des-formulaires-sur-le-serveur/
"""

# 1 - Importation

from http.server import HTTPServer
from code_serveur import Gestionnaire
from datetime import datetime

# 2 - Déclarations des constantes

IP = '127.0.0.1'
PORT = 9000

# 3 - Déclaration des fonctions

def reponse_a_GET(requete) :
    '''Instructions à effectuer si la requête est de type GET. requete contient les infos sur la requête'''
    
    print("::: SERVEUR ::: Reception d'une requête GET")
    
    # 1 - Récupération optionnelle des sous-informations issues de la requête
    chaine_requete = requete.requestline                  
    adresse_client = requete.obtenir_IP_client 
    port_client = requete.obtenir_PORT_client 
    chemin = requete.obtenir_chemin
    parametres = requete.obtenir_parametres        
    
    # 2 - Traitement de la requête

    if chemin == '/' :
        fichierHTML = open('www/index.html', 'r', encoding="utf-8")
        codeHTML = fichierHTML.read()
        fichierHTML.close()
        requete.creer_entete(200)
        requete.repondre(codeHTML)
        
    elif chemin == '/liste' :
        tableauHTML = "<table><tbody><tr><th>Morceau</th><th>Catégorie</th><th>Lien</th></tr>"                           
        fichierCSV = open('donnees/morceaux.csv', 'r', encoding="utf-8")
        for enregistrement in fichierCSV :
            infos = enregistrement.split(';')
            morceau = infos[0]
            url = infos[2].replace('/n','')
            categorie = infos[1]
            ligne = f"<tr><td>{morceau}</td><td>{categorie}</td><td><a href='{url}'>{url}</a></td></tr>"
            tableauHTML = tableauHTML + ligne
        fichierCSV.close()
        tableauHTML = tableauHTML + "</tbody></table>"
        codeHTML = f'''
<!DOCTYPE html>
<html>
<header>
    <link rel="stylesheet" href='monstyle.css' />
    <meta charset="utf-8" />
</header>
<body>
    <h1>Liste des morceaux enregistrés</h1>
    <p>Retour à l'<a href="/">accueil</a></p>
    {tableauHTML} 
</body>
</html>'''        
        requete.creer_entete(200)
        requete.repondre(codeHTML)
        
    else :
        codeHTML = f'''
<!DOCTYPE html>
<header>
    <link rel="stylesheet" href='monstyle.css' />
    <meta charset="utf-8" />
</header>
<html>
<body>
    <h1>Rien.</h1>
</body>
</html>'''
        requete.creer_entete(200)
        requete.repondre(codeHTML)       

def reponse_a_POST(requete) :
    '''Instructions à effectuer si la requête est de type POST. requete contient les infos sur la requête'''
    
    print("::: SERVEUR ::: Reception d'une requête POST")
    # 1 - Récupération optionnelle des informations issues de la requête
    chaine_requete = requete.requestline                  
    adresse_client = requete.obtenir_IP_client 
    port_client = requete.obtenir_PORT_client 
    chemin = requete.obtenir_chemin
    parametres = requete.obtenir_parametres
    
    # 2 - Traitement de la requête
    codeHTML = ""
                           
    if chemin == '/enregistrer' :
        if 'user' in parametres.keys() and 'pw' in parametres.keys() and parametres['pw'] == "1234franchement?" :
            enregistrement = f"{parametres['nom']};{parametres['categorie']};{parametres['adresse']}/n"
            fichierCSV = open('donnees/morceaux.csv', 'a', encoding="utf-8")
            fichierCSV.write(enregistrement)
            fichierCSV.close()                                       
            codeHTML = f'''
<DOCTYPE html>
<header>
    <link rel="stylesheet" href='monstyle.css' />
    <meta charset="utf-8" />
</header>
<html>
<body> 
<h1>Bien reçu</h1>
<p>Retour à l'<a href="/">accueil</a></p>
</body>
</html>
'''
            requete.creer_entete(200)
            requete.repondre(codeHTML)

    if codeHTML == '' :
        codeHTML = echec()    
        requete.creer_entete(200)
        requete.repondre(codeHTML) 

def echec() :
    codeHTML = f'''
<DOCTYPE html>                 
<html>
<body> 
<h1>Votre requete n'a pas pu aboutir.</h1>
<p>Retour à l'<a href="/">accueil</a></p>
</body>
</html>
'''
    return codeHTML      

def afficher(dictionnaire) :
    print("\nRéception d'une requête. Voici le dictionnaire des paramètres :")
    print(dictionnaire)
    for cle, valeur in dictionnaire.items() :
        print(f"{cle} associée à la valeur {valeur}")
    
def activer_serveur():
    '''Création et mise en route du serveur qui surveille ensuite les requêtes qu'on lui communique'''
    
    # 1 - Création de l'objet-serveur httpd
    Gestionnaire.GET = reponse_a_GET    # on définit la fonction à exécuter sur un GET
    Gestionnaire.POST = reponse_a_POST  # on définit la fonction à exécuter sur un POST      
    adresse = (IP, PORT)    
    httpd = HTTPServer(adresse, Gestionnaire) # HTTP Daemon, le gestionnaire de requêtes du serveur

    # 2 - Tentative de mise en route et surveillance des requêtes
    print(f"::: START   ::: Démarrage d'un serveur d'adresse {IP}:{PORT}. CTRL-C pour stopper")        
    httpd.serve_forever() # Démarrage et surveillance en boucle des messages arrivant au serveur
    print('::: STOP    ::: Arrêt du serveur')        
    httpd.server_close() # Arrêt du serveur 

if __name__ == '__main__':
    activer_serveur()
