import { ReseauxAuteur, ReseauxReview } from './structures.js';
import conn from '../database.js';
import {getSourceId} from '../utils.js';

/**Récupérer l'id d'un auteur particulier dans la base de donnée s'il existe
 * @param {ReseauxAuteur} author L'auteur dont on veut l'id*
 * @returns Une Promise qui donne l'id de l'utilisateur ou null si il n'existe pas
 */
const getAuteurId = (author) => {
    return new Promise(async (resolve,reject) => {
        const sql  = "SELECT id FROM reseaux_sociaux_auteurs WHERE nom_utilisateur = ? AND source_id = ? AND lien = ?;"
        let sourceId = await getSourceId(author.source);
        let query = conn.query(sql, [author.nom, sourceId, author.lien], (err, res) => {
            if(err) {
                reject(new Error(err.message))
            }else {
                if(res.length > 0) {
                    resolve(res[0].id);
                }else {
                    resolve(null);
                }
            }
        })
    })
}


/**
 * ajoute un auteur de commentaire sur les réseaux sociaux a la bdd
 * @param {ReseauxAuteur} author 
 * @returns Une Promise qui donne l'id de l'utilisateur
 */
const addAuteur = (author, sourceId) => {
    return new Promise((resolve,reject) => {
        const sql  = "INSERT INTO reseaux_sociaux_auteurs (nom_utilisateur, source_id, lien) VALUES (?);"
        conn.query(sql, [[author.nom,sourceId, author.lien]], (err, res) => {
            if(err) {
                reject(new Error(err.message))
            }else {
                resolve(res.insertId);
            }
        })
    })
}

/**
 * Ajoute un avis dans la BDD
 * @param {ReseauxReview} review L'avis a ajouter
 * @param {Number} authorId ID de l'auteur dans la bdd
 * @param {Number} sourceId ID Du réseau social source dans la bdd
 * @returns une Promise qui renvoie l'ID de la review
 */
const addReview = (review, authorId, sourceId) => {
    return new Promise((resolve, reject) => {
        const sql  = "INSERT INTO reseaux_sociaux_avis (source_id, note, commentaire, auteur_id, lien_source, date) VALUES (?);"
        conn.query(sql, [[sourceId, review.note, review.commentaire, authorId, review.lien, review.date]], (err, res) => {
            if(err) {
                reject(new Error(err.message))
            }else {
                resolve(res.insertId);
            }
        })
    })
} 

/**
 * Traite une requête POST pour ajouter un avis récupéré sur les réseaux sociaux
 * @param {*} req 
 * @param {*} res 
 */
export const addSocialReviewFromRequest = async (req,res) => {
    try {
        const author = new ReseauxAuteur(req.body.auteur_nom, req.body.source, req.body.auteur_lien);
        const review = new ReseauxReview(author, req.body.source, req.body.date, req.body.note, req.body.commentaire, req.body.lien)
        let sourceId = await getSourceId(review.source);
        let authorId = await getAuteurId(author);
        if(authorId == null) {
            authorId = await addAuteur(author, sourceId);
        }
        await addReview(review, authorId, sourceId);
        res.send("success")
    }catch(err) {
        res.status(500).send("Error : " + err.message)
    }
}