using Services;
using System.Collections.ObjectModel;
using ReAct_PME.WebUI.ServicesUI;

namespace ReAct_PME.WebUI.Pages.Mails
{
    public enum eTypeSensibilite
    {
        Ton,
        Posture,
        Couleur,
        NiveauDetail
    }
    public class EditMail_Redaction_VM
    {
        #region Variables
        private readonly ApiService _api;

        #endregion

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

        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 EditMail_Redaction_VM(ApiService api)
        {
            _api = api;
            ListeTypes = new(("Professionnel;Personnel").Split(";").Select(x => x.Trim()).Where(x => !string.IsNullOrEmpty(x)));
            ListeTons = new ObservableCollection<string>(LoadSensibilites(eTypeSensibilite.Ton));
            ListePostures = new ObservableCollection<string>(LoadSensibilites(eTypeSensibilite.Posture));
            ListeCouleurs = new ObservableCollection<string>(LoadSensibilites(eTypeSensibilite.Couleur));
            ListeNiveauxDetail = new ObservableCollection<string>(LoadSensibilites(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;

            List<string> lst = new();
            lst.Add(context);
            lst.Add(query);

            var sRetourGenere = await _api.EnvoiNewMail<string[]>($"api/ListeMails/generateagain", lst.ToArray());
 

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

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

            var b = await _api.EnvoyerMail("api/ListeMails/EnvoyerMail", SelectItem);

            //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.Query.Trim() == "")
                return (false, "Votre requête est vide.");

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

            return (true, "");
        }

        private List<string> LoadSensibilites(eTypeSensibilite eSensibilite)
        {
            var contenu = "";
            switch (eSensibilite)
            {
                case eTypeSensibilite.Ton:
                    contenu = "Formel;Professionnel neutre;Chaleureux / convivial;Urgent / alerte;Didactique / explicatif;Persuasif / engageant";
                    break;
                case eTypeSensibilite.Posture:
                    contenu = "D’égal à égal;Hiérarchique (vers le haut ou vers le bas);De cadrage (donner des instructions, poser un cadre);De demandeur;De médiateur / facilitateur;D’alerte / vigilance;De soutien / collaboratif";
                    break;
                case eTypeSensibilite.Couleur:
                    contenu = "Politesse (sobre → très formelle);Enthousiasme (positif, motivant);Gravité (sérieux, solennel);Humour (léger, complice);Sarcasme (ironique, risqué)";
                    break;
                case eTypeSensibilite.NiveauDetail:
                    contenu = "Simple et conçis;simple, objectif clair;structuré et nuancé;précision lexicale et stylistique;stratégie relationnelle autour du mail";
                    break;
            }
            var lst = new List<string>();
            lst = new(contenu.Split(";").Select(x => x.Trim()).Where(x => !string.IsNullOrEmpty(x)));

            return lst.OrderBy(x => x).ToList();
        }

        #endregion


    }
}
