const { pool } = require('../database')
const { matiereSystemReverse } = require('../function/System')
const dayjs = require('dayjs')

async function insertParcour(nom, uniter, mention_id) {
  const sql = 'INSERT INTO parcours (nom, uniter, mention_id) VALUES (?, ?, ?)'

  try {
    let [result] = await pool.query(sql, [nom, uniter, mention_id == null ? 0 : mention_id])

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

async function getParcourMatiere(id) {
  const sql = `SELECT * FROM parcoursmatiere WHERE matiere_id = ?`

  try {
    const [rows] = await pool.query(sql, [id])
    return rows
  } catch (error) {
    console.error(error)
    return error
  }
}

async function getParcours() {
  const sql = 'SELECT parcours.*, mentions.nom AS mention_nom FROM parcours LEFT JOIN mentions ON parcours.mention_id = mentions.id ORDER BY parcours.id DESC'

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

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



async function getSingleParcours(id) {
  const sql = 'SELECT * FROM parcours WHERE id = ?'

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

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

async function deletes(id) {
  const sql = 'DELETE FROM parcours 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 updateparcour(id, nom, uniter, mention_id) {
  const sql = 'UPDATE parcours SET nom = ?, uniter = ?, mention_id = ? WHERE id = ?'

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

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

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

async function parcourMatiere(matiere_id, parcour_ids) {
  try {
    // 1. Delete all existing relations for this matiere
    const deleteSql = `DELETE FROM parcoursmatiere WHERE matiere_id = ?`
    await pool.query(deleteSql, [matiere_id])

    // 2. Insert new relations
    if (parcour_ids.length === 0) {
      return { success: true, message: 'No parcours to insert' }
    }

    const insertSql = `
      INSERT INTO parcoursmatiere (matiere_id, parcour_id)
      VALUES ${parcour_ids.map(() => '(?, ?)').join(',')}
    `

    // Flatten values like: [matiere_id, parcour_id1, matiere_id, parcour_id2, ...]
    const values = parcour_ids.flatMap((pid) => [matiere_id, pid])

    const [result] = await pool.query(insertSql, values)

    return { success: true, affectedRows: result.affectedRows }
  } catch (error) {
    console.error(error)
    return { success: false, error: error.message }
  }
}

async function extractFiche(matiere_id) {
  const now = dayjs().format('YYYY')

  const connection = await pool.getConnection()
  try {
    await connection.beginTransaction()

    // Get semestre and mention
    const [matiereSemestre] = await connection.query(
      `
      SELECT matiere_semestre.semestre_id, matiere_semestre.mention_id, semestres.*
      FROM matiere_semestre
      INNER JOIN semestres ON matiere_semestre.semestre_id = semestres.id
      WHERE matiere_semestre.matiere_id = ?
      `,
      [matiere_id]
    )

    // Get parcours
    const [parcours] = await connection.query(
      `
      SELECT * FROM parcoursmatiere
      INNER JOIN parcours ON parcoursmatiere.parcour_id = parcours.id
      WHERE parcoursmatiere.matiere_id = ?
      `,
      [matiere_id]
    )

    let response = []
    let allMention_id = []

    for (let index = 0; index < matiereSemestre.length; index++) {
      response.push(await matiereSystemReverse(matiereSemestre[index].nom))
      allMention_id.push(matiereSemestre[index].mention_id)
    }

    // Remove duplicates
    let newResponse = []
    for (let index = 0; index < response.length; index++) {
      if (response[index] !== response[index + 1]) {
        newResponse.push(response[index])
      }
    }

    // Get all students for the matched niveau and school year
    let allStudents = []
    for (let index = 0; index < newResponse.length; index++) {
      const [students] = await connection.query(
        `
        SELECT * FROM etudiants
        WHERE niveau LIKE ? AND annee_scolaire LIKE ?
        `,
        [`%${newResponse[index]}%`, `%${now}%`]
      )
      allStudents.push(...students)
    }

    // Filter students by mention
    const studentFiltredMention = allStudents.filter((etudiant) =>
      allMention_id.includes(etudiant.mention_id)
    )

    // Filter by parcours
    let allData = []

    for (let j = 0; j < parcours.length; j++) {
      for (let index = 0; index < studentFiltredMention.length; index++) {
        const currentStudent = studentFiltredMention[index]
        const parcoursName = parcours[j].nom
        const parcour_id = parcours[j].parcour_id

        if (parcour_id == 1) {
          if (currentStudent.parcours == null || currentStudent.parcours == parcoursName) {
            allData.push(currentStudent)
          }
        } else {
          if (currentStudent.parcours == parcoursName) {
            allData.push(currentStudent)
          }
        }
      }
    }

    await connection.commit()
    connection.release()
    return allData
  } catch (error) {
    await connection.rollback()
    connection.release()
    console.error(error)
    return { success: false, error: error.message }
  }
}

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

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

    if (result.affectedRows === 0) {
      return {
        success: false,
        message: 'Parcours 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 };
    
  }
}

module.exports = {
  insertParcour,
  getParcours,
  getSingleParcours,
  deletes,
  updateparcour,
  parcourMatiere,
  extractFiche,
  deleteParcours,
  getParcourMatiere
}
