using ReAct_PME.ViewModels;
using System.IO;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms;
using System.Windows.Input;

namespace ReAct_PME
{
    /// <summary>
    /// Logique d'interaction pour GenererCV.xaml
    /// </summary>
    public partial class GenererCV : Window, IToastNotifier
    {
        private GenererCV_VM _VM;
        public GenererCV()
        {
            InitializeComponent();
            _VM = new(this);
            this.DataContext = _VM;
        }

        #region Lancement de la génération
        private async void BtnGenerer_Click(object sender, RoutedEventArgs e)
        {
            if (!File.Exists(_VM.FullnameCV))
            {
                System.Windows.MessageBox.Show("Le fichier CV n'existe pas. Veuillez le sélectionner.", "Erreur", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            if (!File.Exists(_VM.FullnameTemplateCV))
            {
                System.Windows.MessageBox.Show("Le fichier Template de CV n'existe pas. Veuillez le sélectionner.", "Erreur", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            if (!Directory.Exists(_VM.FullPathOutput))
            {
                System.Windows.MessageBox.Show("Le dossier d'export des nouveaux CV n'existe pas. Veuillez le sélectionner.", "Erreur", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            TxtMessage.Text = "Génération en cours...";

            BtnGenerer.IsEnabled = false;

            var b = await _VM.GenerateCV();

            BtnGenerer.IsEnabled = true;

            var txt = "";
            if (b)
            {
                txt = "Génération terminée avec succès...";
            }
            else
            {
                txt = "Génération terminée avec erreur...";
            }
            TxtMessage.Text = txt;
            NotificationManager.ShowNotification(txt, "Génération d'un CV");

        }
        #endregion

        #region Boutons de changement fichiers et dossier
        private void BtnChangeFile_CV_Click(object sender, RoutedEventArgs e)
        {
            var openFileDialog = new Microsoft.Win32.OpenFileDialog
            {
                Filter = "Documents (*.pdf;*.docx)|*.pdf;*.docx|Fichiers PDF (*.pdf)|*.pdf|Fichiers Word (*.docx)|*.docx",
                Title = "Sélectionner un CV"
            };

            if (openFileDialog.ShowDialog() == true)
            {
                _VM.FullnameCV = openFileDialog.FileName;
            }
        }

        private void BtnChangeFile_Template_Click(object sender, RoutedEventArgs e)
        {
            var openFileDialog = new Microsoft.Win32.OpenFileDialog
            {
                Filter = "Documents (*.docx)|*.docx|Fichiers Word (*.docx)|*.docx",
                Title = "Sélectionner un Template de CV"
            };

            if (openFileDialog.ShowDialog() == true)
            {
                _VM.FullnameTemplateCV = openFileDialog.FileName;
            }
        }

        private void BtnChangeDirectory_Output_Click(object sender, RoutedEventArgs e)
        {
            using (var dialog = new FolderBrowserDialog())
            {
                dialog.Description = "Sélectionnez le dossier de génération des nouveaux CV";
                dialog.UseDescriptionForTitle = true;

                DialogResult result = dialog.ShowDialog();

                if (!string.IsNullOrWhiteSpace(dialog.SelectedPath))
                {
                    _VM.FullPathOutput = dialog.SelectedPath;
                }
            }
        }
        #endregion

        #region Gestion du numérique saisi
        private static readonly Regex _regex = new Regex("[^0-9]+"); // tout sauf chiffres

        private void NumericOnly_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            e.Handled = _regex.IsMatch(e.Text);
        }

        private void NumericOnly_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            if (e.Key == Key.Space)
                e.Handled = true;

            if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control && e.Key == Key.V)
            {
                string clipboard = System.Windows.Clipboard.GetText();
                if (_regex.IsMatch(clipboard))
                    e.Handled = true;
            }
        }

        private void IntTextBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (int.TryParse(NbrCompetencesBox.Text, out int value))
            {
                if (value > int.MaxValue)
                {
                    AlerterDepassement();
                }
            }
            else if (!string.IsNullOrWhiteSpace(NbrCompetencesBox.Text))
            {
                AlerterDepassement();
            }
        }

        private void AlerterDepassement()
        {
            System.Media.SystemSounds.Exclamation.Play(); // ou Beep, Hand, etc.
            System.Windows.MessageBox.Show($"⚠️ La valeur ne peut pas dépasser {int.MaxValue}.", "Limite dépassée", MessageBoxButton.OK, MessageBoxImage.Warning);
            NbrCompetencesBox.Text = "5";
        }
        #endregion

        #region Implémentation de IToastNotifier
        public void ShowToast(string message, int durationMs = 10000)
        {
            Dispatcher.Invoke(() =>
            {
                ToastMessage.Text = message;
                ToastPopup.IsOpen = true;
            });

            Task.Delay(durationMs).ContinueWith(_ =>
            {
                Dispatcher.Invoke(() => ToastPopup.IsOpen = false);
            });
        }

        #endregion
    }
}
