/*
Initialisation
*/

const defSocket = io.connect("https://defs.opnm.net:443", {reconnection: true, auth: {token: "YOUR_TOKEN"}})
defSocket.on("connect", () => console.log("(Re)connecté au serveur de defs")).on("def", (w, t, d) => {
    // w = le mot
    // t = le dico (Bot, Robert, Larousse, Universalis, Wiktionnaire, Cordial, Encyclopedie, LeDictionnaire, Linternaute) (Error 404, 401 peuvent survenir)
    // d = tableau des définitions
    if(t === "Error 404"){
        console.log(`Définition introuvable pour ${w}${d ? `, vouliez-vous dire "${d}" ?` : ""}`)
    } else if(t === "Error 401"){
        console.log("Mauvaise requĂŞte", d)
    } else {
        console.log(`Les définitions ${t} pour le mot ${w} sont:`, d)
    }
})

/*
Usage jpp
*/

// defSocket.emit("def", word: string, dico?: string)
// ou la version objet (recommandée pour l'avenir):
// defSocket.emit("def", { word: string, dico?: string, lang?: string, reduce?: boolean })

// Params:
// dico -> sélectionne le dico (voir les exemples plus bas)
// lang ("fr" par défaut) -> sélectionne la langue (voir les exemples plus bas)
// reduce (true par défaut, lang = "fr" surtout) -> renvoie les defs de la forme canonique du mot demandé (lemmatisation) quand c'est pertinent et connu (conjug -> infinitif, féminin -> masculin, pluriel -> singulier, etc)

// renverra la première def trouvée dans cet ordre : Bot → Robert → Larousse → Universalis → Wiktionnaire → Cordial → Encyclopedie → LeDictionnaire → Linternaute
defSocket.emit("def", "test")
defSocket.emit("def", { word: "test" })
// "def_en" marche exactement pareil que "def" mais pour les defs anglaises, ordre des dicos : Bot → Oxford → Cambridge → Wordnik → Wiktionary → Collins
defSocket.emit("def_en", "ubiquitous")
defSocket.emit("def", { word: "ubiquitous", lang: "en" }) // -> autre façon de récupérer des defs anglaises, langues disponibles: fr, en

// forcer le dico, choisir parmi : Bot, Robert, Larousse, Universalis, Wiktionnaire, Cordial, Encyclopedie, LeDictionnaire, Linternaute
defSocket.emit("def", "encapsulation", "Cordial") // -> définition du Cordial
defSocket.emit("def", "sprinkler", "") // -> pareil que mettre aucun dico

// version sync (utile pour garder le contexte dans le callback), ex avec "user" ici:
// note: seulement la version objet est supportée ici pour les params
function getDef(user, word, lang, dico){
    defSocket.emit("def_sync", { word, dico, lang }, (w, t, d) => {
        if(t === "Error 404"){
            console.log(`Définition introuvable pour ${w}${d ? `, vouliez-vous dire "${d}" ?` : ""}`)
        } else if(t === "Error 401"){
            console.log("Mauvaise requĂŞte", d)
        } else {
            console.log(`Hey ${user}, les définitions ${t} pour le mot ${w} sont:`, d)
        }
    })
}
getDef("Stockfish", "kookaburra")
getDef("Stockfish", "kookaburra", "en") // -> mĂŞme chose mais en anglais

// exemples random :
defSocket.emit("def", "pachyblepharose") // -> le premier dico qui a ce mot est le Wiktionnaire
defSocket.emit("def", "biholomorphisme") // -> le dico "Bot" représente les defs complétées par d'autres sources
defSocket.emit("def", "carbune") // -> introuvable, propose "carbene" Ă  la place

defSocket.emit("def_sync", { word: "conchage" }, console.log) // -> affiche les valeurs retournées dans l'ordre (mot, dico, defs)
defSocket.emit("def_sync", { word: "conchage", dico: "Wiktionnaire" }, console.log) // -> même chose mais en forçant le dico Wiktionnaire
defSocket.emit("def_sync", { word: "conchage", dico: "Robert" }, console.log) // -> error 404 car le Robert n'a pas ce mot, le même mot est reproposé en suggestion (3ème param) parce que d'autres dicos l'ont

defSocket.emit("def_sync", { word: "ethiopienne", dico: "Cordial" }, console.log) // -> retourne la définition Cordial d'"éthiopien"
defSocket.emit("def_sync", { word: "ethiopienne", dico: "Cordial", reduce: false }, console.log) // -> retourne la définition Cordial d'"éthiopienne"
defSocket.emit("def_sync", { word: "trempeuse", dico: "Larousse" }, console.log) // -> retourne la définition Larousse de "trempeur"
defSocket.emit("def_sync", { word: "trempeuse", dico: "Larousse", reduce: false }, console.log) // -> error 404 le Larousse n'a pas la flexion "trempeuse"
defSocket.emit("def_sync", { word: "introduite", dico: "Encyclopedie", reduce: false }, console.log) // -> définition spécifique pour "introduite" au lieu du verbe "introduire"

defSocket.emit("def_sync", { word: "flabbergasting", lang: "en" }, console.log) // -> anglais
defSocket.emit("def_sync", { word: "rendezvous", lang: "en", dico: "Wordnik" }, console.log) // -> bon t'as compris