using ReAct_PME.WPF_FrameWork;
using Services;
using Services.ReActAgent;
using System.Collections.ObjectModel;
using System.Windows.Forms;
using ToolsServices;

namespace ReAct_PME.ViewModels
{
    public class ResumeAudio_VM : BaseViewModel
    {
        private string _FullFileName = "";
        public string FullFileName { get; set; } = @"C:\Users\guill\Videos\reunion.mkv";
        public ObservableCollection<string> ListeContexte { get; set; } = new();
        public string SelectedContexte { get; set; } = "";

        private ReActAgent _Agent = new();
        public ResumeAudio_VM()
        {
            ListeContexte.Add("Réunion de travail");
            ListeContexte.Add("Interview");
            ListeContexte.Add("Podcast");
            ListeContexte.Add("Cours");
            ListeContexte.Add("Autre");

            SelectedContexte = ListeContexte[0];
            OnPropertyChanged(nameof(SelectedContexte));

        }


        public async Task<(bool, string)> GoTrt_Part1()
        {
            var isNewFileToDelete = false;

            var ext = System.IO.Path.GetExtension(FullFileName).ToLower();
            if (ext == ".mkv" || ext == ".mp4")
            {
                var path = System.IO.Path.GetDirectoryName(FullFileName);
                var filename = System.IO.Path.GetFileNameWithoutExtension(FullFileName) + "_temp.wav";
                _FullFileName = System.IO.Path.Combine(path!, filename);
                isNewFileToDelete = true;
                var b = ConvertVideoToAudio(FullFileName, _FullFileName);
                if (!b)
                {
                    return (false, "Erreur lors de la conversion de la vidéo en audio. ffmpeg est-il installé et son chemin est-il dans la variable d'environnement PATH ?");
                }

            }
            else
            {
                _FullFileName = FullFileName;
            }

            var (b1, s1) = await TranscribeAudio(isNewFileToDelete);
            if (!b1)
            {
                LoggerService.LogError($"Erreur dans la transcription : {s1}");
                return (false, s1);
            }
            else
            {
                LoggerService.LogDebug($"Transcription terminée : {s1}");
            }
            return (b1, s1);
        }

        public async Task<(bool, string)> GoTrt_Part2(string transcribeText)
        {
            var (b2, s2) = await ResumeTranscribe(transcribeText);
            if (!b2)
            {
                LoggerService.LogError($"Erreur dans le résumé : {s2}");
                return (false, s2);
            }
            else
            {
                LoggerService.LogDebug($"Résumé terminé : {s2}");
            }
            return (b2, s2);
        }

        public async Task<(bool, string, string)> GoTrt(bool isResumeOnly, string transcribeText="")
        {
            var isNewFileToDelete = false;
            if (!isResumeOnly)
            {
                var ext = System.IO.Path.GetExtension(FullFileName).ToLower();
                if (ext == ".mkv" || ext == ".mp4")
                {
                    var path = System.IO.Path.GetDirectoryName(FullFileName);
                    var filename = System.IO.Path.GetFileNameWithoutExtension(FullFileName) + "_temp.wav";
                    _FullFileName = System.IO.Path.Combine(path!, filename);
                    isNewFileToDelete = true;
                    var b = ConvertVideoToAudio(FullFileName, _FullFileName);
                    if (!b)
                    {
                        return (false, "Erreur lors de la conversion de la vidéo en audio. ffmpeg est-il installé et son chemin est-il dans la variable d'environnement PATH ?", "");
                    }

                }
                else
                {
                    _FullFileName = FullFileName;
                }

                var (b1, s1) = await TranscribeAudio(isNewFileToDelete);
                if (!b1)
                {
                    LoggerService.LogError($"Erreur dans la transcription : {s1}");
                    return (false, s1, "");
                }
                else
                {
                    LoggerService.LogDebug($"Transcription terminée : {s1}");
                }
                transcribeText = s1;
            }



            var (b2, s2) = await ResumeTranscribe(transcribeText);
            if(!b2)
            {
                LoggerService.LogError($"Erreur dans le résumé : {s2}");
                return (false, "", s2);
            }
            else
            {
                LoggerService.LogDebug($"Résumé terminé : {s2}");
            }

            NotificationManager.ShowNotification($"Résumé terminé : {FullFileName}", "Résumé de fichier audio / vidéo");
            return (true, transcribeText, s2);
        }

        private async Task<(bool, string)> TranscribeAudio(bool isNewFileToDelete)
        {
            var retour = await TranscriptionAndResumeService.TranscribeAudio(_FullFileName);
            // On supprime le fichier (temporaire) audio seulement si c'est le résultat d'une conversion Video vers Audio
            if (isNewFileToDelete)
                System.IO.File.Delete(_FullFileName);
            return retour;
        }

        private async Task<(bool, string)> ResumeTranscribe(string transcribe)
        {
            return await TranscriptionAndResumeService.ResumeTranscribe(transcribe, SelectedContexte);
        }

        private bool ConvertVideoToAudio(string inputFile, string outputFile)
        {
            var b = TranscriptionAndResumeService.ConvertVideoToAudio(inputFile, outputFile);
            return b;
        }

    }
}
