import disnake
from disnake.ext import commands
import json
import os
from typing import List
from utils.premium import check_premium_tier

# Chemins ABSOLUS des fichiers
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
DATA_DIR = os.path.join(BASE_DIR, "..", "data")
WHITELIST_FILE = os.path.join(DATA_DIR, "whitelist.json")

# Créer le dossier data/ s'il n'existe pas
os.makedirs(DATA_DIR, exist_ok=True)

class Whitelist(commands.Cog):
    def __init__(self, bot):
        self.bot = bot
        self.whitelist = self.load_whitelist()

    def load_whitelist(self):
        if not os.path.exists(WHITELIST_FILE):
            return {}
        try:
            with open(WHITELIST_FILE, "r", encoding="utf-8") as f:
                return json.load(f)
        except json.JSONDecodeError:
            return {}

    def save_whitelist(self):
        with open(WHITELIST_FILE, "w", encoding="utf-8") as f:
            json.dump(self.whitelist, f, ensure_ascii=False, indent=4)

    def _get_guild_whitelist(self, guild_id: int) -> List[str]:
        return self.whitelist.get(str(guild_id), [])

    def _set_guild_whitelist(self, guild_id: int, users: List[str]):
        self.whitelist[str(guild_id)] = users
        self.save_whitelist()

    @commands.slash_command(name="whitelist", description="Gère la whitelist du serveur")
    @check_premium_tier()
    async def whitelist_group(self, interaction: disnake.ApplicationCommandInteraction):
        """Groupe de commandes pour gérer la whitelist"""
        pass

    # ✅ Ajouter un utilisateur
    @whitelist_group.sub_command(name="ajouter", description="Ajoute un utilisateur à la whitelist")
    async def ajouter(self, interaction: disnake.ApplicationCommandInteraction, utilisateur: disnake.User):
        guild_id = interaction.guild.id
        users = self._get_guild_whitelist(guild_id)
        user_id = str(utilisateur.id)
        
        if user_id in users:
            return await interaction.response.send_message(f"🔒 {utilisateur.mention} est déjà dans la whitelist.", ephemeral=True)
            
        users.append(user_id)
        self._set_guild_whitelist(guild_id, users)
        await interaction.response.send_message(f"✅ {utilisateur.mention} a été ajouté à la whitelist.", ephemeral=True)

    # ❌ Retirer un utilisateur
    @whitelist_group.sub_command(name="retirer", description="Retire un utilisateur de la whitelist")
    async def retirer(self, interaction: disnake.ApplicationCommandInteraction, utilisateur: disnake.User):
        guild_id = interaction.guild.id
        users = self._get_guild_whitelist(guild_id)
        user_id = str(utilisateur.id)
        
        if user_id not in users:
            return await interaction.response.send_message(f"⚠️ {utilisateur.mention} n'est pas dans la whitelist.", ephemeral=True)
            
        users.remove(user_id)
        self._set_guild_whitelist(guild_id, users)
        await interaction.response.send_message(f"✅ {utilisateur.mention} a été retiré de la whitelist.", ephemeral=True)

    # 📋 Voir la whitelist
    @whitelist_group.sub_command(name="liste", description="Affiche les utilisateurs de la whitelist")
    async def liste(self, interaction: disnake.ApplicationCommandInteraction):
        guild_id = interaction.guild.id
        users = self._get_guild_whitelist(guild_id)
        
        if not users:
            return await interaction.response.send_message("📭 La whitelist est vide pour ce serveur.", ephemeral=True)
            
        await interaction.response.defer(ephemeral=True)
        
        membres = []
        for user_id in users:
            try:
                utilisateur = await self.bot.fetch_user(int(user_id))
                membres.append(f"- {utilisateur.mention} ({utilisateur.name})")
            except disnake.NotFound:
                membres.append(f"- <@{user_id}> (Utilisateur introuvable)")
                
        texte = "\n".join(membres)
        await interaction.edit_original_response(content=f"📃 **Utilisateurs whitelistés pour ce serveur :**\n{texte}")

    def is_whitelisted(self, guild_id: int, user_id: int) -> bool:
        """Check if a user is whitelisted for a specific guild."""
        return str(user_id) in self._get_guild_whitelist(guild_id)

    def get_whitelist_users(self, guild_id: int) -> List[str]:
        """Get all whitelisted user IDs for a specific guild."""
        return self._get_guild_whitelist(guild_id).copy()


def setup(bot):
    bot.add_cog(Whitelist(bot))