import discord
import re
import logging

logger = logging.getLogger(__name__)

class UserRegistrationModal(discord.ui.Modal):
    def __init__(self, bot, title="Inscription utilisateur SCAM"):
        super().__init__(title=title, timeout=300)
        self.bot = bot
        
        # Champs du formulaire
        self.prenom = discord.ui.TextInput(
            label="Prénom",
            placeholder="Votre prénom...",
            required=True,
            max_length=50
        )
        
        self.nom = discord.ui.TextInput(
            label="Nom de famille",
            placeholder="Votre nom de famille...",
            required=True,
            max_length=50
        )
        
        self.email = discord.ui.TextInput(
            label="Email",
            placeholder="votre.email@exemple.com",
            required=True,
            max_length=100
        )
        
        self.telephone = discord.ui.TextInput(
            label="Numéro de téléphone",
            placeholder="06 12 34 56 78",
            required=True,
            max_length=20
        )
        
        self.rue = discord.ui.TextInput(
            label="Adresse (rue et numéro)",
            placeholder="123 Rue de la Paix",
            required=True,
            max_length=200
        )
        
        # Ajouter les champs au modal
        self.add_item(self.prenom)
        self.add_item(self.nom)
        self.add_item(self.email)
        self.add_item(self.telephone)
        self.add_item(self.rue)
    
    async def on_submit(self, interaction: discord.Interaction):
        """Traite la première partie du formulaire et demande code postal + ville"""
        await interaction.response.defer()
        
        # Valider l'email
        if not self.validate_email(self.email.value):
            await interaction.followup.send("❌ Format d'email invalide.", ephemeral=True)
            return
        
        # Valider le téléphone
        if not self.validate_phone(self.telephone.value):
            await interaction.followup.send("❌ Format de téléphone invalide. Utilisez le format: 06 12 34 56 78", ephemeral=True)
            return
        
        # Créer le second modal pour code postal et ville
        second_modal = AddressModal(
            self.bot,
            self.prenom.value,
            self.nom.value,
            self.email.value,
            self.telephone.value,
            self.rue.value
        )
        
        await interaction.followup.send("📍 Veuillez maintenant saisir votre code postal et ville:", ephemeral=True)
        await interaction.followup.send("Cliquez sur le bouton ci-dessous pour continuer:", view=ContinueRegistrationView(second_modal), ephemeral=True)
    
    def validate_email(self, email):
        """Valide le format de l'email"""
        pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
        return re.match(pattern, email) is not None
    
    def validate_phone(self, phone):
        """Valide le format du téléphone français"""
        # Supprimer les espaces et tirets
        clean_phone = re.sub(r'[\s\-\.]', '', phone)
        # Vérifier le format français (commence par 0 et 10 chiffres)
        pattern = r'^0[1-9][0-9]{8}$'
        return re.match(pattern, clean_phone) is not None

class AddressModal(discord.ui.Modal):
    def __init__(self, bot, prenom, nom, email, telephone, rue):
        super().__init__(title="Adresse - Code postal et ville", timeout=300)
        self.bot = bot
        self.prenom = prenom
        self.nom = nom
        self.email = email
        self.telephone = telephone
        self.rue = rue
        
        self.code_postal = discord.ui.TextInput(
            label="Code postal",
            placeholder="75001",
            required=True,
            min_length=5,
            max_length=5
        )
        
        self.ville = discord.ui.TextInput(
            label="Ville",
            placeholder="Paris",
            required=True,
            max_length=100
        )
        
        self.instagram = discord.ui.TextInput(
            label="Pseudonyme Instagram (optionnel)",
            placeholder="votre_pseudo (sans @)",
            required=False,
            max_length=50
        )
        
        self.add_item(self.code_postal)
        self.add_item(self.ville)
        self.add_item(self.instagram)
    
    async def on_submit(self, interaction: discord.Interaction):
        """Traite la finalisation de l'inscription"""
        await interaction.response.defer()
        
        # Valider le code postal
        if not self.validate_postal_code(self.code_postal.value):
            await interaction.followup.send("❌ Code postal invalide (5 chiffres requis).", ephemeral=True)
            return
        
        try:
            # Nettoyer le pseudonyme Instagram (enlever @ si présent)
            instagram_clean = self.instagram.value.strip()
            if instagram_clean.startswith('@'):
                instagram_clean = instagram_clean[1:]
            
            # Enregistrer l'utilisateur
            success = self.bot.user_manager.add_user(
                discord_id=str(interaction.user.id),
                prenom=self.prenom,
                nom=self.nom,
                email=self.email,
                telephone=self.telephone,
                rue=self.rue,
                code_postal=self.code_postal.value,
                ville=self.ville.value,
                instagram=instagram_clean if instagram_clean else None
            )
            
            if success:
                # Créer l'embed de confirmation
                embed = discord.Embed(
                    title="✅ Inscription réussie !",
                    description="Vos données ont été enregistrées avec succès.",
                    color=0x00ff00,
                    timestamp=discord.utils.utcnow()
                )
                
                embed.add_field(name="👤 Identité", value=f"{self.prenom} {self.nom}", inline=True)
                embed.add_field(name="📧 Email", value=self.email, inline=True)
                embed.add_field(name="📞 Téléphone", value=self.telephone, inline=True)
                embed.add_field(name="🏠 Adresse", value=f"{self.rue}\n{self.code_postal.value} {self.ville.value}", inline=False)
                
                if instagram_clean:
                    embed.add_field(name="📸 Instagram", value=f"@{instagram_clean}", inline=True)
                
                embed.set_footer(text="SCAMBot - Ces données seront utilisées pour vos déclarations SCAM")
                
                await interaction.followup.send(embed=embed, ephemeral=True)
                
                # Log de l'inscription
                logger.info(f"✅ Nouvel utilisateur inscrit: {self.prenom} {self.nom} ({interaction.user.id})")
                
            else:
                await interaction.followup.send("❌ Erreur lors de l'enregistrement. Veuillez réessayer.", ephemeral=True)
                
        except Exception as e:
            logger.error(f"❌ Erreur inscription utilisateur: {e}")
            await interaction.followup.send("❌ Erreur technique. Veuillez réessayer plus tard.", ephemeral=True)
    
    def validate_postal_code(self, postal_code):
        """Valide le code postal français"""
        return re.match(r'^\d{5}$', postal_code) is not None

class ContinueRegistrationView(discord.ui.View):
    def __init__(self, modal):
        super().__init__(timeout=300)
        self.modal = modal
    
    @discord.ui.button(label="📍 Continuer l'inscription", style=discord.ButtonStyle.primary, emoji="📍")
    async def continue_registration(self, interaction: discord.Interaction, button: discord.ui.Button):
        """Continue l'inscription avec le second modal"""
        await interaction.response.send_modal(self.modal)

class UserProfileView(discord.ui.View):
    def __init__(self, bot, user_data):
        super().__init__(timeout=300)
        self.bot = bot
        self.user_data = user_data
    
    @discord.ui.button(label="✏️ Modifier mes données", style=discord.ButtonStyle.secondary, emoji="✏️")
    async def edit_profile(self, interaction: discord.Interaction, button: discord.ui.Button):
        """Permet à l'utilisateur de modifier ses données"""
        # Pré-remplir le modal avec les données existantes
        modal = UserRegistrationModal(self.bot, "Modifier mes données SCAM")
        modal.prenom.default = self.user_data['prenom']
        modal.nom.default = self.user_data['nom']
        modal.email.default = self.user_data['email']
        modal.telephone.default = self.user_data['telephone']
        modal.rue.default = self.user_data['rue']
        
        await interaction.response.send_modal(modal)
    
    @discord.ui.button(label="🗑️ Supprimer mes données", style=discord.ButtonStyle.danger, emoji="🗑️")
    async def delete_profile(self, interaction: discord.Interaction, button: discord.ui.Button):
        """Permet à l'utilisateur de supprimer ses données"""
        await interaction.response.send_message(
            "⚠️ Êtes-vous sûr de vouloir supprimer toutes vos données ?\n"
            "Cette action est irréversible et vous devrez vous réinscrire pour utiliser les fonctionnalités SCAM.",
            view=ConfirmDeleteView(self.bot),
            ephemeral=True
        )

class ConfirmDeleteView(discord.ui.View):
    def __init__(self, bot):
        super().__init__(timeout=60)
        self.bot = bot
    
    @discord.ui.button(label="✅ Confirmer la suppression", style=discord.ButtonStyle.danger)
    async def confirm_delete(self, interaction: discord.Interaction, button: discord.ui.Button):
        """Confirme la suppression des données utilisateur"""
        success = self.bot.user_manager.delete_user(str(interaction.user.id))
        
        if success:
            embed = discord.Embed(
                title="🗑️ Données supprimées",
                description="Vos données personnelles ont été supprimées avec succès.",
                color=0xff0000
            )
            await interaction.response.edit_message(content=None, embed=embed, view=None)
            logger.info(f"🗑️ Utilisateur supprimé: {interaction.user.id}")
        else:
            await interaction.response.edit_message(
                content="❌ Erreur lors de la suppression. Veuillez réessayer.",
                view=None
            )
    
    @discord.ui.button(label="❌ Annuler", style=discord.ButtonStyle.secondary)
    async def cancel_delete(self, interaction: discord.Interaction, button: discord.ui.Button):
        """Annule la suppression"""
        await interaction.response.edit_message(
            content="✅ Suppression annulée. Vos données sont conservées.",
            view=None
        )