import requests
import json
import re
import logging

logger = logging.getLogger(__name__)

class LLMProcessor:
    def __init__(self):
        self.api_key = "AIzaSyAW151ftnZW0ubHxRzRQ4IGzn7mZIcs58M"
        self.api_url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent"
        
    def extract_game_name(self, description):
        """Extrait le nom du jeu ou une description générique du type de jeu"""
        if not description:
            return "Jeu vidéo"

        description_lower = description.lower()
        
        # Les plateformes/jeux bien connues à considérer comme noms valides
        known_platforms = ['roblox', 'minecraft', 'fortnite', 'gta']
        for platform in known_platforms:
            if platform.lower() in description_lower:
                return platform.title()
                
        # Les patterns qui indiquent clairement un nom de jeu
        explicit_name_patterns = [
            r'le jeu (?:s\'appelle|se nomme|est) ([^\s!.]+(?:\s+[^\s!.]+){0,6})',
            r'jeu (?:intitulé|nommé) ([^\s!.]+(?:\s+[^\s!.]+){0,6})',
            r'découvrons ([^\s!.]+(?:\s+[^\s!.]+){0,6})',
            r'jouer à ([^\s!.]+(?:\s+[^\s!.]+){0,6})',
            r'présente ([^\s!.]+(?:\s+[^\s!.]+){0,6})',
            r'titre : ([^\s!.]+(?:\s+[^\s!.]+){0,6})',
            r'\[([^\]]+)\]'  # Texte entre crochets
        ]
        
        # Chercher un nom explicite
        for pattern in explicit_name_patterns:
            matches = re.findall(pattern, description_lower)
            if matches:
                name = matches[0].strip().title()
                # Vérifier que ce n'est pas une phrase descriptive
                invalid_words = ['jeu', 'the', 'une', 'des', 'les', 'dans', 'lequel', 'ce', 'cette', 'ces', 'est', 'sont']
                words = name.lower().split()
                if len(words) <= 7 and not any(word in invalid_words for word in words):
                    return name
        
        # Si pas de nom explicite, utiliser une description du type de jeu
        if 'train' in description_lower and 'survie' in description_lower:
            return 'Jeu vidéo'  # C'était "Jeu de survie avec train"
        elif 'zombie' in description_lower or 'horreur' in description_lower:
            return 'Jeu vidéo'  # C'était "Jeu de survie horrifique"
        elif 'survie' in description_lower:
            return 'Jeu vidéo'  # C'était "Jeu de survie"
        elif 'course' in description_lower or 'voiture' in description_lower:
            return 'Jeu vidéo'  # C'était "Jeu de course"
        elif any(word in description_lower for word in ['rpg', 'role', 'rôle']):
            return 'Jeu vidéo'  # C'était "Jeu de rôle"
        elif 'coop' in description_lower or 'coopératif' in description_lower:
            return 'Jeu vidéo'  # C'était "Jeu coopératif"
        
        # Par défaut
        return "Jeu vidéo"
    
    def generate_scam_prompt(self, video_data):
        """Génère le prompt pour le formulaire SCAM complet (toutes les pages)"""
        game_name = self.extract_game_name(video_data['description'])
        duration = video_data.get('duration', 'À REMPLIR MANUELLEMENT')
        published_date = video_data.get('published_date', 'Non trouvée')
        platform = video_data['platform'].upper()
        
        # Synthétiser les aspects clés de la description
        description_summary = video_data.get('description', '')
        if len(description_summary) > 200:
            description_summary = description_summary[:200] + "..."
        
        prompt = f"""Tu es un expert qui remplit des formulaires SCAM pour des vidéos de jeux vidéo.

Analyse d'abord le contenu de la vidéo et identifie :
1. Le type de contenu : Est-ce une découverte, une analyse, un test, un guide, une critique ?
2. Le nom du jeu : S'il n'est pas explicitement mentionné, utilise simplement "Jeu vidéo"
3. Le style de la vidéo : Est-ce informatif, critique, humoristique, éducatif ?
4. Les thématiques principales du contenu
5. Des mots-clés pertinents (4-10 mots maximum)

Génère un formulaire SCAM COMPLET avec ces règles :
1. Adapte le titre au type de contenu (ex: "Analyse :", "Guide :", "Test :")
2. Le résumé doit être professionnel et factuel, adapté pour une déclaration officielle SCAM des droits d'auteur. Évite tout langage familier, vulgaire ou trop décontracté. Concentre-toi sur le contenu éducatif, informatif ou de divertissement de la vidéo. Le résumé doit expliquer clairement ce que contient la vidéo dans un contexte de déclaration de droits d'auteur.
3. Utilise le vrai nom du jeu s'il est mentionné, sinon "Jeu vidéo"
4. Utilise un ton professionnel et neutre, adapté à un contexte administratif et légal
5. Pour les thématiques, choisis parmi : Animalier, Culture, Découverte, Education, Histoire, Information, Religion, Sciences, Société, Sport
6. Les mots-clés doivent être séparés par des virgules, pertinents au contenu, et NE DOIVENT PAS inclure le nom du jeu

Format à respecter (génère les 5 pages) :

**PAGE 1 | L'œuvre**
- **Titre de l'œuvre :** [type de contenu] : [nom du jeu]
- **Résumé :** [description naturelle et engageante]
- **Lien visionnage :** [URL]
- **Durée de l'œuvre :** [durée]
- **Genre de l'œuvre :** Reportage
- **Titre du reportage :** [type de contenu] : [nom du jeu]
- **Titre du magazine :** [plateforme]
- **Votre œuvre est-elle une adaptation ?** Non
- **Votre œuvre contient-elle des inserts ?** Non

**PAGE 2 | Les diffusions**
- **Type de diffusion :** Internet
- **Nom du site internet :** [plateforme]
- **URL (hors TV de rattrapage) :** [URL]
- **Date de mise en ligne :** [date de publication]
- **Durée de la diffusion :** [durée]

**PAGE 5 | Thématiques et mots-clés**
- **Thématiques choisies :** [1 à 3 thématiques parmi : Animalier, Culture, Découverte, Education, Histoire, Information, Religion, Sciences, Société, Sport]
- **Mots-clés :** [4 à 10 mots-clés pertinents séparés par des virgules, SANS inclure le nom du jeu]

**PAGE 6 | Auteurs et producteurs**
- **Auteur 1 :**
  - **Prénom et nom :** [À remplir par l'utilisateur]
  - **Fonction :** Auteur - Réalisateur (ou Autrice - Réalisatrice)
  - **Adresse postale :** [À remplir par l'utilisateur]
  - **Courriel :** [À remplir par l'utilisateur] (obligatoire si signature électronique)
  - **Tél. mobile :** [À remplir par l'utilisateur] (obligatoire si signature électronique)
  - **Part de droits :** 100%
- **⚠️ Cocher "Mon œuvre est en autoproduction"**
- **Producteur 1 :**
  - **Nom de la société :** AUTOPRODUCTION
  - **Année de production :** [Année de la date de publication]
  - **Pays de la société de production :** FRANCE

**PAGE 7 | Validation**
- **Je souhaite transmettre ma déclaration :** Par voie électronique
- **Type de document :** Contrat
- **⚠️ Cliquer sur "Ajouter des Documents" et joindre l'attestation sur l'honneur**

Voici les informations de la vidéo :
URL: {video_data['url']}
Description: {video_data['description']}
Durée: {duration}
Date de publication: {published_date}
Plateforme: {platform}

Remplace chaque [élément] en respectant strictement les règles ci-dessus et génère les 5 pages complètes."""
        return prompt
    
    def parse_scam_pages(self, full_form_data):
        """Parse le formulaire complet en pages séparées"""
        try:
            pages = {}
            
            # Diviser le contenu par pages
            if "**PAGE 1 | L'œuvre**" in full_form_data:
                # Nouveau format avec pages
                page_sections = full_form_data.split("**PAGE ")
                
                for section in page_sections:
                    if not section.strip():
                        continue
                        
                    if section.startswith("1 | L'œuvre**"):
                        pages['page1'] = "**1 | L'œuvre**" + section[len("1 | L'œuvre**"):]
                        # Nettoyer jusqu'à la prochaine page
                        if "**PAGE 2" in pages['page1']:
                            pages['page1'] = pages['page1'].split("**PAGE 2")[0].strip()
                    
                    elif section.startswith("2 | Les diffusions**"):
                        pages['page2'] = "**2 | Les diffusions**" + section[len("2 | Les diffusions**"):]
                        if "**PAGE 5" in pages['page2']:
                            pages['page2'] = pages['page2'].split("**PAGE 5")[0].strip()
                    
                    elif section.startswith("5 | Thématiques et mots-clés**"):
                        pages['page5'] = "**5 | Thématiques et mots-clés**" + section[len("5 | Thématiques et mots-clés**"):]
                        if "**PAGE 6" in pages['page5']:
                            pages['page5'] = pages['page5'].split("**PAGE 6")[0].strip()
                    
                    elif section.startswith("6 | Auteurs et producteurs**"):
                        pages['page6'] = "**6 | Auteurs et producteurs**" + section[len("6 | Auteurs et producteurs**"):]
                        if "**PAGE 7" in pages['page6']:
                            pages['page6'] = pages['page6'].split("**PAGE 7")[0].strip()
                    
                    elif section.startswith("7 | Validation**"):
                        pages['page7'] = "**7 | Validation**" + section[len("7 | Validation**"):]
            
            else:
                # Ancien format, on garde juste la page 1
                pages['page1'] = full_form_data
                pages['page2'] = "**2 | Les diffusions**\n- **Type de diffusion :** Internet\n- **Nom du site internet :** À compléter\n- **URL :** À compléter\n- **Date de mise en ligne :** À compléter\n- **Durée :** À compléter"
                pages['page5'] = "**5 | Thématiques et mots-clés**\n- **Thématiques :** À compléter\n- **Mots-clés :** À compléter"
            
            # S'assurer qu'on a au moins les 5 pages de base
            if 'page1' not in pages:
                pages['page1'] = "**1 | L'œuvre**\nContenu à générer..."
            if 'page2' not in pages:
                pages['page2'] = "**2 | Les diffusions**\nContenu à générer..."
            if 'page5' not in pages:
                pages['page5'] = "**5 | Thématiques et mots-clés**\nContenu à générer..."
            if 'page6' not in pages:
                pages['page6'] = "**6 | Auteurs et producteurs**\nContenu à générer..."
            if 'page7' not in pages:
                pages['page7'] = "**7 | Validation**\nContenu à générer..."
            
            return pages
            
        except Exception as e:
            logger.error(f"❌ Erreur parsing pages: {e}")
            # Fallback
            return {
                'page1': full_form_data,
                'page2': "**2 | Les diffusions**\nErreur de parsing",
                'page5': "**5 | Thématiques et mots-clés**\nErreur de parsing",
                'page6': "**6 | Auteurs et producteurs**\nErreur de parsing",
                'page7': "**7 | Validation**\nErreur de parsing"
            }
    
    def call_gemini(self, prompt):
        """Appelle l'API Gemini pour générer la réponse"""
        try:
            headers = {
                'Content-Type': 'application/json',
                'X-goog-api-key': self.api_key
            }
            
            payload = {
                "contents": [{
                    "parts": [{
                        "text": prompt
                    }]
                }],
                "generationConfig": {
                    "temperature": 0.2,
                    "topP": 0.8,
                    "maxOutputTokens": 1000
                }
            }
            
            response = requests.post(
                self.api_url,
                headers=headers,
                json=payload,
                timeout=30
            )
            
            if response.status_code != 200:
                raise Exception(f"Erreur API Gemini: {response.status_code}")
            
            return response
                
        except requests.exceptions.RequestException as e:
            raise Exception(f"Erreur de connexion à Gemini: {e}")
        except Exception as e:
            raise Exception(f"Erreur inattendue: {e}")
    
    def process_video(self, video_data):
        """Traite une vidéo et génère le formulaire SCAM complet avec pages"""
        try:
            logger.info(f"🤖 Génération du formulaire SCAM pour {video_data['platform']}")
            
            # Générer le prompt
            prompt = self.generate_scam_prompt(video_data)
            
            # Appeler Gemini
            response = self.call_gemini(prompt)
            result = response.json()
            
            if 'candidates' in result:
                response_text = result['candidates'][0]['content']['parts'][0]['text']
                
                # Parser les pages
                pages = self.parse_scam_pages(response_text)
                
                # Générer automatiquement le contrat PDF pour la page 7
                from .contract_generator import ContractGenerator
                contract_gen = ContractGenerator()
                
                # Créer un contrat générique (sera mis à jour quand l'utilisateur s'inscrira)
                contract_info = {
                    'title': self.extract_game_name(video_data['description']),
                    'platform': video_data['platform'],
                    'published_date': video_data.get('published_date', 'Non trouvée'),
                    'url': video_data['url']
                }
                
                contract_content = contract_gen.generate_generic_contract(contract_info)
                pages['page7'] = f"""**7 | Validation**

📋 **Je souhaite transmettre ma déclaration**
✅ Par voie électronique

📎 **Documents à joindre**
✅ Contrat PDF (généré automatiquement lors de l'affichage de cette page)

� **Génération automatique de PDF :**
🔄 **Pour utilisateurs non inscrits :** Contrat générique avec champs à compléter
📄 **Pour utilisateurs inscrits :** Contrat personnalisé avec vos données (via `/register`)

✅ **Génération automatique de PDF :** Disponible pour les utilisateurs enregistrés."""
                
                return {
                    'success': True,
                    'full_form_data': response_text,
                    'pages': pages,
                    'game_name': self.extract_game_name(video_data['description']),
                    'platform': video_data['platform']
                }
            else:
                raise Exception("Format de réponse inattendu de Gemini")
            
        except Exception as e:
            logger.error(f"❌ Erreur lors du traitement: {e}")
            return {
                'success': False,
                'error': str(e),
                'full_form_data': f"Erreur lors de la génération du formulaire: {str(e)}",
                'pages': {
                    'page1': f"Erreur: {str(e)}",
                    'page2': f"Erreur: {str(e)}",
                    'page5': f"Erreur: {str(e)}",
                    'page6': f"Erreur: {str(e)}",
                    'page7': f"Erreur: {str(e)}"
                }
            } 