package chatapp.Protocol;

import chatapp.Controller.ChatApp;
import chatapp.Model.Utilisateur;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.HashMap;

/**
 * <p>
 * Classe representant les échanges HTTP entre un utilisateur distant et le servlet.
 * </p>
 */
public class HttpEchange {

    private String url = "http://192.168.1.72:8080/JavaEEHelloWorld_war_exploded/"; //Correspond à l'url de notre serveur de presence
    private static boolean connecte = false; // True si l'utilisateur peut se connecter avec ce nom d'utilisateur , False sinon
    private ChatApp chatapp;

    /**
     * <p> Constructeur de la classe HttpEchange</p>
     * @param chatapp La methode prend toujours en argument un paramètre chatApp associé à un utilisateur.
     */
    public HttpEchange(ChatApp chatapp){
        this.chatapp = chatapp;
    }

    /**
     * <p> Cette méthode permet de communiquer avec le servlet grâce à des requetes http de type Post.</p>
     * @param type Le type de message ("Connexion", "Changement de pseudo" , "Deconnexion") ainsi que les parametres associés
     * @return True ou False selon la réponse a chaque type de message envoyé.
     * @throws IOException
     * @throws InterruptedException
     */
    public boolean sendPost(String type)  throws IOException, InterruptedException{
        boolean reussi = false ;
        /*---------------------------------CONNEXION---------------------------------*/
        if (type.equals("Connexion")){
            System.out.println("Tentative de connexion distante");
            HttpClient client = HttpClient.newHttpClient();
            String requestBody = "Connexion\n" + this.chatapp.getMe().toString() ;
            HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create(url))
                    .POST(HttpRequest.BodyPublishers.ofString(requestBody))
                    .build();

            HttpResponse<String> response = client.send(request,
                    HttpResponse.BodyHandlers.ofString());

            /* Partie réponse du servlet */
            if(response.body().equals("")){
                System.out.println("Reponse recue vide");
            }
            else {
                switch (response.body().split("\n")[0]){
                    case "Reponse Connexion":
                        reussi = Boolean.parseBoolean(response.body().split("\n")[1]);
                        System.out.println("Connexion acceptee");
                        int max = response.body().split("\n").length ;
                        if (max > 2 ){
                            for (int i = 2 ; i < max ; i++){
                                String suite = response.body().split("\n")[i];
                                // Le server nous envoie les utilisateurs connectés en local ou à distance
                                if (!suite.equals("")){
                                    this.chatapp.getActifUsers().addList(Utilisateur.stringToUtilisateur(suite));
                                }
                            }
                        }
                        break;
                    default:
                        System.out.println("Erreur dans le format de la réponse reçue");
                }
            }
        }
        /*---------------------------------DECONNEXION---------------------------------*/
        else if(type.equals("Deconnexion")){
            System.out.println("Tentative de deconnexion distante");
            HttpClient client = HttpClient.newHttpClient();
            String requestBody = "Deconnexion\n" + this.chatapp.getMe().toString() ;
            HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create(url))
                    .POST(HttpRequest.BodyPublishers.ofString(requestBody))
                    .build();

            HttpResponse<String> response = client.send(request,
                    HttpResponse.BodyHandlers.ofString());

            /* Partie réponse du servlet */
            if(response.body().equals("")){
                System.out.println("Reponse recue vide");
            }
            else {
                System.out.println(response.body());
                if(response.body().contains("Deconnexion")){
                    reussi = true;
                    System.out.println("Deconnexion acceptee");
                }
            }
        }
        /*---------------------------------PSEUDO---------------------------------*/
        /*---------------------------Le nouveau pseudo----------------------------*/
        else if(type.contains("Pseudo")){
            String nouveau = type.split(" ")[1];
            System.out.println("Tentative de modification de pseudo d'un hote distant");
            HttpClient client = HttpClient.newHttpClient();
            String requestBody = "Pseudo\n" + this.chatapp.getMe().toString() + "\n" + nouveau;
            HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create(url))
                    .POST(HttpRequest.BodyPublishers.ofString(requestBody))
                    .build();

            HttpResponse<String> response = client.send(request,
                    HttpResponse.BodyHandlers.ofString());

            /* Partie réponse du servlet */
            if(response.body().equals("")){
                System.out.println("Reponse recue vide");
            }
            else {
                System.out.println(response.body());
                switch (response.body().split("\n")[0]) {
                    case "Reponse Pseudo":
                        reussi = Boolean.parseBoolean(response.body().split("\n")[1]);
                        System.out.println("Connexion acceptee");
                        break;
                    default:
                        System.out.println("Erreur dans le format de la réponse reçue");
                }
            }
        }
        else{
            System.out.println("Erreur de type");
        }
        return reussi;
    }



    /**
     * Getter : Connecte
     * @return Le boolean connecté (True s'il peut se connecter avec ce nom d'utilisateur , False sinon)
     */
    public static Boolean getConnecte() {
        return connecte;
    }

    /**
     * Setter : Connecte
     * @param value La nouvelle valeur du boolean de connexion
     */
    public static void setConnecte(Boolean value) {
        connecte = value ;
    }
}
