const { pool } = require('../database')

/**
 * function to insert etudiant into databases
 */
async function insertEtudiant(
  nom,
  prenom,
  photos,
  date_de_naissances,
  niveau,
  annee_scolaire,
  status,
  num_inscription,
  mention_id,
  sexe,
  nationaliter,
  cin,
  date_delivrence,
  annee_bacc,
  serie,
  boursier,
  domaine,
  contact,
  parcours
) {
  const sql =
    'INSERT INTO etudiants (nom, prenom, photos, date_de_naissances, niveau, annee_scolaire, status, mention_id, num_inscription, sexe, cin, date_delivrance, nationalite, annee_bacc, serie, boursier, domaine, contact, parcours) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'

  try {
    let [result] = await pool.query(sql, [
      nom,
      prenom,
      photos,
      date_de_naissances,
      niveau,
      annee_scolaire,
      status,
      mention_id,
      num_inscription,
      sexe,
      cin,
      date_delivrence,
      nationaliter,
      annee_bacc,
      serie,
      boursier,
      domaine,
      contact,
      parcours
    ])

    return {
      success: true,
      id: result.insertId
    }
  } catch (error) {
    return error
  }
}

/**
 * function to get all etudiants
 *
 * @returns JSON
 */
async function getAllEtudiants() {
  const sql = 'SELECT * FROM etudiants ORDER BY annee_scolaire DESC'
  try {
    let [rows] = await pool.query(sql)

    return rows
  } catch (error) {
    return error
  }
}

/**
 * function to return a single etudiant
 * and display it on the screen
 *
 * @param {int} id
 * @returns Promise
 */
async function getSingleEtudiant(id) {
  const sql = 'SELECT e.*, m.uniter AS mentionUnite FROM etudiants e JOIN mentions m ON e.mention_id = m.id WHERE e.id = ?'

  try {
    const [rows] = await pool.query(sql, [id])

    return rows[0]
  } catch (error) {
    return error
  }
}

/**
 * function to get all etudiants M2
 *
 * @returns JSON
 */
async function FilterDataByNiveau(niveau) {
  const sql = 'SELECT * FROM etudiants WHERE niveau = ? ORDER BY annee_scolaire DESC'
  try {
    let [rows] = await pool.query(sql, [niveau])

    return rows
  } catch (error) {
    return error
  }
}

/**
 * function to update etudiants
 *
 * @param {*} nom
 * @param {*} prenom
 * @param {*} photos
 * @param {*} date_de_naissances
 * @param {*} niveau
 * @param {*} annee_scolaire
 * @param {*} status
 * @param {*} num_inscription
 * @param {*} id
 * @returns promise
 */
async function updateEtudiant(
  nom,
  prenom,
  photos,
  date_de_naissances,
  niveau,
  annee_scolaire,
  status,
  mention_id,
  num_inscription,
  id,
  sexe,
  nationalite,
  cin,
  date_delivrence,
  annee_bacc,
  serie,
  boursier,
  domaine,
  contact,
  parcours
) {
  const sql =
    'UPDATE etudiants SET nom = ?, prenom = ?, photos = ?, date_de_naissances = ?, niveau = ?, annee_scolaire = ?, status = ?, mention_id = ?, num_inscription = ?, sexe = ?, cin = ?, date_delivrance = ?, nationalite = ?, annee_bacc = ?, serie = ?, boursier = ?, domaine = ?, contact = ?, parcours = ? WHERE id = ?'

  try {
    let [result] = await pool.query(sql, [
      nom,
      prenom,
      photos,
      date_de_naissances,
      niveau,
      annee_scolaire,
      status,
      mention_id,
      num_inscription,
      sexe,
      cin,
      date_delivrence,
      nationalite,
      annee_bacc,
      serie,
      boursier,
      domaine,
      contact,
      parcours,
      id
    ])

    if (result.affectedRows === 0) {
      return {
        success: false,
        message: 'Année Univesitaire non trouvé.'
      }
    }

    return {
      success: true,
      message: 'Année Univesitaire supprimé avec succès.'
    }
  } catch (error) {
    return error
  }
}

/**
 * function to return the needed data in dashboard
 *
 * @returns promise
 */
async function getDataToDashboard() {
  const query = 'SELECT * FROM niveaus'
  const query2 = 'SELECT * FROM etudiants'
  const query3 = 'SELECT DISTINCT annee_scolaire FROM etudiants' // get all Année Univesitaire sans doublan

  try {
    let [rows] = await pool.query(query)
    let niveau = rows
    ;[rows] = await pool.query(query2)
    let etudiants = rows
    ;[rows] = await pool.query(query3)
    let anne_scolaire = rows

    return { niveau, etudiants, anne_scolaire }
  } catch (error) {
    return error
  }
}

async function changePDP(photos, id) {
  const sql = 'UPDATE etudiants SET photos = ? WHERE id = ?'

  try {
    let [result] = await pool.query(sql, [photos, id])

    if (result.affectedRows === 0) {
      return {
        success: false,
        message: 'Année Univesitaire non trouvé.'
      }
    }

    return {
      success: true,
      message: 'Année Univesitaire supprimé avec succès.'
    }
  } catch (error) {
    return error
  }
}

async function updateParcours(parcours, id) {
  const sql = 'UPDATE etudiants SET parcours = ? WHERE id = ?'

  try {
    let [result] = await pool.query(sql, [parcours, id])

    if (result.affectedRows === 0) {
      return {
        success: false,
        message: 'Année Univesitaire non trouvé.'
      }
    }

    return {
      success: true,
      message: 'Année Univesitaire supprimé avec succès.'
    }
  } catch (error) {
    return error
  }
}

async function createTranche(etudiant_id, tranchename, montant) {
  const sql = 'INSERT INTO trancheecolage (etudiant_id, tranchename, montant) VALUES (?, ?, ?)'

  try {
    let [result] = await pool.query(sql, [etudiant_id, tranchename, montant])

    return {
      success: true,
      id: result.insertId
    }
  } catch (error) {
    return error
  }
}

async function getTranche(id) {
  const sql = 'SELECT * FROM trancheecolage WHERE etudiant_id = ?'

  try {
    let [rows] = await pool.query(sql, [id])

    return rows
  } catch (error) {
    return error
  }
}

async function updateTranche(id, tranchename, montant) {
  const sql = 'UPDATE trancheecolage SET tranchename = ?, montant = ? WHERE id = ?'

  try {
    const [result] = await pool.query(sql, [tranchename, montant, id])
    console.log('resultat tranche:',result);

    if (result.affectedRows === 0) {
      return {
        success: false,
        message: 'Année Univesitaire non trouvé.'
      }
    }

    return {
      success: true,
      message: 'Année Univesitaire supprimé avec succès.'
    }
  } catch (error) {
    console.log('resultat error:',error);
    return error
  }
}

async function deleteTranche(id) {
  const sql = 'DELETE FROM trancheecolage WHERE id = ?'

  try {
    let [result] = await pool.query(sql, [id])

    if (result.affectedRows === 0) {
      return {
        success: false,
        message: 'Année Univesitaire non trouvé.'
      }
    }

    return {
      success: true,
      message: 'Année Univesitaire supprimé avec succès.'
    }
  } catch (error) {
    return error
  }
}

async function deleteEtudiant(id) {
  console.log("id: ", id);
  const sql = 'DELETE FROM etudiants WHERE id = ?';

  try {
    let [result] = await pool.query(sql, [id]);
    console.log("Résultat DELETE:", result);

    if (result.affectedRows === 0) {
      return {
        success: false,
        message: 'Etudiant non trouvée.'
      };
    }

    return {
      success: true,
      message: 'Matière supprimée avec succès.'
    };
  } catch (error) {
    console.log("err: ",+ error)
    return { success: false, error: 'Erreur, veuillez réessayer: ' + error };
    
  }
}

async function getSingleTranche(id) {
  const sql = 'SELECT * FROM trancheecolage WHERE id = ?'
  try {
    const [rows] = await pool.query(sql, [id])
    return rows[0]
  } catch (error) {
    return error
  }
}

module.exports = {
  insertEtudiant,
  getAllEtudiants,
  FilterDataByNiveau,
  getSingleEtudiant,
  updateEtudiant,
  getDataToDashboard,
  changePDP,
  updateParcours,
  createTranche,
  getTranche,
  updateTranche,
  deleteTranche,
  deleteEtudiant,
  getSingleTranche
}
