import subprocess
import os
import gradio as gr
from TTS.api import TTS

class TTSInterface:
    def __init__(self):
        # Initialisation du modèle TTS
        self.tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2", gpu=False)
        self.output_folder = "output_audio"
        os.makedirs(self.output_folder, exist_ok=True)

    def create_interface(self):
        with gr.Blocks(theme=gr.themes.Soft()) as demo:
            # Variables d'état
            state = gr.State({
                "project_name": "",
                "sections": []
            })

            # En-tête
            gr.Markdown("""
            # 🎙️ Synthèse Vocale Margaux
            ## 👋 Bienvenue sur Margaux - Votre outil de synthèse vocale avancée
            
            Margaux vous permet de générer des voix off naturelles à partir de textes, structurées par sections pour une meilleure qualité audio.
            
            **Étapes principales :**
            1. 🛠️ **Créer un projet** : Définissez le nom du projet et choisissez la voix.
            2. ✍️ **Ajouter des sections** : Divisez votre texte en parties claires.
            3. 🎧 **Générer les audios** : Chaque section est transformée en fichier audio.
            4. 📁 **Sauvegardez le projet** : Finalisez et récupérez les fichiers.
            """)

            # Tabs pour les étapes
            with gr.Tabs() as tabs:
                # Étape 1: Configuration du projet
                with gr.Tab("🛠️ Création du Projet"):
                    with gr.Column():
                        gr.Markdown("### Configuration initiale")
                        project_name = gr.Textbox(
                            label="Nom du Projet",
                            placeholder="Exemple : Capsule_Video_PLU",
                            scale=1
                        )
                        speaker = gr.Dropdown(
                            choices=["Margaux"],
                            value="Margaux",
                            label="Voix 🎙️",
                            scale=1
                        )
                        terms = gr.Checkbox(
                            label="✅ J'accepte les conditions d'utilisation"
                        )
                        create_btn = gr.Button("Créer le Projet ➡️", variant="primary")
                        status_message = gr.Markdown("")  # Pour afficher les messages de statut

                # Étape 2: Gestion des sections
                with gr.Tab("✍️ Sections"):
                    with gr.Column():
                        gr.Markdown("### Gestion des sections")
                        
                        # Template pour une section
                        section_template = gr.DataFrame(
                            headers=["Nom", "Texte"],
                            row_count=0,
                            col_count=2,
                            interactive=True
                        )
                        
                        with gr.Row():
                            add_section = gr.Button("+ Ajouter une Section ➕")
                            remove_section = gr.Button("- Supprimer la dernière Section ➖")

                # Étape 3: Génération des audios
                with gr.Tab("🎧 Génération"):
                    with gr.Column():
                        gr.Markdown("### Génération des audios")
                        generate_all = gr.Button("Générer tous les audios ▶️", variant="primary")
                        audio_output = gr.Audio(label="Audio généré")  # Un seul composant Audio pour l'exemple
                        status = gr.Markdown("")  # Pour les messages de statut de génération

            # Fonctions de callback
            def update_project_info(name, terms):
                if not terms:
                    return "⚠️ Veuillez accepter les conditions d'utilisation"
                if not name.strip():
                    return "⚠️ Le nom du projet est requis"
                return f"✅ Projet '{name}' créé avec succès!"

            def add_new_section(data):
                if data is None:
                    data = []
                new_row = [f"Section_{len(data) + 1}", ""]
                return data + [new_row]

            def remove_last_section(data):
                if data and len(data) > 0:
                    return data[:-1]
                return data

            def generate_audio(text, project_name):
                try:
                    if not text or not project_name:
                        return None, "⚠️ Texte ou nom de projet manquant"
                    
                    output_path = os.path.join(self.output_folder, f"{project_name}_output.wav")
                    
                    # Génération de l'audio
                    self.tts.tts_to_file(
                        text=text,
                        file_path=output_path,
                        language="fr"
                    )
                    
                    return output_path, "✅ Audio généré avec succès"
                except Exception as e:
                    return None, f"⚠️ Erreur: {str(e)}"

            # Événements
            create_btn.click(
                fn=update_project_info,
                inputs=[project_name, terms],
                outputs=[status_message]
            )
            
            add_section.click(
                fn=add_new_section,
                inputs=[section_template],
                outputs=[section_template]
            )
            
            remove_section.click(
                fn=remove_last_section,
                inputs=[section_template],
                outputs=[section_template]
            )

            generate_all.click(
                fn=generate_audio,
                inputs=[project_name, speaker],
                outputs=[audio_output, status]
            )

        return demo

if __name__ == "__main__":
    interface = TTSInterface()
    demo = interface.create_interface()
    demo.launch(debug=True)