From c1b63f0d3dfe1b8a1604973715cafc4b51b593b7 Mon Sep 17 00:00:00 2001
From: sacha <sachaterrasson@gmail.com>
Date: Sat, 4 Nov 2023 17:22:23 +0100
Subject: [PATCH] Ecriture de recommendation + tierces

---
 backend/src/class_user.js                 |  1 -
 backend/src/controllers/recommendation.js | 95 ++++++++++++++++++++++-
 backend/src/controllers/userController.js | 13 ++++
 3 files changed, 107 insertions(+), 2 deletions(-)

diff --git a/backend/src/class_user.js b/backend/src/class_user.js
index 8767afb..e3835bf 100644
--- a/backend/src/class_user.js
+++ b/backend/src/class_user.js
@@ -8,5 +8,4 @@ class User{
         this.movies.append(movieSeen);
     }
 
-    
 }
\ No newline at end of file
diff --git a/backend/src/controllers/recommendation.js b/backend/src/controllers/recommendation.js
index f1e8e6d..2d965dc 100644
--- a/backend/src/controllers/recommendation.js
+++ b/backend/src/controllers/recommendation.js
@@ -1,6 +1,6 @@
 
 /**
- * Cette fonction selectionne les 3 meilleurs movies d'une liste de film.
+ * Cette fonction selectionne les 3 meilleurs films d'une liste de film.
  *
  * @param {Movie[]} movies - Liste de film.
  * @returns {Movie[]} - La liste des 3 films.
@@ -24,4 +24,97 @@ function top3(movies) {
     return highestNotes;
 }
 
+/**
+ * Cette fonction selectionne les 3 meilleurs films pour un utilisateur.
+ *
+ * @param {string} user_login - Login de l'utilisateur.
+ * @returns {Movie[]} - La liste des 3 films.
+ */
+
+function recommendationForUser(user_login) {
+    let person = get_user(user_login);
+
+    let fav_styles = []; //styles des films présents dans les films aimés par l'utilisateur
+    let fav_authors = []; //auteurs récurents dans les films aimés par l'utilisateur : moyenne (auteur * note du film)
+    let fav_actors = []; //acteurs récurents dans les films aimés par l'utilisateur : moyenne (acteur * note du film (* %temps écran))
+    //let fav_duration;
+
+    let seen = person.movies;
+    let authors = getAllAuthors(seen).slice(0,3);
+    for (let i = 0; i < authors.length; i++) { 
+        fav_authors = authors[i][0]; //recuperer seulement l'auteur, pas le reste
+    }
+
+
+
+}
+
+/**
+ * trier une matrice par l'indice 1, puis par l'indice 2, puis par l'indice 0.
+ *
+ * @param {[string, Number, Number]} a - ligne d'une matrice
+ * @param {[string, Number, Number]} b - ligne d'une matrice
+ * @returns {Number} - 1 si a est plus grand, 0 si a=b, -1 si b est plus grand.
+ */
+function comparerLignes(a, b) {
+    // trier par le nombre d'apparition de l'auteur dans la liste de film vus (int)
+    if (a[1] < b[1]) return -1;
+    if (a[1] > b[1]) return 1;
+
+    // Si le nombre d'apparition est le même, trier par la moyenne de notes des films de l'auteur (float)
+    if (a[2] < b[2]) return -1;
+    if (a[2] > b[2]) return 1;
+
+    // Si la moyenne est la même, trier par le nom de l'auteur (string)
+    if (a[0] < b[0]) return -1;
+    if (a[0] > b[0]) return 1;
+
+    // Les lignes sont égales
+    alert("doublon d'auteur !!");
+    return 0;
+}
+
+/**
+ * renvoie une liste d'auteurs, avec leur nombre d'apparition dans la liste des films vus par un utilisateur, puis leur note moyenne
+ *
+ * @param {Movie[]} movies - Liste de film vus par un utilisateur.
+ * @param {string(Movie)} recupElement - Fonction qui recupere un element d'un film (pour generaliser allAutors à allElement).
+ * @returns {[[string, Number, Number]]} - La liste des auteurs.
+ */
+function getAllAuthors(movies, recupElement){
+    let authors = [[]];
+    //premier indice = couple auteur/nombre d'apparition/moyenne notes films, 2e indice: 0 auteur, 1 nbr apparition, 2 mpyenne films
+    for (let i = 0; i < seen.length; i++) {
+        let j = 0;
+        let found = false;
+        while(j < authors.length && !found){
+            if (authors[j][0] == seen[i].author) {
+                found = true;
+                authors[j][1] += 1;
+                authors[j][2] += seen[i].note;
+            }
+            j++;
+        }
+        if(!found){
+            authors.append([seen[i].author, 1, seen[i].note]);
+        }
+    }
+    for (let i = 0; i < authors.length; i++) {
+        authors[i][2] /= authors[i][1];        
+    }
+
+    authors.sort(comparerLignes);
+    return authors;
+}
+
+function getAuthor(movie){
+    return movie.author;
+}
+
+function getActors(movie){
+    return movie.actors;
+}
 
+function getStyles(movie){
+    return movie.styles;
+}
\ No newline at end of file
diff --git a/backend/src/controllers/userController.js b/backend/src/controllers/userController.js
index 4f09706..98876af 100644
--- a/backend/src/controllers/userController.js
+++ b/backend/src/controllers/userController.js
@@ -100,4 +100,17 @@ function getFilmsByAuthor(author, isOrdered = false, length = -1){
 
 function getFilmsByStyle(style, isOrdered = false, length = -1){
     return true;
+}
+
+
+
+/**
+ * Cette fonction récupere un utilisateur avec son login.
+ *
+ * @param {string} login - login de l'utilisateur.
+ * @returns {User} - L'utilisateur.
+ */
+
+function get_user(login){
+    return true;
 }
\ No newline at end of file
-- 
GitLab