using ReAct_PME.ViewModels;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms;
using ToolsServices;

namespace ReAct_PME
{
    /// <summary>
    /// Logique d'interaction pour RechercheCV.xaml
    /// </summary>
    public partial class RechercheCV : Window, IToastNotifier
    {
        private RechercheCV_VM _VM;
        private GridViewColumnHeader? _lastClickedHeader = null;

        public RechercheCV()
        {
            InitializeComponent();
            _VM = new RechercheCV_VM(this);
            this.DataContext = _VM;
        }

        private async void BtnSearch_Click(object sender, RoutedEventArgs e)
        {
            if (!File.Exists(_VM.FicheMission))
            {
                System.Windows.MessageBox.Show("Le fichier de fiche de mission n'existe pas. Veuillez le sélectionner.", "Erreur", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            if (!Directory.Exists(_VM.PathCV))
            {
                System.Windows.MessageBox.Show("Le dossier contenant les CV n'existe pas. Veuillez le sélectionner.", "Erreur", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            TxtMessage.Text = "Recherche en cours...";

            BtnRecherche.IsEnabled = false;
            BtnDetail.IsEnabled = false;
            BtnOpenCV.IsEnabled = false;

            await _VM.SearchCV();

            BtnRecherche.IsEnabled = true;
            BtnDetail.IsEnabled = true;
            BtnOpenCV.IsEnabled = true;

            TxtMessage.Text = "Recherche terminée...";

        }

        private void BtnDetail_Click(object sender, RoutedEventArgs e)
        {
            if(_VM.SelectedItem != null && _VM.SelectedItem.FichierCV != "")
            {
                RechercheCVDetail f = new RechercheCVDetail(_VM.SelectedItem);
                f.ShowDialog();
                //MessageBox.Show(_VM.SelectedItem.Avis, "Avis sur le CV", MessageBoxButton.OK, MessageBoxImage.Information);
            }
            else
            {
                System.Windows.MessageBox.Show("Veuillez sélectionner un CV pour voir le détail.", "Avertissement", MessageBoxButton.OK, MessageBoxImage.Warning);
            }
        }

        private void BtnOpenCV_Click(object sender, RoutedEventArgs e)
        {
            if (_VM.SelectedItem != null && _VM.SelectedItem.FichierCV != "")
            {

                string filePath = _VM.SelectedItem.FichierCV;
                if (File.Exists(filePath))
                {
                    System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo
                    {
                        FileName = filePath,
                        UseShellExecute = true // indispensable pour ouvrir avec l'application par défaut
                    });
                }
                else
                {
                    LoggerService.LogWarning($"Fichier non trouvé : {filePath}");
                }
            }
            else
            {
                System.Windows.MessageBox.Show("Veuillez sélectionner un CV pour pouvoir l'ouvrir.", "Avertissement", MessageBoxButton.OK, MessageBoxImage.Warning);
            }
        }
        
        private void BtnChangeFile_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.FicheMission = openFileDialog.FileName;
            }
        }

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

                DialogResult result = dialog.ShowDialog();

                if (!string.IsNullOrWhiteSpace(dialog.SelectedPath))
                {
                    _VM.PathCV = dialog.SelectedPath;
                }
            }
        }

        private async void BtnRechercheMotClef_Click(object sender, RoutedEventArgs e)
        {
            var rep = await _VM.SeekByKeyWord();
            if (rep != "")
            {
                NotificationManager.ShowNotification(rep, $"Réponse à votre recherche : {_VM.RechercheString}");
            }
            else
            {
                NotificationManager.ShowNotification("Il n'y a pas de réponse à votre requête...", $"Réponse à votre recherche : {_VM.RechercheString}");
            }
        }

        private void BtnFermer_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        #region Tri des colonnes
        private void ColumnHeader_Click(object sender, RoutedEventArgs e)
        {
            if (_lastClickedHeader != null)
            {
                // Réinitialiser le style de l'en-tête précédent
                _lastClickedHeader.Style = (Style)Resources["DefaultColumnHeaderStyle"];
            }

            var clickedHeader = e.OriginalSource as GridViewColumnHeader;
            if (clickedHeader != null)
            {
                // Appliquer le style de la colonne cliquée
                clickedHeader.Style = (Style)Resources["ClickedColumnHeaderStyle"];
                _lastClickedHeader = clickedHeader;
            }
        }


        #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
    }
}
