using ReAct_PME.WPF_FrameWork;
using Services;
using System.Collections.ObjectModel;

namespace ReAct_PME.ViewModels
{
    public class GenerateEmail_VM : BaseViewModel
    {

        #region Variables
        #endregion

        #region Propriétés
        private MessageToSend _SelectItem = new();
        public MessageToSend SelectItem {
            get 
            { 
                return _SelectItem; 
            }
            set 
            {
                _SelectItem = value;
                OnPropertyChanged(nameof(SelectItem));
            } 
        }

        public ObservableCollection<string> ListeTypes { get; set; } 
        public ObservableCollection<string> ListeTons { get; set; } 
        public ObservableCollection<string> ListePostures { get; set; }
        public ObservableCollection<string> ListeCouleurs { get; set; }
        public ObservableCollection<string> ListeNiveauxDetail { get; set; } 
        #endregion

        #region Constructeur
        public GenerateEmail_VM() 
        {
            ListeTypes = new(("Professionnel;Personnel").Split(";").Select(x => x.Trim()).Where(x => !string.IsNullOrEmpty(x)));
            ListeTons = new ObservableCollection<string>(Services.EmailService.LoadSensibilites(Services.EmailService.eTypeSensibilite.Ton));
            ListePostures = new ObservableCollection<string>(Services.EmailService.LoadSensibilites(Services.EmailService.eTypeSensibilite.Posture));
            ListeCouleurs = new ObservableCollection<string>(Services.EmailService.LoadSensibilites(Services.EmailService.eTypeSensibilite.Couleur));
            ListeNiveauxDetail = new ObservableCollection<string>(Services.EmailService.LoadSensibilites(Services.EmailService.eTypeSensibilite.NiveauDetail));

        }
        #endregion

        #region Méthodes publiques
        public async Task<(bool, string)> Generer()
        {
            SelectItem.Body = "Génération en cours";
            var (isValid, msg) = VerifData();
            if (!isValid)
                return (false, msg);

            var nbDest = SelectItem.DestinataireA.Split(';').Length;
            var vous_tu = (SelectItem.VOUS_TU || nbDest > 1) ? "le vouvoiement est de rigueur" : "le tutoiement est autorisé";
            var context = $"""
                L'objet du mail est : {SelectItem.Object}.
                Le type de mail est : {SelectItem.Type}.
                Le ton du mail est : {SelectItem.Ton}.
                La posture du mail est : {SelectItem.Posture}.
                La couleur du mail est : {SelectItem.Couleur}.
                Le nombre de destinaires est : {nbDest}.
                Les adresses des destinataires sont : {SelectItem.DestinataireA} pour en déduire le nom ou le prénom.
                Si tu peux déduire le nom ou le prénom de tous les destinataire, utilise le dans le mail. 
                Si tu ne peux pas, utilise une formule générique.
                Pour dire bonjour aux destinataires, utilise leur nom ou prénom si tu peux le déduire.
                Si tu ne peux pas, dis simplement 'Bonjour'.
                Le niveau de détail attendu du mail est : {SelectItem.NiveauDetail}.
                {vous_tu}
            """;
            var query = SelectItem.Query;

            if (!ListeTons.Contains(SelectItem.Ton))
            {
                Services.EmailService.SaveSensibilite(Services.EmailService.eTypeSensibilite.Ton, ListeTons.ToList(), SelectItem.Ton);
                ListeTons.Add(SelectItem.Ton);
            }
            if (!ListePostures.Contains(SelectItem.Posture))
            {
                Services.EmailService.SaveSensibilite(Services.EmailService.eTypeSensibilite.Posture, ListePostures.ToList(), SelectItem.Posture);
                ListePostures.Add(SelectItem.Posture);
            }
            if (!ListeCouleurs.Contains(SelectItem.Couleur))
            {
                Services.EmailService.SaveSensibilite(Services.EmailService.eTypeSensibilite.Couleur, ListeCouleurs.ToList(), SelectItem.Couleur);
                ListeCouleurs.Add(SelectItem.Couleur);
            }
            if (!ListeNiveauxDetail.Contains(SelectItem.NiveauDetail))
            {
                Services.EmailService.SaveSensibilite(Services.EmailService.eTypeSensibilite.NiveauDetail, ListeNiveauxDetail.ToList(), SelectItem.NiveauDetail);
                ListeNiveauxDetail.Add(SelectItem.NiveauDetail);
            }


            var (isOk,sRetourGenere) = await Services.EmailService.GenererMailAsync(context, query);
            if (isOk)
            {
                SelectItem.Body = sRetourGenere;
                OnPropertyChanged(nameof(SelectItem));
                if (sRetourGenere.Trim() == "")
                {
                    return (false, "Une erreur s'est produite durant la génération. Merci de recommencer");
                }
                return (true, sRetourGenere);
            }
            return (false, sRetourGenere);
        }

        public async Task<(bool, string)> Envoyer()
        {
            var (isValid, msg) = VerifData();
            if(!isValid)
                return (false, msg);

            var dest = SelectItem.DestinataireA;
            var destCc = SelectItem.DestinataireCC;
            var sujet = SelectItem.Object;
            var message = SelectItem.Body;

            var b =  await Services.EmailService.EnvoyerMailAsync(null, dest, sujet, message, false, "", destCc);
            return (b, "");
        }
        #endregion

        #region Méthodes privées
        private (bool, string) VerifData()
        {
            if (SelectItem.DestinataireA.Trim() == "")
                return (false, "Aucun destinataire spécifié.");

            var dests = SelectItem.DestinataireA.Split(';');
            foreach(var dest in dests)
            {
                if (!dest.Contains("@") || !dest.Contains("."))
                    return (false, $"L'adresse '{dest}' dans les destinataires principaux n'est pas valide.");
            }

            if (SelectItem.DestinataireCC != "")
            {
                var destsCc = SelectItem.DestinataireCC.Split(';');
                foreach (var dest in destsCc)
                {
                    if (!dest.Contains("@") || !dest.Contains("."))
                        return (false, $"L'adresse '{dest}' dans les destinataires en copie n'est pas valide.");
                }
            }

            if (SelectItem.Object.Trim() == "")
                return (false, "Aucun objet de mail spécifié.");

            if (SelectItem.Body.Trim() == "")
                return (false, "Le corps du message est vide.");

            return (true, "");
        }
        #endregion


    }
}
