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

namespace projet.dal
{
    /// <summary>
    /// Méthodes d'accès aux données pour les absences du personnel.
    /// </summary>
    public class MotifAccess
    {
        private readonly Access access;

        /// <summary>
        /// Récupère l'instance de la classe Access pour accéder à la base de données.
        /// </summary>
        public MotifAccess()
        {
            access = Access.GetInstance();
        }

        /// <summary>
        /// Méthode pour récupérer tous les motifs d'absence.
        /// </summary>
        /// <returns>Liste de motifs</returns>
        public List<Motif> GetAllMotifs()
        {
            List<Motif> motifList = new List<Motif>();
            if (access.Manager != null)
            {
                string req = "SELECT * FROM motif ORDER BY libelle;";
                try
                {
                    List<Object[]> resultats = access.Manager.ReqSelect(req);
                    if (resultats != null)
                    {
                        foreach (Object[] resultat in resultats)
                        {
                            Motif motif = new Motif(
                                Convert.ToInt32(resultat[0]), // IdMotif
                                Convert.ToString(resultat[1]) // Libelle
                            );
                            motifList.Add(motif);
                        }
                    }
                }
                catch (Exception)
                {
                    Console.WriteLine("Erreur lors de la récupération des données des motifs.");
                    Environment.Exit(0);
                }
            }
            return motifList;
        }

        /// <summary>
        /// Méthode pour récupérer l'ID d'un motif par son libellé.
        /// </summary>
        /// <param name="libelle">libelle du motif souhaité</param>
        /// <returns>Id du motif</returns>
        public int GetMotifIdByLibelle(string libelle)
        {
            int idMotif = -1;
            if (access.Manager != null)
            {
                string req = "SELECT idMotif FROM motif WHERE libelle = @libelle;";
                var parameters = new Dictionary<string, object>
                {
                    { "@libelle", libelle }
                };
                try
                {
                    List<Object[]> resultats = access.Manager.ReqSelect(req, parameters);
                    if (resultats != null && resultats.Count > 0)
                    {
                        idMotif = Convert.ToInt32(resultats[0][0]);
                    }
                    return idMotif;
                }
                catch (Exception)
                {
                    Console.WriteLine("Erreur lors de la récupération de l'ID du motif par libellé.");
                    Environment.Exit(0);
                }
            }
            return idMotif;
        }

        public Motif GetMotifById(int idMotif)
        {
            Motif motif = null;
            if (access.Manager != null)
            {
                string req = "SELECT * FROM motif WHERE idMotif = @idMotif;";
                var parameters = new Dictionary<string, object>
                {
                    { "@idMotif", idMotif }
                };
                try
                {
                    List<Object[]> resultats = access.Manager.ReqSelect(req, parameters);
                    if (resultats != null && resultats.Count > 0)
                    {
                        Object[] resultat = resultats[0];
                        motif = new Motif(
                            Convert.ToInt32(resultat[0]), // IdMotif
                            Convert.ToString(resultat[1]) // Libelle
                        );
                    }
                    return motif;
                }
                catch (Exception)
                {
                    Console.WriteLine("Erreur lors de la récupération du motif par ID.");
                    Environment.Exit(0);
                }
            }
            return motif;
        }

        public string GetLibelleById(int idMotif)
        {
            string libelle = string.Empty;
            if (access.Manager != null)
            {
                string req = "SELECT libelle FROM motif WHERE idMotif = @idMotif;";
                var parameters = new Dictionary<string, object>
                {
                    { "@idMotif", idMotif }
                };
                try
                {
                    List<Object[]> resultats = access.Manager.ReqSelect(req, parameters);
                    if (resultats != null && resultats.Count > 0)
                    {
                        libelle = Convert.ToString(resultats[0][0]);
                    }
                    return libelle;
                }
                catch (Exception)
                {
                    Console.WriteLine("Erreur lors de la récupération du libellé du motif par ID.");
                    Environment.Exit(0);
                }
            }
            return libelle;
        }
    }
}
