/*
  But :    partie worker de l'index, surtout utilisé pour les recherches
  Auteur : Luca Dias Madeira
  Date :   20.06.2021 / V1.9
*/
class Research {

    //constructor de la classe
    constructor() {
        this.listeCategories = ""; //contiendra la liste des catégories pour les cocktails
        this.listeFirstLetter = ""; //contiendra la liste des lettres de l'alphabet
        this.listeGlasses = ""; //contiendra la liste des verres qu'utilisent les cocktails
        this.cocktailfilters = ""; //contiendra la liste des filtres de recherche de cocktails
        this.ingredientfilters = ""; //contiendra la liste des filtres de recherche de cocktails
    }

    //permet d'obtenir la liste de catégories (premier élément dans le constructeur)
    obtainCategory() {

        //préparation de quelques variables
        let reponse; //utilisé comme référence au retour de l'ajax
        var a; //servira à explorer le JSON reçu

        let settings = { //paramètres de l'ajax
            "url": "https://www.thecocktaildb.com/api/json/v1/1/list.php?c=list",
            method: "GET",
            async: false //permet de faire que l'ajax doit finir pour utiliser la page. ATTENTION : mauvaise pratique en générale, ici cela fut fait pour gagner en simplicité de codage
        }
        let total = ""; //valeur qui sera retournée pour passer la liste
        $.ajax(settings).done(function (reponse) {
            a = reponse.drinks;
            let longueur = a.length;
    
            //récolte de la première valeur, celle sélectionnée par défaut 
            for (let i = 0; i < longueur; i++) {
                const drink = a[i];
    
            }
            let contenu = '<option select value='+"'"+(a[0].strCategory)+"'"+'>'+(a[0].strCategory)+'</option>'; 
            
            //récolte des autres valeurs
            for (let i = 1; i < reponse.drinks.length; i++) {
                contenu = contenu + '<option value='+"'"+(a[i].strCategory)+"'"+'">'+(a[i].strCategory)+'</option>';
            }

            //ajout de la valeur dans une qui est retournable
            total = contenu;
        });

        return total;
    }
    
    //permet d'obtenir la liste alphabétique (troisième élément dans le constructeur)
    obtainFirstLetter() {
        let content = '<option select value='+"'"+"a"+"'"+'>'+"a"+'</option>';
        let alphabet = "bcdefghijklmnopqrstuvwxyz";
        for (let i = 0; i < alphabet.length; i++) {
            content =  content + '<option value='+"'"+(alphabet.charAt(i))+"'"+'>'+(alphabet.charAt(i))+'</option>';
        }
        return content;
    }
    
    //permet d'obtenir la liste des verres (second élément dans le constructeur)
    obtainGlass() {

        //préparation de quelques variables
        let reponse2 = ""; //utilisé comme référence au retour de l'ajax
        let a2 = ""; //servira à explorer le JSON reçu


        let settings2 = { //paramètres de l'ajax
            url: "https://www.thecocktaildb.com/api/json/v1/1/list.php?g=list",
            method: "GET",
            async: false //permet de faire que l'ajax doit finir pour utiliser la page. ATTENTION : mauvaise pratique en générale, ici cela fut fait pour gagner en simplicité de codage
        }
        let total = ""; //valeur qui sera retournée pour passer la liste
        $.ajax(settings2).done(function (reponse2) {
            a2 = reponse2.drinks;
            let longueur = a2.length;
            for (let i = 0; i < longueur; i++) {
                const drink = a2[i];
            }
            let contenu3 = '<option select value='+"'"+(a2[0].strGlass)+"'"+'>'+(a2[0].strGlass)+'</option>';
                
            for (let i = 1; i < reponse2.drinks.length; i++) {
                contenu3 = contenu3 + '<option value='+"'"+(a2[i].strGlass)+"'"+'">'+(a2[i].strGlass)+'</option>';
            }
            total = contenu3;
        });
        return total;
    }
    
    //permet d'obtenir la liste des filtres à cocktails (quatrième élément dans le constructeur)
    obtainCocktailFilters() {
        //ici on récolte la liste depuis un fichier txt (un beans aurait été préférable à cette méthode)
        let total = "";
        $.get({
            url: "txt/cocktailfilters.txt",
            async: false
        }, function(data) {
        let content = data;
        total = content;
        }, 'text');
        return total;
    }
    
    //permet d'obtenir la liste des filtres à ingrédients (cinquième élément dans le constructeur)
    obtainIngredientFilters() {
        //ici on récolte la liste depuis un fichier txt (un beans aurait été préférable à cette méthode)
        let total = "";
        $.get({
            url: "txt/ingredientfilters.txt",
            async: false
        }, function(data) {
        let content = data;
        total = content;
        }, 'text');
        return total;
    }
    
    //permet de montrer la liste des filtres correspondant à ce qui est recherché (cocktail ou ingrédient)
    showfilters(whatToSearch) {
        //création de la variable ayant le total du retour
        let whatAsFilter;
        //mettre valeur par défaut pour le filtre et les autres input
        switch (whatToSearch.value) {
            case "cocktail":
                whatAsFilter = function(ctrl) {
                    $('#whatAsFilter').prop('disabled', false);
                    //changement des options disponibles
                    $("#whatAsFilter").html(ctrl.research.cocktailfilters);
                }
                break;
            case "ingredient":
                whatAsFilter = function() {
                    $('#whatAsFilter').prop('disabled', false);
                    //changement des options disponibles
                    $("#whatAsFilter").html(ctrl.research.ingredientfilters);
                }
                break;
            default: //pour le "find..." qui n'existe plus, mais existe dans le code en prévention de problèmes
                whatAsFilter = function() {
                    $('#whatAsFilter').attr('disabled','disabled');
                }
                break;
        }
        return whatAsFilter;
    }

    //modifie indication selon le filtre choisi, selon les classes du filtre
    adaptindication(choosenClassReference, isFilter) {
    
        //vérification de quelle classe est présente :
        let classechoisie = this.obtainOptionClass(choosenClassReference);
        let varToReturn;
        let changeIndication;
        let commandsForFilters;
    
        switch (classechoisie) {
            case "noIndication":
                changeIndication = function(ctrl) {
                    //mettre en disabled
                    $("#whatForIndication").prop('disabled', true);
                }
                break;
            case "limitedIndications":
                changeIndication = function(ctrl) {
                    $("#indicationInput").html('<select name="whatAsFilterSELECT" id="whatAsFilter">'+ ctrl.research.listeCategories +'</select>');
                }
                break;
            case "oneLetterOnly":
                changeIndication = function(ctrl) {
                    $("#indicationInput").html('<select name="whatAsFilterSELECT" id="whatAsFilter">'+ ctrl.research.listeFirstLetter +'</select>');
                }
                break;
            case "searchByGlass":
                changeIndication = function(ctrl) {
                    $("#indicationInput").html('<select name="whatAsFilterSELECT" id="whatAsFilter">'+ ctrl.research.listeGlasses +'</select>');
                }
                break;
            case "numberOnlyIndication":
                changeIndication = function(ctrl) {
                    let oninput = 'oninput="'+"validity.valid||(value='');"+'"';
                    let indication = "exemple: ";
                    switch (document.getElementById("whatToSearch")) {
                        case "ingredient":
                            indication = indication + "552";
                            break;
                        default:
                            indication = indication + "11007";
                            break;
                    }
                    $("#indicationInput").html('<input type="number" min="0" step="1" '+oninput+' size="20" id="whatForIndication" name="whatForIndication" placeholder="'+indication+'">');
                }
                break;
           default:
                changeIndication = function() {
                    console.log("rien à faire !");
                }
                //tout bon déjà
                break;
        }

        if (isFilter) {
            commandsForFilters = function() {
                $("#rechercherbtn").html('<a href="#search" class="redsearch" onclick="ctrl.recherche();">SEARCH (less infos) </a>');
                $("#indicationInput input").attr("placeholder","NO SEARCH IF EMPTY");
            }
        } else {
            commandsForFilters = function() {
                $("#rechercherbtn").html('<a href="#search" onclick="ctrl.recherche();">SEARCH</a>');
            }
        }

        varToReturn = [changeIndication, commandsForFilters];
        return varToReturn;
    }

    //obtenir la (dernière) classe d'un objet si elle est dans la liste (liste correspondante aux différents types de recherches)
    obtainOptionClass(classes) {
        const verification = ["noIndication","limitedIndications","oneLetterOnly","searchByGlass","numberOnlyIndication"];
                let classechoisie = "";
                if (classes !== undefined) {
                    const res = classes.split(" ");
                    res.forEach(element => {
                        verification.forEach(element => {
                            if (classes.indexOf(element) > -1) {
                                classechoisie = element;
                            }
                        });
                    });
                }
        return classechoisie;
    }

    //retourne une indication de quelle méthode de recherche est à utiliser pour la recherche actuelle
    rechercher(ctrl, urlResearchType, classechoisieParam, urlParamSelectorIndicators, urlParamDefaultValue, whatToSearch) {
        //préparation de  la valeur de retour
        let varToReturn;
        let searchtype;

        //base de l'url
        let urlBase = "https://www.thecocktaildb.com/api/json/v1/1/";

        //paramètres de la recherche URL, s'il y en a
        let classechoisie = this.obtainOptionClass(classechoisieParam);
        let urlParam;
        switch (classechoisie) {
            case "noIndication": //  a) si disabled:
            urlParam = "";
                break;
            case "limitedIndications":
            case "oneLetterOnly":
            case "searchByGlass": //  b) si select:
                urlParam = urlParamSelectorIndicators;
                break;
            default: //  c) si champ de texte:
                urlParam = urlParamDefaultValue;
                break;
        }

        //url total
        let url = urlBase + urlResearchType + urlParam;

        //choix selon la requête (classe du filtre + valeur du premier select)
        let mustSearchForCocktail = true;
        let multipleResults = true;

        //voir si on veut à la place chercher un ingrédient
        if (whatToSearch === "ingredient") {
            mustSearchForCocktail = false;
        }

        //voir si on veut à la place avoir un seul résultat
        let ras = classechoisieParam
        if (ras !== undefined) {
            let res = ras.split(" ");
            if (res.length > 1) {
                res.forEach(element => {
                    if (element === "oneElementResult") {
                        multipleResults = false;
                    }
                });
            }
        }

        //donne le type de recherche à faire
        switch (mustSearchForCocktail) {
            case true:
                switch (multipleResults) {
                    case true:
                        searchtype = "multipleCocktails";
                        break;
                
                    default:
                        searchtype = "singleCocktail";
                        break;
                }
                break;

            default:
                searchtype = "singleIngredient";
                break;
        }
        varToReturn = {
            url: url,
            type: searchtype
        };
        return varToReturn;
    }

    //donne le résultat de la recherche et la passe à la méthode correspondante dans ctrl (ici pour plusieurs cocktails) 
    obtainMultipleCocktailResults(theUrl, afficherPlusieursCocktails, obtentionEnFiltre) {
        let reponse = "";
        let a = "";
        let settings = {
            url: theUrl,
            method: "GET",
            success: function (data) {
                let isFilter = obtentionEnFiltre;
                afficherPlusieursCocktails(data, isFilter);
            }
        }
        $.ajax(settings);
    }

    //donne le résultat de la recherche et la passe à la méthode correspondante dans ctrl (ici pour un seul cocktail)
    obtainSingleCocktailResult(theUrl, afficherUniqueCocktail, afficherPetitsIngredients) {
        let settings = {
            url: theUrl,
            method: "GET",
            success: function (data) {
                let nextStep = afficherPetitsIngredients;
                afficherUniqueCocktail(data, nextStep);
            }
        }
        $.ajax(settings);
    }

    //donne le résultat de la recherche et la passe à la méthode correspondante dans ctrl (ici pour un seul ingrédient)
    obtainSingleIngredientResult(theUrl, afficherUniqueIngredient, afficherPetitsCocktails) {
        let a = this.obtainSmallCocktailsResults;
        let settings = {
            url: theUrl,
            method: "GET",
            success: function(data) {
                let nextStep = afficherPetitsCocktails;
                let StepAfterThat = a;
                afficherUniqueIngredient(data, nextStep, StepAfterThat);
            }
        }
        $.ajax(settings);
    }
    
    //donne le résultat d'une partie de la recherche et la passe à la méthode correspondante dans ctrl (ici pour plusieurs cocktails correspondants à un ingrédient)
    obtainSmallCocktailsResults(theUrl, afficherPetitsCocktails) {
        let settings = {
            url: theUrl,
            method: "GET",
            success: function(data) {
                afficherPetitsCocktails(data);
            }
        }
        $.ajax(settings);
    }


    //pour lancer une recherche depuis un lien dans les résultats de recherches
    showDetails(whatIsIt, elementReference, ctrl) {
        if (elementReference !== undefined) {
            $(".pg2").html("");
            $(".pg3").html("");
            let url = 'https://www.thecocktaildb.com/api/json/v1/1/';

            switch (whatIsIt) {
                case 0://"drink"
                    url += 'lookup.php?i='+elementReference;
                    ctrl.rechercherUnCocktail(url);
                    break;
            
                case 1://"ingredient"
                    url += 'search.php?i='+elementReference;
                    ctrl.rechercherUnIngredient(url);
                    break;

                case 2://"category"
                    url += 'filter.php?c='+elementReference;
                    ctrl.rechercherPlusieursCocktails(url);
                    break;
                    
                case 3://"glass"
                    url += 'filter.php?g='+elementReference;
                    ctrl.rechercherPlusieursCocktails(url);
                    break;

                default:
                    break;
            }
        }
    }

}

      