using projet.modele;
using System;
using System.Collections.Generic;

namespace projet.dal
{
    /// <summary>
    /// Méthodes d'accès aux données pour les absences du personnel.
    /// </summary>
    public class AbsenceAccess
    {
        private readonly Access access;
        /// <summary>
        /// Récupère l'instance de la classe Access pour accéder à la base de données.
        /// </summary>
        public AbsenceAccess()
        {
            access = Access.GetInstance();
        }

        /// <summary>
        /// Donne la liste des absences d'un personnel.
        /// </summary>
        /// <param name="personnel">Personne concernée</param>
        /// <returns></returns>
        public List<Absence> GetAbsences(Personnel personnel)
        {
            List<Absence> absences = new List<Absence>();
            if (access.Manager != null)
            {
                string req2 = "SELECT a.idPersonnel, a.dateDebut, a.dateFin, m.libelle FROM absence a JOIN motif m ON a.idMotif = m.idMotif WHERE a.idPersonnel = @idPersonnel ORDER BY a.dateDebut;";
                var parameters = new Dictionary<string, object>
                {
                    { "@idPersonnel", personnel.IdPersonnel }
                };
                try
                {
                    List<Object[]> resultats = access.Manager.ReqSelect(req2, parameters);
                    if (resultats != null)
                    {
                        foreach (Object[] resultat in resultats)
                        {
                            string idMotif = Convert.ToString(resultat[3]) ?? string.Empty;
                            Absence absence = new Absence(
                                Convert.ToInt32(resultat[0]), // IdPersonnel
                                Convert.ToDateTime(resultat[1]), // DateDebut
                                Convert.ToDateTime(resultat[2]), // DateFin
                                idMotif // Motif
                            );
                            absences.Add(absence);
                        }
                    }
                    return absences;
                }
                catch (Exception)
                {
                    Console.WriteLine("Erreur lors de la récupération des absences du personnel.");
                    Environment.Exit(0);
                }
            }
            return absences;
        }

        /// <summary>
        /// Méthode d'ajout d'une absence pour un personnel.
        /// </summary>
        /// <param name="absence">Absence à rajouter</param>
        /// <param name="personne">Personne à laquelle rajouter l'absence</param>
        public void AddAbsence(Absence absence, Personnel personne)
        {
            if (access.Manager != null)
            {
                string req = "INSERT INTO absence (idPersonnel, dateDebut, dateFin, idMotif) VALUES (@idPersonnel, @dateDebut, @dateFin, @idMotif);";
                var parameters = new Dictionary<string, object>
                {
                    { "@idPersonnel", personne.IdPersonnel },
                    { "@dateDebut", absence.DateDebut },
                    { "@dateFin", absence.DateFin },
                    { "@idMotif", Convert.ToInt32(absence.IdMotif) }
                };
                try
                {
                    access.Manager.ReqUpdate(req, parameters);
                }
                catch (Exception)
                {
                    Console.WriteLine("Erreur lors de l'ajout de l'absence.");
                    Environment.Exit(0);
                }
            }
        }

        /// <summary>
        /// Méthode de suppression d'une absence pour un personnel.
        /// </summary>
        /// <param name="absence">Absence concernée</param>
        public void DeleteAbsence(Absence absence)
        {
            if (access.Manager != null)
            {
                string req = "DELETE FROM absence WHERE idPersonnel = @idPersonnel AND dateDebut = @dateDebut AND dateFin = @dateFin AND idMotif = @idMotif;";
                var parameters = new Dictionary<string, object>
                {
                    { "@idPersonnel", absence.IdPersonnel },
                    { "@dateDebut", absence.DateDebut },
                    { "@dateFin", absence.DateFin },
                    { "@idMotif", Convert.ToInt32(absence.IdMotif) }
                };
                try
                {
                    access.Manager.ReqUpdate(req, parameters);
                }
                catch (Exception)
                {
                    Console.WriteLine("Erreur lors de la suppression de l'absence.");
                    Environment.Exit(0);
                }
            }
        }

        public void ModifierAbsence(Absence absence, Personnel personne)
        {
            if (access.Manager != null)
            {
                string req = "UPDATE absence SET dateFin = @dateFin WHERE idPersonnel = @idPersonnel AND dateDebut = @dateDebut AND idMotif = @idMotif;";
                var parameters = new Dictionary<string, object>
                {
                    { "@idPersonnel", personne.IdPersonnel },
                    { "@dateDebut", absence.DateDebut },
                    { "@dateFin", absence.DateFin },
                    { "@idMotif", Convert.ToInt32(absence.IdMotif) }
                };
                try
                {
                    access.Manager.ReqUpdate(req, parameters);
                }
                catch (Exception)
                {
                    Console.WriteLine("Erreur lors de la modification de l'absence.");
                    Environment.Exit(0);
                }
            }
        }
    }
}
