import discord
from discord import app_commands
from discord.ext import commands
from datetime import datetime
import logging
from database import db
from utils.security import check_security_compliance

logger = logging.getLogger("gamble_bot.cogs.admin")

class LinkAccountModal(discord.ui.Modal):
    def __init__(self):
        super().__init__(title="🔗 Hesap Eşleştirme")
        self.game_username = discord.ui.TextInput(
            label="Minecraft Kullanıcı Adınız",
            placeholder="Örn: KolicPlayer",
            min_length=3,
            max_length=16,
            required=True
        )
        self.add_item(self.game_username)

    async def on_submit(self, interaction: discord.Interaction):
        if not await check_security_compliance(interaction):
            return
        
        await interaction.response.defer(ephemeral=True)
        username = self.game_username.value.strip()
        
        # Check if username contains invalid characters
        if not username.replace("_", "").isalnum():
            await interaction.followup.send("❌ Hata: Geçersiz karakterler! Minecraft kullanıcı adı sadece harf, sayı ve alt çizgi (_) içerebilir.", ephemeral=True)
            return

        import config
        # Check if the Minecraft username is already linked to another Discord account
        existing_link = await db.fetchrow("SELECT discord_id FROM users WHERE game_username = ?", username) if config.USE_SQLITE else \
                        await db.fetchrow("SELECT discord_id FROM users WHERE game_username = $1", username)
        if existing_link:
            if int(existing_link["discord_id"]) != int(interaction.user.id):
                await interaction.followup.send(
                    f"❌ **Güvenlik Engeli:** `{username}` Minecraft hesabı zaten başka bir Discord hesabı ile eşleştirilmiş!\n"
                    f"Bir Minecraft hesabı sadece tek bir Discord hesabına bağlanabilir.",
                    ephemeral=True
                )
                return

        import random, time
        from web_server import pending_registrations
        
        # Generate 6 digit code with 5-minute TTL and max-attempt tracking
        code = f"{random.randint(100000, 999999)}"
        pending_registrations[username.lower()] = {
            "discord_id": interaction.user.id,
            "code": code,
            "created_at": time.time(),
            "attempts": 0
        }
        
        await interaction.followup.send(
            f"✅ **Eşleştirme Başlatıldı!**\n\n"
            f"Eşleştirmeyi tamamlamak için Minecraft oyununda bota şu mesajı gönderin:\n"
            f"**`/msg KolicGambleBot onay {code}`**\n\n"
            f"*(⏳ Kod **5 dakika** geçerlidir ve tek kullanımlıktır. İşlem tamamlandığında bot size DM üzerinden onay gönderecektir.)*",
            ephemeral=True
        )


class EconomyPanelView(discord.ui.View):
    """Persistent button panel for Deposit, Withdraw, Link, Balance, and Daily interactions."""
    def __init__(self):
        super().__init__(timeout=None) # Persistent buttons survive restarts

    @discord.ui.button(
        label="Para Yatır (Deposit)",
        style=discord.ButtonStyle.success,
        emoji="📥",
        custom_id="panel_deposit_btn",
        row=0
    )
    async def deposit_callback(self, interaction: discord.Interaction, button: discord.ui.Button):
        await interaction.response.send_message(
            "ℹ️ **Para Yatırma İşlemi Tamamen Otomatiktir!**\n\n"
            "1. Aşağıdaki **🔗 Hesap Eşleştir** butonu ile Minecraft oyun içi kullanıcı adınızı bağlayın.\n"
            "2. Oyunda bota para gönderin: **`/pay KolicGambleBot <miktar>`**\n\n"
            "Ödemeniz algılandığı an bakiyeniz saniyeler içinde otomatik olarak Discord hesabınıza yüklenecektir!",
            ephemeral=True
        )

    @discord.ui.button(
        label="Para Çek (Withdraw)",
        style=discord.ButtonStyle.secondary,
        emoji="📤",
        custom_id="panel_withdraw_btn",
        row=0
    )
    async def withdraw_callback(self, interaction: discord.Interaction, button: discord.ui.Button):
        from cogs.economy import WithdrawModal
        user_db = await db.get_user(interaction.user.id)
        default_username = user_db.get("game_username", "") if user_db else ""
        modal = WithdrawModal(default_username=default_username)
        await interaction.response.send_modal(modal)

    @discord.ui.button(
        label="Hesap Eşleştir (Link)",
        style=discord.ButtonStyle.primary,
        emoji="🔗",
        custom_id="panel_link_btn",
        row=0
    )
    async def link_callback(self, interaction: discord.Interaction, button: discord.ui.Button):
        # Check if user already has a linked account
        user_db = await db.get_user(interaction.user.id)
        if user_db and user_db.get("game_username"):
            await interaction.response.send_message(
                f"ℹ️ **Hesabınız Zaten Eşleştirilmiş!**\n"
                f"Bu Discord hesabına bağlı Minecraft karakteri: **`{user_db['game_username']}`**\n\n"
                f"*Hesabınızı değiştirmek istiyorsanız lütfen yetkililere bildirin.*",
                ephemeral=True
            )
            return

        await interaction.response.send_modal(LinkAccountModal())

    @discord.ui.button(
        label="Bakiye Sorgula",
        style=discord.ButtonStyle.primary,
        emoji="💰",
        custom_id="panel_balance_btn",
        row=1
    )
    async def balance_callback(self, interaction: discord.Interaction, button: discord.ui.Button):
        await interaction.response.defer(ephemeral=True)
        user_db = await db.register_user(interaction.user.id, None)
        balance = user_db.get("balance", 0.0)
        game_username = user_db.get("game_username", "*Kayıtlı Değil*")

        from utils.security import format_money_string
        formatted_balance = format_money_string(balance)

        embed = discord.Embed(
            title="💳 Cüzdan Bilgileriniz",
            description="Cüzdan ve oyun içi bakiye durumunuz:",
            color=discord.Color.blue()
        )
        embed.add_field(name="Mevcut Bakiye", value=f"💰 **{formatted_balance}** ({balance:,.2f})", inline=True)
        embed.add_field(name="Oyun Adı", value=f"🎮 `{game_username}`", inline=True)
        
        await interaction.followup.send(embed=embed, ephemeral=True)


async def log_admin_action(bot, admin: discord.User, action_name: str, target: discord.User = None, details: str = ""):
    """Logs administrative actions into the admin log channel."""
    import config
    from utils.logger import send_embed_to_channel
    if not config.ADMIN_LOG_CHANNEL_ID:
        return
    
    embed = discord.Embed(
        title="🛡️ Yetkili İşlem Kaydı (Admin Audit Log)",
        color=discord.Color.blue(),
        timestamp=datetime.utcnow()
    )
    embed.add_field(name="Yetkili", value=f"{admin.mention} (`{admin.name}` - ID: `{admin.id}`)", inline=False)
    embed.add_field(name="İşlem / Komut", value=f"`{action_name}`", inline=True)
    if target:
        embed.add_field(name="Hedef Kullanıcı", value=f"{target.mention} (`{target.name}` - ID: `{target.id}`)", inline=True)
    if details:
        embed.add_field(name="Detaylar", value=details, inline=False)
        
    await send_embed_to_channel(bot, config.ADMIN_LOG_CHANNEL_ID, embed)


def is_crown_owner(interaction: discord.Interaction) -> bool:
    """Returns True ONLY if the interacting user is the Guild Owner (the Discord crown holder)."""
    return bool(interaction.guild and interaction.user.id == interaction.guild.owner_id)

def owner_only():
    """Slash command check enforcing that only the server crown holder can run it."""
    async def predicate(interaction: discord.Interaction) -> bool:
        if is_crown_owner(interaction):
            return True
        await interaction.response.send_message(
            "❌ **Yetkisiz Erişim:** Bu işlemi sadece sunucu sahibi (Taç sahibi) gerçekleştirebilir!",
            ephemeral=True
        )
        return False
    return app_commands.check(predicate)


class AdminDashboardView(discord.ui.View):
    def __init__(self):
        super().__init__(timeout=None)

    @discord.ui.button(label="🛑 Kumarı Dondur / Aç", style=discord.ButtonStyle.danger, custom_id="admin_toggle_games", row=0)
    async def toggle_games(self, interaction: discord.Interaction, button: discord.ui.Button):
        if not is_crown_owner(interaction):
            await interaction.response.send_message("❌ **Erişim Reddedildi:** Bu paneli sadece sunucu sahibi (Taç sahibi) kullanabilir!", ephemeral=True)
            return

        import config
        config.GAMES_ENABLED = not getattr(config, "GAMES_ENABLED", True)
        status_str = "AÇILDI (Aktif)" if config.GAMES_ENABLED else "KAPATILDI (Donduruldu)"
        color = discord.Color.green() if config.GAMES_ENABLED else discord.Color.red()

        embed = discord.Embed(
            title="🎛️ Kumar Durumu Güncellendi",
            description=f"Sunucudaki tüm kumar oyunları ve kasalar **{status_str}**.",
            color=color,
            timestamp=datetime.utcnow()
        )
        await interaction.response.send_message(embed=embed, ephemeral=True)

        await log_admin_action(
            interaction.client,
            interaction.user,
            "GAMES_KILLSWITCH_TOGGLE",
            details=f"Kumar sistemi durumu: **{status_str}** olarak değiştirildi."
        )

    @discord.ui.button(label="📊 Canlı İstatistikler", style=discord.ButtonStyle.primary, emoji="📊", custom_id="admin_stats_btn", row=0)
    async def view_stats(self, interaction: discord.Interaction, button: discord.ui.Button):
        if not is_crown_owner(interaction):
            await interaction.response.send_message("❌ **Erişim Reddedildi:** Bu paneli sadece sunucu sahibi (Taç sahibi) kullanabilir!", ephemeral=True)
            return

        await interaction.response.defer(ephemeral=True)
        import config
        from utils.security import format_money_string

        user_count_row = await db.fetchrow("SELECT COUNT(*) as c FROM users")
        total_bal_row = await db.fetchrow("SELECT SUM(balance) as s FROM users")
        pending_withdraws_row = await db.fetchrow("SELECT COUNT(*) as c, SUM(amount) as s FROM economy_transactions WHERE type = 'withdraw' AND status = 'pending'")
        
        user_count = user_count_row["c"] if user_count_row else 0
        total_bal = total_bal_row["s"] if total_bal_row and total_bal_row["s"] else 0.0
        pending_count = pending_withdraws_row["c"] if pending_withdraws_row else 0
        pending_amount = pending_withdraws_row["s"] if pending_withdraws_row and pending_withdraws_row["s"] else 0.0

        embed = discord.Embed(
            title="📊 Sunucu & Ekonomi İstatistikleri",
            color=discord.Color.blue(),
            timestamp=datetime.utcnow()
        )
        embed.add_field(name="👥 Kayıtlı Oyuncu Sayısı", value=f"`{user_count}` kişi", inline=True)
        embed.add_field(name="💳 Dolaşımdaki Toplam Para", value=f"**{format_money_string(total_bal)}** ({total_bal:,.2f})", inline=True)
        embed.add_field(name="🛑 Kumar Durumu", value="🟢 Aktif" if getattr(config, "GAMES_ENABLED", True) else "🔴 Donduruldu", inline=True)
        embed.add_field(name="⌛ Bekleyen Para Çekimleri", value=f"`{pending_count}` adet (**{format_money_string(pending_amount)}**)", inline=False)
        
        await interaction.followup.send(embed=embed, ephemeral=True)

    @discord.ui.button(label="📈 Kasa Kâr/Zarar Raporu", style=discord.ButtonStyle.success, emoji="💰", custom_id="admin_profit_btn", row=0)
    async def view_profit(self, interaction: discord.Interaction, button: discord.ui.Button):
        if not is_crown_owner(interaction):
            await interaction.response.send_message("❌ **Erişim Reddedildi:** Bu paneli sadece sunucu sahibi (Taç sahibi) kullanabilir!", ephemeral=True)
            return

        await interaction.response.defer(ephemeral=True)
        from utils.security import format_money_string

        # Calculate deposits
        dep_row = await db.fetchrow("SELECT SUM(amount) as s FROM economy_transactions WHERE type = 'deposit' AND status = 'completed'")
        total_deposit = dep_row["s"] if dep_row and dep_row["s"] else 0.0

        # Calculate withdrawals
        with_row = await db.fetchrow("SELECT SUM(amount) as s FROM economy_transactions WHERE type = 'withdraw' AND status = 'completed'")
        total_withdraw = with_row["s"] if with_row and with_row["s"] else 0.0

        # Calculate bets (losses for players / gains for house)
        bets_row = await db.fetchrow("SELECT SUM(amount) as s FROM economy_transactions WHERE type IN ('coinflip_bet', 'slots_bet', 'blackjack_bet', 'blackjack_double_bet', 'crash_bet', 'roulette_bet', 'crate_buy', 'mines_bet')")
        total_bets = abs(bets_row["s"]) if bets_row and bets_row["s"] else 0.0

        # Calculate payouts (gains for players / cost for house)
        wins_row = await db.fetchrow("SELECT SUM(amount) as s FROM economy_transactions WHERE type IN ('coinflip_win', 'slots_win', 'blackjack_payout', 'crash_payout', 'roulette_win', 'crate_win', 'mines_win')")
        total_wins = wins_row["s"] if wins_row and wins_row["s"] else 0.0

        # Net casino profit = bets - wins
        net_casino_profit = total_bets - total_wins
        net_flow = total_deposit - total_withdraw

        embed = discord.Embed(
            title="📈 Kasa Muhasebe & Kâr/Zarar Raporu",
            description="Botun açılışından bu yana gerçekleşen tüm finansal veriler:",
            color=discord.Color.gold(),
            timestamp=datetime.utcnow()
        )
        embed.add_field(name="📥 Toplam Yatırılan (Deposit)", value=f"**{format_money_string(total_deposit)}** ({total_deposit:,.2f})", inline=True)
        embed.add_field(name="📤 Toplam Çekilen (Withdraw)", value=f"**{format_money_string(total_withdraw)}** ({total_withdraw:,.2f})", inline=True)
        embed.add_field(name="💵 Net Kasa Nakit Akışı", value=f"**{format_money_string(net_flow)}**", inline=True)
        
        embed.add_field(name="🎲 Oynanan Toplam Bahis", value=f"**{format_money_string(total_bets)}**", inline=True)
        embed.add_field(name="🏆 Dağıtılan Toplam Kazanç", value=f"**{format_money_string(total_wins)}**", inline=True)
        
        profit_emoji = "👑" if net_casino_profit >= 0 else "📉"
        embed.add_field(
            name=f"{profit_emoji} Net Kumarhane Kârı",
            value=f"**{'+' if net_casino_profit >= 0 else ''}{format_money_string(net_casino_profit)}** ({net_casino_profit:,.2f})",
            inline=False
        )

        await interaction.followup.send(embed=embed, ephemeral=True)

    @discord.ui.button(label="🚨 Şüpheli İşlemler", style=discord.ButtonStyle.danger, emoji="🚨", custom_id="admin_suspicious_btn", row=1)
    async def view_suspicious(self, interaction: discord.Interaction, button: discord.ui.Button):
        if not is_crown_owner(interaction):
            await interaction.response.send_message("❌ **Erişim Reddedildi:** Bu paneli sadece sunucu sahibi (Taç sahibi) kullanabilir!", ephemeral=True)
            return

        await interaction.response.defer(ephemeral=True)
        logs = await db.fetch("SELECT * FROM suspicious_logs ORDER BY id DESC LIMIT 5")
        if not logs:
            await interaction.followup.send("🟢 Sistemde kayıtlı şüpheli aktivite logu bulunmuyor.", ephemeral=True)
            return

        embed = discord.Embed(
            title="🚨 Son Şüpheli Aktiviteler (Top 5)",
            color=discord.Color.red(),
            timestamp=datetime.utcnow()
        )
        for log in logs:
            time_str = log["created_at"]
            if isinstance(time_str, datetime):
                time_str = time_str.strftime("%Y-%m-%d %H:%M:%S")
            embed.add_field(
                name=f"👤 {log['username']} ({log['discord_id']})",
                value=f"**Tip:** `{log['activity_type']}`\n**Detay:** {log['details']}\n**Tarih:** *{time_str}*",
                inline=False
            )
        await interaction.followup.send(embed=embed, ephemeral=True)

    # --- MINECRAFT BOT REMOTE CONTROLLER BUTTONS ---

    @discord.ui.button(label="🔄 MC Botu Yeniden Bağla", style=discord.ButtonStyle.secondary, emoji="🔄", custom_id="admin_mc_reconnect", row=1)
    async def mc_reconnect(self, interaction: discord.Interaction, button: discord.ui.Button):
        if not is_crown_owner(interaction):
            await interaction.response.send_message("❌ **Erişim Reddedildi:** Bu paneli sadece sunucu sahibi (Taç sahibi) kullanabilir!", ephemeral=True)
            return

        from web_server import send_minecraft_reconnect
        success = await send_minecraft_reconnect()
        if success:
            await interaction.response.send_message("🔄 **Minecraft Botuna Yeniden Bağlanma Komutu Gönderildi!**\nBot sunucu bağlantısını yenileyip tekrar giriş yapacak.", ephemeral=True)
            await log_admin_action(interaction.client, interaction.user, "MC_BOT_REMOTE_RECONNECT", details="Minecraft botu uzaktan yeniden başlatıldı.")
        else:
            await interaction.response.send_message("❌ **Hata:** Bot köprü sunucusuna bağlı değil veya çevrimdışı.", ephemeral=True)

    @discord.ui.button(label="📍 MC Bot Durum & Konumu", style=discord.ButtonStyle.secondary, emoji="📍", custom_id="admin_mc_status", row=1)
    async def mc_status_info(self, interaction: discord.Interaction, button: discord.ui.Button):
        if not is_crown_owner(interaction):
            await interaction.response.send_message("❌ **Erişim Reddedildi:** Bu paneli sadece sunucu sahibi (Taç sahibi) kullanabilir!", ephemeral=True)
            return

        await interaction.response.defer(ephemeral=True)
        from web_server import get_minecraft_info
        info = await get_minecraft_info()

        if not info.get("success"):
            embed = discord.Embed(
                title="🔴 Minecraft Botu Çevrimdışı",
                description=f"Bot şu anda Minecraft sunucusuna bağlı değil.\n**Sebep:** {info.get('reason', 'Bağlantı yok')}",
                color=discord.Color.red(),
                timestamp=datetime.utcnow()
            )
            await interaction.followup.send(embed=embed, ephemeral=True)
            return

        health = info.get("health", 20)
        food = info.get("food", 20)
        x = info.get("x", 0)
        y = info.get("y", 0)
        z = info.get("z", 0)
        players = info.get("player_count", 0)
        server = info.get("server", "kolichub.net:25565")
        user = info.get("username", "KolicGambleBot")

        embed = discord.Embed(
            title="🟢 Canlı Minecraft Bot Durumu & Telemetri",
            color=discord.Color.green(),
            timestamp=datetime.utcnow()
        )
        embed.add_field(name="🤖 Bot Kullanıcı Adı", value=f"`{user}`", inline=True)
        embed.add_field(name="🌐 Bağlı Sunucu", value=f"`{server}`", inline=True)
        embed.add_field(name="👥 Sunucudaki Oyuncular", value=f"`{players}` kişi", inline=True)
        embed.add_field(name="❤️ Can / Açlık", value=f"❤️ `{health}/20` | 🍖 `{food}/20`", inline=True)
        embed.add_field(name="📍 Mevcut Konum (X, Y, Z)", value=f"`X: {x} | Y: {y} | Z: {z}`", inline=True)

        await interaction.followup.send(embed=embed, ephemeral=True)

    @discord.ui.button(label="💬 Oyuna Mesaj / Komut Gönder", style=discord.ButtonStyle.primary, emoji="💬", custom_id="admin_mc_chat", row=2)
    async def mc_chat_command(self, interaction: discord.Interaction, button: discord.ui.Button):
        if not is_crown_owner(interaction):
            await interaction.response.send_message("❌ **Erişim Reddedildi:** Bu paneli sadece sunucu sahibi (Taç sahibi) kullanabilir!", ephemeral=True)
            return

        class AdminRemoteChatModal(discord.ui.Modal, title="💬 Oyuna Mesaj / Komut Gönder"):
            chat_input = discord.ui.TextInput(
                label="Gönderilecek Mesaj veya Komut",
                placeholder="Örn: /spawn veya Discord kumarhanesine bekleriz!",
                min_length=1,
                max_length=200,
                required=True
            )

            async def on_submit(self, modal_interaction: discord.Interaction):
                from web_server import send_minecraft_chat
                cmd = self.chat_input.value.strip()
                success = await send_minecraft_chat(cmd)
                if success:
                    await modal_interaction.response.send_message(f"✅ **Mesaj Oyuna İletildi:** `{cmd}`", ephemeral=True)
                    await log_admin_action(modal_interaction.client, modal_interaction.user, "MC_BOT_REMOTE_CHAT", details=f"**Gönderilen:** `{cmd}`")
                else:
                    await modal_interaction.response.send_message("❌ **Hata:** Minecraft botu bağlı değil.", ephemeral=True)

        await interaction.response.send_modal(AdminRemoteChatModal())


class AdminCog(commands.Cog, name="Admin Panel & Yönetim"):
    def __init__(self, bot):
        self.bot = bot

    # --- ANTI-DELETE LOG PROTECTION LISTENER ---
    @commands.Cog.listener()
    async def on_message_delete(self, message: discord.Message):
        """Prevents log tampering by immediately reposting any deleted log/audit message."""
        import config
        if not message.guild:
            return
        
        # Check if the deleted message is from one of the protected admin log channels
        protected_channels = [config.ADMIN_LOG_CHANNEL_ID, config.ADMIN_APPROVAL_CHANNEL_ID]
        if message.channel.id in protected_channels:
            if message.embeds:
                warning_embed = discord.Embed(
                    title="🚨 GÜVENLİK UYARISI: Silinen Log Mesajı Kurtarıldı!",
                    description=(
                        "⚠️ **Bir yetkili bu kanaldaki resmi işlem kaydını silmeye çalıştı!**\n"
                        "Silinen log kaydı güvenlik sistemi tarafından otomatik olarak yeniden gönderildi:"
                    ),
                    color=discord.Color.red(),
                    timestamp=datetime.utcnow()
                )
                try:
                    await message.channel.send(embed=warning_embed)
                    for em in message.embeds:
                        await message.channel.send(embed=em)
                except Exception as e:
                    logger.error(f"Error reposting deleted log: {e}")

    @app_commands.command(name="setup_panel", description="Para yatırma/çekme butonlarının bulunduğu ana işlem panelini gönderir.")
    @owner_only()
    async def setup_panel(self, interaction: discord.Interaction):
        """Sends the main interaction panel for users to perform deposit/withdraw actions."""
        embed = discord.Embed(
            title="🎮 KolicGamble Kumar & Ekonomi Paneli",
            description=(
                "Sunucu içi kumar oyunları oynamak ve cüzdanınızı yönetmek için aşağıdaki butonları kullanın.\n\n"
                "**📥 Para Yatırma (Deposit):**\n"
                "1. Aşağıdaki **🔗 Hesap Eşleştir** butonu ile Minecraft adınızı bağlayın.\n"
                "2. Oyunda bota para gönderin: `/pay KolicGambleBot [Miktar]`. Bakiyeniz otomatik yüklenecektir!\n\n"
                "**📤 Para Çekme (Withdraw):**\n"
                "Butona tıklayarak bakiyenizi oyun içi hesabınıza anında çekin."
            ),
            color=discord.Color.gold(),
            timestamp=datetime.utcnow()
        )
        embed.set_footer(text="Güvenli İşlem Altyapısı • KolicGambleBot")
        
        view = EconomyPanelView()
        await interaction.response.send_message("Panel başarıyla kuruluyor...", ephemeral=True)
        await interaction.channel.send(embed=embed, view=view)

    @app_commands.command(name="kasa_raporu", description="Sunucu kasasının toplam kâr/zarar ve muhasebe raporunu gösterir.")
    @owner_only()
    async def casino_profit_report(self, interaction: discord.Interaction):
        """Displays total casino profit and loss audit."""
        await interaction.response.defer(ephemeral=True)
        from utils.security import format_money_string

        dep_row = await db.fetchrow("SELECT SUM(amount) as s FROM economy_transactions WHERE type = 'deposit' AND status = 'completed'")
        total_deposit = dep_row["s"] if dep_row and dep_row["s"] else 0.0

        with_row = await db.fetchrow("SELECT SUM(amount) as s FROM economy_transactions WHERE type = 'withdraw' AND status = 'completed'")
        total_withdraw = with_row["s"] if with_row and with_row["s"] else 0.0

        bets_row = await db.fetchrow("SELECT SUM(amount) as s FROM economy_transactions WHERE type IN ('coinflip_bet', 'slots_bet', 'blackjack_bet', 'blackjack_double_bet', 'crash_bet', 'roulette_bet', 'crate_buy', 'mines_bet')")
        total_bets = abs(bets_row["s"]) if bets_row and bets_row["s"] else 0.0

        wins_row = await db.fetchrow("SELECT SUM(amount) as s FROM economy_transactions WHERE type IN ('coinflip_win', 'slots_win', 'blackjack_payout', 'crash_payout', 'roulette_win', 'crate_win', 'mines_win')")
        total_wins = wins_row["s"] if wins_row and wins_row["s"] else 0.0

        net_casino_profit = total_bets - total_wins
        net_flow = total_deposit - total_withdraw

        embed = discord.Embed(
            title="📈 KolicGamble Kasa Muhasebe Raporu",
            description="Sunucu kasasının güncel finansal kâr/zarar durumu:",
            color=discord.Color.gold(),
            timestamp=datetime.utcnow()
        )
        embed.add_field(name="📥 Toplam Para Girişi (Deposit)", value=f"**{format_money_string(total_deposit)}** ({total_deposit:,.2f})", inline=True)
        embed.add_field(name="📤 Toplam Para Çıkışı (Withdraw)", value=f"**{format_money_string(total_withdraw)}** ({total_withdraw:,.2f})", inline=True)
        embed.add_field(name="💵 Net Kasa Nakit Akışı", value=f"**{format_money_string(net_flow)}**", inline=True)
        
        embed.add_field(name="🎲 Oynanan Toplam Bahis", value=f"**{format_money_string(total_bets)}**", inline=True)
        embed.add_field(name="🏆 Dağıtılan Toplam Kazanç", value=f"**{format_money_string(total_wins)}**", inline=True)
        
        profit_emoji = "👑" if net_casino_profit >= 0 else "📉"
        embed.add_field(
            name=f"{profit_emoji} Net Kasa Kârı (House Edge)",
            value=f"**{'+' if net_casino_profit >= 0 else ''}{format_money_string(net_casino_profit)}** ({net_casino_profit:,.2f})",
            inline=False
        )

        await interaction.followup.send(embed=embed, ephemeral=True)
        await log_admin_action(interaction.client, interaction.user, "/kasa_raporu", details="Kasa kâr/zarar raporu incelendi.")

    @app_commands.command(name="bakiye_ayarla", description="Bir kullanıcının bakiyesini manuel olarak günceller.")
    @app_commands.describe(kullanici="Bakiye güncellenecek kullanıcı", miktar="Yeni bakiye miktarı (örn: 100k, 50m, 1b)")
    @owner_only()
    async def adjust_balance(self, interaction: discord.Interaction, kullanici: discord.User, miktar: str):
        """Allows admins to set or modify user balance."""
        await interaction.response.defer(ephemeral=True)
        from utils.security import parse_money_string, format_money_string
        val_amount = parse_money_string(miktar)
        
        try:
            await db.register_user(kullanici.id)
            user_db = await db.get_user(kullanici.id)
            current_balance = user_db.get("balance", 0.0)
            
            diff = val_amount - current_balance
            new_balance = await db.update_balance(kullanici.id, diff, "admin_adjustment", f"Admin {interaction.user.name} tarafından ayarlandı.")
            
            await interaction.followup.send(
                f"✅ {kullanici.mention} kullanıcısının bakiyesi **{format_money_string(new_balance)}** ({new_balance:,.2f}) olarak güncellendi (Eski: {format_money_string(current_balance)}).",
                ephemeral=True
            )
            
            await log_admin_action(
                interaction.client,
                interaction.user,
                "/bakiye_ayarla",
                target=kullanici,
                details=f"**Eski Bakiye:** {format_money_string(current_balance)}\n**Yeni Bakiye:** {format_money_string(new_balance)}"
            )

        except Exception as e:
            logger.error(f"Error adjusting balance: {e}", exc_info=True)
            await interaction.followup.send("❌ Bakiye güncellenirken bir hata oluştu.", ephemeral=True)

    @app_commands.command(name="para_ver", description="Bir kullanıcıya direkt bakiye ekler.")
    @app_commands.describe(kullanici="Bakiye eklenecek kullanıcı", miktar="Eklenecek miktar (örn: 100k, 50m)")
    @owner_only()
    async def give_money(self, interaction: discord.Interaction, kullanici: discord.User, miktar: str):
        await interaction.response.defer(ephemeral=True)
        from utils.security import parse_money_string, format_money_string
        val_amount = parse_money_string(miktar)
        if val_amount <= 0:
            await interaction.followup.send("❌ Geçerli bir miktar girin.", ephemeral=True)
            return

        try:
            await db.register_user(kullanici.id)
            new_balance = await db.update_balance(kullanici.id, val_amount, "admin_give", f"Admin {interaction.user.name} para ekledi.")
            
            await interaction.followup.send(
                f"✅ {kullanici.mention} kullanıcısına **+{format_money_string(val_amount)}** bakiye eklendi. Güncel Bakiye: **{format_money_string(new_balance)}**",
                ephemeral=True
            )
            await log_admin_action(
                interaction.client,
                interaction.user,
                "/para_ver",
                target=kullanici,
                details=f"**Eklenen:** +{format_money_string(val_amount)} ({val_amount:,.2f})\n**Yeni Bakiye:** {format_money_string(new_balance)}"
            )
        except Exception as e:
            logger.error(f"Error giving money: {e}", exc_info=True)
            await interaction.followup.send("❌ Para eklenirken bir hata oluştu.", ephemeral=True)

    @app_commands.command(name="para_sil", description="Bir kullanıcıdan bakiye siler (Ceza/Düzeltme).")
    @app_commands.describe(kullanici="Bakiye silinecek kullanıcı", miktar="Silinecek miktar (örn: 50m, 1b)")
    @owner_only()
    async def remove_money(self, interaction: discord.Interaction, kullanici: discord.User, miktar: str):
        await interaction.response.defer(ephemeral=True)
        from utils.security import parse_money_string, format_money_string
        val_amount = parse_money_string(miktar)
        if val_amount <= 0:
            await interaction.followup.send("❌ Geçerli bir miktar girin.", ephemeral=True)
            return

        try:
            await db.register_user(kullanici.id)
            new_balance = await db.update_balance(kullanici.id, -val_amount, "admin_remove", f"Admin {interaction.user.name} para sildi.")
            
            await interaction.followup.send(
                f"✅ {kullanici.mention} kullanıcısından **-{format_money_string(val_amount)}** bakiye silindi. Kalan Bakiye: **{format_money_string(new_balance)}**",
                ephemeral=True
            )
            await log_admin_action(
                interaction.client,
                interaction.user,
                "/para_sil",
                target=kullanici,
                details=f"**Silinen:** -{format_money_string(val_amount)} ({val_amount:,.2f})\n**Kalan Bakiye:** {format_money_string(new_balance)}"
            )
        except Exception as e:
            logger.error(f"Error removing money: {e}", exc_info=True)
            await interaction.followup.send("❌ Para silinirken bir hata oluştu.", ephemeral=True)

    @app_commands.command(name="kumar_yasakla", description="Bir kullanıcının kumar oynamasını ve bakiye çekmesini yasaklar.")
    @app_commands.describe(kullanici="Yasaklanacak kullanıcı", sebep="Yasaklama gerekçesi")
    @owner_only()
    async def ban_gambling(self, interaction: discord.Interaction, kullanici: discord.User, sebep: str = "Hile / İstismar Şüphesi"):
        await interaction.response.defer(ephemeral=True)
        try:
            await db.register_user(kullanici.id)
            await db.ban_user(kullanici.id, True)
            
            await interaction.followup.send(
                f"🚫 {kullanici.mention} kullanıcısı **{sebep}** gerekçesiyle kumar ve ekonomi sisteminden yasaklandı.",
                ephemeral=True
            )
            
            await log_admin_action(
                interaction.client,
                interaction.user,
                "/kumar_yasakla",
                target=kullanici,
                details=f"**Gerekçe:** {sebep}\n**Durum:** Kullanıcı kara listeye alındı."
            )
        except Exception as e:
            logger.error(f"Error banning user: {e}", exc_info=True)
            await interaction.followup.send("❌ Yasaklama işlemi gerçekleştirilirken hata oluştu.", ephemeral=True)

    @app_commands.command(name="kumar_yasak_kaldir", description="Bir kullanıcının kumar ve bakiye yasağını kaldırır.")
    @app_commands.describe(kullanici="Yasağı kaldırılacak kullanıcı")
    @owner_only()
    async def unban_gambling(self, interaction: discord.Interaction, kullanici: discord.User):
        await interaction.response.defer(ephemeral=True)
        try:
            await db.register_user(kullanici.id)
            await db.ban_user(kullanici.id, False)
            
            await interaction.followup.send(
                f"✅ {kullanici.mention} kullanıcısının kumar ve bakiye yasağı kaldırıldı.",
                ephemeral=True
            )
            
            await log_admin_action(
                interaction.client,
                interaction.user,
                "/kumar_yasak_kaldir",
                target=kullanici,
                details="Kullanıcının kara liste yasağı başarıyla kaldırıldı."
            )
        except Exception as e:
            logger.error(f"Error unbanning user: {e}", exc_info=True)
            await interaction.followup.send("❌ Yasak kaldırma işlemi sırasında hata oluştu.", ephemeral=True)

    @app_commands.command(name="supheli_loglar", description="Sistem tarafından yakalanan son şüpheli aktivite loglarını listeler.")
    @owner_only()
    async def view_suspicious_logs(self, interaction: discord.Interaction):
        """Displays recent entries in suspicious_logs database table."""
        await interaction.response.defer(ephemeral=True)
        try:
            logs = await db.fetch("SELECT * FROM suspicious_logs ORDER BY id DESC LIMIT 10")
            if not logs:
                await interaction.followup.send("🟢 Sistemde kayıtlı şüpheli aktivite logu bulunmuyor.", ephemeral=True)
                return
            
            embed = discord.Embed(
                title="🚨 Şüpheli Aktivite Günlükleri (Son 10)",
                color=discord.Color.red(),
                timestamp=datetime.utcnow()
            )
            
            for log in logs:
                time_str = log["created_at"]
                if isinstance(time_str, datetime):
                    time_str = time_str.strftime("%Y-%m-%d %H:%M:%S")
                
                embed.add_field(
                    name=f"User: {log['username']} ({log['discord_id']})",
                    value=f"**Tip:** `{log['activity_type']}`\n**Detay:** {log['details']}\n**Tarih:** *{time_str}*",
                    inline=False
                )
                
            await interaction.followup.send(embed=embed, ephemeral=True)
        except Exception as e:
            logger.error(f"Error fetching suspicious logs: {e}", exc_info=True)
            await interaction.followup.send("❌ Loglar yüklenirken bir hata oluştu.", ephemeral=True)

    @app_commands.command(name="rolleri_duzenle", description="Üye listesini fotoğraftaki gibi ayrı ayrı kategorilere (hoisted) bölen rolleri kurar.")
    @owner_only()
    async def setup_hoisted_roles(self, interaction: discord.Interaction):
        """Creates or updates all hierarchical hoisted roles to separate members in the sidebar."""
        await interaction.response.defer(ephemeral=True)
        guild = interaction.guild

        role_specs = [
            ("🌐 KolicGamble Official", discord.Color.from_rgb(88, 101, 242), True), # En tepede (Botun rolü)
            ("👑 Kurucu", discord.Color.from_rgb(155, 89, 182), True),              # Kurucu / Sunucu Sahibi
            ("🛡️ Sorumlu", discord.Color.from_rgb(230, 126, 34), True),             # Sorumlu
            ("🌐 Network Founder", discord.Color.from_rgb(41, 128, 185), True),      # Network Founder
            ("⚔️ Baş Moderatör", discord.Color.from_rgb(26, 188, 156), True),       # Baş Moderatör
            ("👮 Gamble Yetkilisi", discord.Color.from_rgb(142, 68, 173), True),    # Gamble Yetkilisi
            ("🎧 Canlı Destek", discord.Color.from_rgb(241, 196, 15), True),        # Canlı Destek
            ("👑 Kumar Şahı", discord.Color.from_rgb(255, 215, 0), True),           # En Zengin Oyuncu
            ("💎 VIP", discord.Color.from_rgb(0, 210, 211), True),                  # VIP
            ("👥 Oyuncular", discord.Color.from_rgb(149, 165, 166), True)           # Oyuncular
        ]

        created_count = 0
        updated_count = 0

        # Create/update roles from bottom to top so top role has highest position
        for name, color, hoist in reversed(role_specs):
            role = discord.utils.get(guild.roles, name=name)
            if not role:
                try:
                    role = await guild.create_role(name=name, color=color, hoist=hoist, mentionable=True, reason="Hoisted Roles Kurulumu")
                    created_count += 1
                except Exception as e:
                    logger.error(f"Error creating role {name}: {e}")
            else:
                if not role.hoist or role.color != color:
                    try:
                        await role.edit(color=color, hoist=hoist)
                        updated_count += 1
                    except Exception as e:
                        logger.error(f"Error updating role {name}: {e}")

        # Automatically assign Kurucu to guild owner
        owner_role = discord.utils.get(guild.roles, name="👑 Kurucu")
        if owner_role and guild.owner:
            try:
                await guild.owner.add_roles(owner_role, reason="Kurucu rolü otomatik atandı")
            except Exception as e:
                logger.warning(f"Could not assign owner role: {e}")

        # Automatically assign Top Bot role to bot and other bots
        bot_role = discord.utils.get(guild.roles, name="🌐 KolicGamble Official")
        if bot_role and guild.me:
            try:
                await guild.me.add_roles(bot_role, reason="Bot rolü otomatik atandı")
                # Also give to other bots if any
                for member in guild.members:
                    if member.bot and bot_role not in member.roles:
                        await member.add_roles(bot_role, reason="Bot rolü otomatik atandı")
            except Exception as e:
                logger.warning(f"Could not assign bot role: {e}")

        embed = discord.Embed(
            title="✨ Üye Listesi Rolleri En Baştan Düzenlendi!",
            description=(
                f"Sağ paneldeki üye listesi en tepede **Bot** olacak şekilde ayarlandı:\n\n"
                f"1. 🌐 **KolicGamble Official** *(En Tepede • Botun Bölgesi)*\n"
                f"2. 👑 **Kurucu** *(Sunucu Sahibi)*\n"
                f"3. 🛡️ **Sorumlu**\n"
                f"4. 🌐 **Network Founder**\n"
                f"5. ⚔️ **Baş Moderatör**\n"
                f"6. 👮 **Gamble Yetkilisi**\n"
                f"7. 🎧 **Canlı Destek**\n"
                f"8. 👑 **Kumar Şahı** *(En Zengin)*\n"
                f"9. 💎 **VIP**\n"
                f"10. 👥 **Oyuncular**\n\n"
                f"*(Tüm roller `Ayrı Göster (Hoist)` olarak yapılandırıldı.)*"
            ),
            color=discord.Color.green(),
            timestamp=datetime.utcnow()
        )
        embed.set_footer(text="KolicGamble Rol Altyapısı")
        await interaction.followup.send(embed=embed, ephemeral=True)

    @app_commands.command(name="kurallari_gonder", description="Sunucu kurallarını şık bir embed olarak kurallar kanalına gönderir.")
    @owner_only()
    async def post_rules(self, interaction: discord.Interaction):
        """Sends the formatted official server rules embed to the rules channel."""
        guild = interaction.guild
        target_channel = discord.utils.get(guild.text_channels, name="📖・kurallar") or interaction.channel

        embed1 = discord.Embed(
            title="📜 KOLİC GAMBLE — RESMİ SUNUCU KURALLARI",
            description=(
                "**KolicGamble topluluğuna hoş geldiniz!**\n"
                "Sunucumuzda adil, saygılı, güvenli ve keyifli bir ortam sağlamak için aşağıda belirtilen kurallara her üyenin uyması zorunludur.\n\n"
                "━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
            ),
            color=discord.Color.gold(),
            timestamp=datetime.utcnow()
        )

        embed1.add_field(
            name="1️⃣ Genel Topluluk & Ahlak Kuralları",
            value=(
                "• **Saygı & Hoşgörü:** Üyelere, yetkililere veya bot asistanına yönelik hakaret, aşağılama, ırkçılık, cinsiyetçilik ve argo kesinlikle yasaktır.\n"
                "• **Reklam & Dolandırıcılık:** Sunucu içi veya DM üzerinden başka sunucu, site veya hizmet reklamı yapmak anında **Kalıcı Yasaklanma (Perma Ban)** sebebidir.\n"
                "• **Dini & Siyasi İçerik:** Dini, milli ve siyasi tartışmalar sunucu genelinde tamamen yasaktır.\n"
                "• **Spam & Caps:** Kanallarda art arda mesaj göndermek, harf uzatmak ve gereksiz etiket atmak yasaktır."
            ),
            inline=False
        )

        embed1.add_field(
            name="2️⃣ Kumar, Bahis & Ekonomi Kuralları",
            value=(
                "• **Açık & Bug İstismarı:** Bot veya oyun içi herhangi bir yazılımsal hatayı/açığı kendi lehine kullananların tüm bakiyesi sıfırlanır ve sistemden süresiz yasaklanır.\n"
                "• **Çoklu Hesap (Multi-Account / Alt):** Tek bir kişinin farklı Discord hesaplarıyla aynı Minecraft hesabını bağlaması veya çoklu hesapla ödül toplaması yasaktır.\n"
                "• **Para Yatırma:** Minecraft sunucusunda bota para gönderirken tam komut: `/pay KolicGambleBot <Miktar>` olmalıdır.\n"
                "• **Para Çekme Limitleri:** 500M altındaki çekimler **otomatik ve anında** oyun içi hesabınıza geçer. 500M ve üzeri çekimler güvenlik sebebiyle yetkili onayından sonra aktarılır."
            ),
            inline=False
        )

        embed1.add_field(
            name="3️⃣ Canlı Destek & İletişim Kuralları",
            value=(
                "• **Saygılı Üslup:** Destek odasında yetkililere veya AI asistanına küfür/hakaret eden kullanıcılar sistem tarafından otomatik **10 dakika susturulur (Timeout)**.\n"
                "• **Gereksiz Talep Açma:** Eğlence amaçlı veya sahte şikayetlerle açılan boş biletler kapatılır, devamında bilet açma yetkisi alınır.\n"
                "• **Otomatik Temizlik:** 24 saat boyunca yanıt verilmeyen inaktif destek odaları bot tarafından otomatik olarak kapatılır."
            ),
            inline=False
        )

        embed1.add_field(
            name="4️⃣ Yaptırımlar & Sorumluluk Reddi",
            value=(
                "• Sunucuya katılan ve bakiye yükleyen her oyuncu bu kuralları **peşinen okumuş ve kabul etmiş** sayılır.\n"
                "• Sunucu yönetimi, hile ve dolandırıcılık şüphesinde kullanıcı hesaplarını inceleme ve dondurma hakkını saklı tutar.\n"
                "• Kural ihlallerinde uygulanacak yaptırımlar: `Uyarı` ➔ `Timeout` ➔ `Bakiye Sıfırlama` ➔ `Kalıcı Ban`."
            ),
            inline=False
        )

        embed1.set_footer(text="KolicGamble Güvenlik & Yönetim • Keyifli Oyunlar Dileriz!")

        await target_channel.send(embed=embed1)
        if target_channel != interaction.channel:
            await interaction.response.send_message(f"✅ Kurallar başarıyla {target_channel.mention} kanalına gönderildi!", ephemeral=True)
        else:
            await interaction.response.send_message("✅ Kurallar başarıyla bu kanala gönderildi!", ephemeral=True)

    @app_commands.command(name="sunucu_kur", description="KolicGamble için profesyonel bir Discord sunucusu altyapısı kurar.")
    @owner_only()
    async def setup_server(self, interaction: discord.Interaction):
        """Creates roles, categories, and channels for a complete server setup, and writes IDs to config/env."""
        await interaction.response.defer(ephemeral=True)
        guild = interaction.guild

        try:
            # 1. Create Roles with Hoist
            role_definitions = [
                ("👑 Kurucu", discord.Color.from_rgb(155, 89, 182), True),
                ("🛡️ Sorumlu", discord.Color.from_rgb(230, 126, 34), True),
                ("🌐 Network Founder", discord.Color.from_rgb(41, 128, 185), True),
                ("⚔️ Baş Moderatör", discord.Color.from_rgb(26, 188, 156), True),
                ("👮 Yetkili", discord.Color.from_rgb(52, 152, 219), True),
                ("Gamble Yetkilisi", discord.Color.from_rgb(142, 68, 173), True),
                ("🎧 Canlı Destek", discord.Color.from_rgb(241, 196, 15), True),
                ("👑 Kumar Şahı", discord.Color.from_rgb(255, 215, 0), True),
                ("💎 VIP", discord.Color.from_rgb(0, 210, 211), True),
                ("🤖 Botlar & Sistem", discord.Color.from_rgb(88, 101, 242), True),
                ("👥 Oyuncular", discord.Color.from_rgb(149, 165, 166), True)
            ]
            created_roles = {}
            for name, color, hoist in role_definitions:
                role = discord.utils.get(guild.roles, name=name)
                if not role:
                    role = await guild.create_role(name=name, color=color, hoist=hoist, mentionable=True, reason="GambleBot sunucu kurulumu")
                else:
                    if not role.hoist or role.color != color:
                        await role.edit(color=color, hoist=hoist)
                created_roles[name] = role

            gamble_role = created_roles["Gamble Yetkilisi"]
            vip_role = created_roles["💎 VIP"]
            yetkili_role = created_roles["👮 Yetkili"]

            # Helper for category creation
            async def get_or_create_category(name, overwrites=None):
                if overwrites is None:
                    overwrites = {}
                cat = discord.utils.get(guild.categories, name=name)
                if not cat:
                    cat = await guild.create_category(name=name, overwrites=overwrites, reason="GambleBot sunucu kurulumu")
                elif overwrites:
                    for target, perm in overwrites.items():
                        await cat.set_permissions(target, overwrite=perm)
                return cat

            # Helper for channel creation
            async def get_or_create_channel(name, category, topic="", overwrites=None):
                if overwrites is None:
                    overwrites = {}
                ch = discord.utils.get(category.text_channels, name=name)
                if not ch:
                    ch = await guild.create_text_channel(
                        name=name,
                        category=category,
                        topic=topic,
                        overwrites=overwrites,
                        reason="GambleBot sunucu kurulumu"
                    )
                elif overwrites:
                    for target, perm in overwrites.items():
                        await ch.set_permissions(target, overwrite=perm)
                return ch

            # --- 1. Category: BİLGİLENDİRME ---
            cat_info = await get_or_create_category("📌 BİLGİLENDİRME")
            ro_overwrites = {
                guild.default_role: discord.PermissionOverwrite(view_channel=True, send_messages=False, send_messages_in_threads=False, add_reactions=False),
                guild.me: discord.PermissionOverwrite(view_channel=True, send_messages=True, embed_links=True, manage_messages=True)
            }
            if "👥 Oyuncular" in created_roles:
                ro_overwrites[created_roles["👥 Oyuncular"]] = discord.PermissionOverwrite(view_channel=True, send_messages=False, send_messages_in_threads=False, add_reactions=False)

            ch_status = await get_or_create_channel("🔴・bot-durumu", cat_info, "Minecraft botu canlı bağlantı ve aktiflik durumu", ro_overwrites)
            await get_or_create_channel("📢・duyurular", cat_info, "Sunucu ve bot duyuruları", ro_overwrites)
            await get_or_create_channel("📖・kurallar", cat_info, "Sunucu kuralları", ro_overwrites)
            await get_or_create_channel("🎁・etkinlikler", cat_info, "Çekilişler ve ödüllü etkinlikler", ro_overwrites)
            await get_or_create_channel("👑・vip-bilgi", cat_info, "VIP üyelik avantajları ve satın alma rehberi", ro_overwrites)

            # --- 2. Category: KOLIC GAMBLE KUMAR ---
            cat_gamble = await get_or_create_category("🏆 KOLIC GAMBLE KUMAR")
            ch_bakiye = await get_or_create_channel("📥・bakiye-islemleri", cat_gamble, "Eşleştirme, Cüzdan ve Bakiye yükleme/çekme işlemleri", ro_overwrites)
            ch_kumar = await get_or_create_channel("💬・kumar-oyunlari", cat_gamble, "Bahis oyunlarının oynandığı yer", ro_overwrites)
            ch_destek = await get_or_create_channel("🎫・destek-talebi", cat_gamble, "7/24 Yapay Zeka Canlı Destek & İletişim", ro_overwrites)
            await get_or_create_channel("📊・liderlik-tablosu", cat_gamble, "En zengin oyuncular listesi", ro_overwrites)
            
            # VIP Sohbet (Private to VIP and staff)
            vip_overwrites = {
                guild.default_role: discord.PermissionOverwrite(view_channel=False),
                vip_role: discord.PermissionOverwrite(view_channel=True, send_messages=True),
                gamble_role: discord.PermissionOverwrite(view_channel=True, send_messages=True),
                guild.me: discord.PermissionOverwrite(view_channel=True, send_messages=True)
            }
            await get_or_create_channel("💎・vip-sohbet", cat_gamble, "VIP Üyelerin özel bahis ve sohbet odası", vip_overwrites)

            # --- 3. Category: GENEL ALAN ---
            cat_general = await get_or_create_category("💬 GENEL ALAN")
            await get_or_create_channel("👋・hos-geldiniz", cat_general, "Aramıza yeni katılan üyeler", ro_overwrites)
            await get_or_create_channel("💬・genel-sohbet", cat_general, "Sunucu sohbet alanı")
            await get_or_create_channel("📷・gorsel-paylasim", cat_general, "Oyun içi görseller ve medya")
            await get_or_create_channel("🤖・bot-komut", cat_general, "Eğlence ve bot komut odası")

            # --- 4. Category: KOLIC GAMBLE YÖNETİM (Private) ---
            # Protected staff permissions: staff can view and send, but CANNOT delete messages (manage_messages=False)
            staff_overwrites = {
                guild.default_role: discord.PermissionOverwrite(view_channel=False),
                gamble_role: discord.PermissionOverwrite(view_channel=True, send_messages=True, manage_messages=False),
                yetkili_role: discord.PermissionOverwrite(view_channel=True, send_messages=True, manage_messages=False),
                guild.me: discord.PermissionOverwrite(view_channel=True, send_messages=True, manage_messages=True)
            }
            cat_staff = await get_or_create_category("🛡️ KOLIC GAMBLE YÖNETİM", staff_overwrites)
            
            # Kurucu-paneli specific overwrite for Guild Owner only
            owner_overwrites = staff_overwrites.copy()
            if guild.owner:
                owner_overwrites[guild.owner] = discord.PermissionOverwrite(view_channel=True, send_messages=True)
            
            ch_admin_panel = await get_or_create_channel("🎛️・kurucu-paneli", cat_staff, "Sadece Sunucu Sahibine Özel Panel", owner_overwrites)
            ch_onay = await get_or_create_channel("⌛・para-cekme-onay", cat_staff, "Para çekme onay odası", staff_overwrites)
            ch_logs = await get_or_create_channel("📜・islem-loglari", cat_staff, "Bakiye yükleme, çekme ve şüpheli işlem logları", staff_overwrites)
            await get_or_create_channel("🚨・supheli-islemler", cat_staff, "Anti-Cheat ve güvenlik uyarı logları", staff_overwrites)
            await get_or_create_channel("💬・yetkili-sohbet", cat_staff, "Yetkili ekibi sohbet alanı", staff_overwrites)

            # 5. Update configuration values in memory and write to .env
            import os
            def update_env_variable(key: str, value: str):
                import config
                # Update in memory
                setattr(config, key, int(value))
                
                # Write to .env
                env_path = ".env"
                lines = []
                found = False
                if os.path.exists(env_path):
                    with open(env_path, "r", encoding="utf-8") as f:
                        lines = f.readlines()
                
                for idx, line in enumerate(lines):
                    if line.strip().startswith(f"{key}="):
                        lines[idx] = f"{key}={value}\n"
                        found = True
                        break
                if not found:
                    lines.append(f"{key}={value}\n")
                with open(env_path, "w", encoding="utf-8") as f:
                    f.writelines(lines)

            update_env_variable("ADMIN_APPROVAL_CHANNEL_ID", str(ch_onay.id))
            update_env_variable("ADMIN_LOG_CHANNEL_ID", str(ch_logs.id))
            update_env_variable("PUBLIC_LOG_CHANNEL_ID", str(ch_bakiye.id))
            update_env_variable("BOT_STATUS_CHANNEL_ID", str(ch_status.id))

            # Trigger initial status update
            try:
                from web_server import update_bot_status_display, minecraft_ws
                await update_bot_status_display(
                    interaction.client,
                    is_online=(minecraft_ws is not None and not minecraft_ws.closed),
                    username="KolicGambleBot",
                    server_ip="kolichub.net"
                )
            except Exception as e:
                logger.warning(f"Failed to post initial bot status: {e}")

            # 6. Automatically send setup panel if not already present
            panel_embed = discord.Embed(
                title="🎮 KolicGamble Cüzdan & Ekonomi Paneli",
                description=(
                    "Cüzdanınızı yönetmek, hesap eşleştirmek ve bakiye işlemleri yapmak için aşağıdaki butonları kullanın.\n\n"
                    "**📥 Para Yatırma (Deposit):**\n"
                    "1. Aşağıdaki **🔗 Hesap Eşleştir** butonu ile Minecraft oyun içi kullanıcı adınızı bağlayın.\n"
                    "2. Oyunda bota para gönderin: `/pay KolicGambleBot [Miktar]`. Bakiyeniz saniyeler içinde otomatik yüklenecektir!\n\n"
                    "**📤 Para Çekme (Withdraw):**\n"
                    "Butona tıklayarak bakiyenizi oyun içi hesabınıza anında çekin."
                ),
                color=discord.Color.gold(),
                timestamp=datetime.utcnow()
            )
            panel_embed.set_footer(text="Güvenli İşlem Altyapısı • KolicGambleBot")
            
            # Prevent double posting of panel on repeated runs
            has_panel = False
            async for msg in ch_bakiye.history(limit=50):
                if msg.author == guild.me and msg.embeds and msg.embeds[0].title == "🎮 KolicGamble Cüzdan & Ekonomi Paneli":
                    has_panel = True
                    break
            
            if not has_panel:
                await ch_bakiye.send(embed=panel_embed, view=EconomyPanelView())

            # 6b. Automatically send gamble lobby panel to kumar-oyunlari
            lobby_embed = discord.Embed(
                title="🎰 KolicGamble Oyun Lobisi",
                description=(
                    "Aşağıdaki butonlara tıklayarak oynamak istediğiniz oyunu seçin ve bahsinizi girin!\n\n"
                    "🪙 **Coinflip (Yazı-Tura):** %50 şansla paranızı katlayın.\n"
                    "🎰 **Slots (Slot Makinesi):** Makaraları çevirip büyük ödülü yakalayın.\n"
                    "🃏 **Blackjack (21):** Klasik 21 oynayıp kasayı yenin.\n"
                    "📈 **Crash (Aviator):** Uçak patlamadan önce paranızı çekin.\n"
                    "🎡 **Rulet (Roulette):** Renk veya sayı seçerek şansınızı deneyin.\n"
                    "📦 **Kasa Aç (Crate):** Özel kasaları rulet şeklinde açın.\n"
                    "💣 **Mayın Tarlası (Mines):** 16 karede elmasları toplayıp istediğin an paranı çek!"
                ),
                color=discord.Color.dark_purple(),
                timestamp=datetime.utcnow()
            )
            lobby_embed.set_footer(text="İyi Şanslar • KolicGambleBot")

            from cogs.games import GambleLobbyView
            has_lobby = False
            async for msg in ch_kumar.history(limit=50):
                if msg.author == guild.me and msg.embeds and msg.embeds[0].title == "🎰 KolicGamble Oyun Lobisi":
                    has_lobby = True
                    break
            
            if not has_lobby:
                await ch_kumar.send(embed=lobby_embed, view=GambleLobbyView())

            # 6c. Send Admin Dashboard View to yetkili-paneli
            admin_dash_embed = discord.Embed(
                title="🎛️ KolicGamble Yetkili Kontrol Paneli",
                description=(
                    "Yönetim işlemlerini gerçekleştirmek için aşağıdaki butonları kullanabilirsiniz.\n\n"
                    "🛑 **Kumarı Dondur / Aç:** Sunucudaki tüm kumar oyunlarını bakım veya acil durumda tek tıkla durdurur.\n"
                    "📊 **Canlı İstatistikler:** Kayıtlı oyuncu ve dolaşımdaki para miktarını gösterir.\n"
                    "📈 **Kasa Kâr/Zarar Raporu:** Sunucu kasasının net muhasebe kârını hesaplar.\n"
                    "🚨 **Şüpheli İşlemler:** Son yakalanan güvenlik uyarılarını listeler."
                ),
                color=discord.Color.blue(),
                timestamp=datetime.utcnow()
            )
            admin_dash_embed.set_footer(text="Yönetici Paneli • KolicGambleBot")

            has_admin_dash = False
            async for msg in ch_admin_panel.history(limit=50):
                if msg.author == guild.me and msg.embeds and msg.embeds[0].title == "🎛️ KolicGamble Yetkili Kontrol Paneli":
                    has_admin_dash = True
                    break
            if not has_admin_dash:
                await ch_admin_panel.send(embed=admin_dash_embed, view=AdminDashboardView())

            # 6d. Automatically send Ticket Panel to destek-talebi
            ticket_dash_embed = discord.Embed(
                title="🎫 KolicGamble Canlı Destek & İletişim",
                description=(
                    "Bakiye yükleme/çekme sorunları, hesap eşleştirme veya aklınıza takılan her türlü soru için canlı destek talebi açabilirsiniz.\n\n"
                    "🤖 **7/24 Yapay Zeka Desteği:**\n"
                    "Talebiniz açıldığı an yapay zeka asistanımız sorunuzu anında analiz eder ve çözüme kavuşturur.\n\n"
                    "👨‍💼 **Yetkili Ekibi:**\n"
                    "Gerekli durumlarda tek tıkla canlı insan yetkili çağırabilirsiniz.\n\n"
                    "👇 *Aşağıdaki butona basarak hemen bir destek odası oluşturun!*"
                ),
                color=discord.Color.green(),
                timestamp=datetime.utcnow()
            )
            ticket_dash_embed.set_footer(text="Güvenli Destek Altyapısı • KolicGamble")

            from cogs.tickets import TicketCreateView
            has_ticket_panel = False
            async for msg in ch_destek.history(limit=50):
                if msg.author == guild.me and msg.embeds and msg.embeds[0].title == "🎫 KolicGamble Canlı Destek & İletişim":
                    has_ticket_panel = True
                    break
            if not has_ticket_panel:
                await ch_destek.send(embed=ticket_dash_embed, view=TicketCreateView())

            # 7. Respond to the admin user
            result_embed = discord.Embed(
                title="👑 Profesyonel Sunucu Kurulumu Tamamlandı!",
                description=(
                    f"KolicGamble ekonomi, admin dashboard ve denetim altyapısı başarıyla kuruldu.\n\n"
                    f"**Oluşturulan Yapı:**\n"
                    f"• **Roller**: Kurucu, Yönetici, Yetkili, Gamble Yetkilisi, VIP, Üye.\n"
                    f"• **Kategoriler**: `📌 BİLGİLENDİRME`, `🏆 KOLIC GAMBLE KUMAR`, `💬 GENEL ALAN`, `🛡️ KOLIC GAMBLE YÖNETİM`.\n"
                    f"• **Yetkili Paneli**: <#{ch_admin_panel.id}>\n"
                    f"• **Cüzdan Paneli**: <#{ch_bakiye.id}>\n"
                    f"• **Oyun Lobisi**: <#{ch_kumar.id}>\n\n"
                    f"🛡️ **Güvenlik Korumaları:**\n"
                    f"• Yetkili log kanallarında mesaj silme kısıtlandı.\n"
                    f"• Otomatik Silinen Log Kurtarma (Anti-Delete Guard) aktif edildi.\n"
                    f"• Tüm yönetici eylemleri <#{ch_logs.id}> kanalına anlık olarak kaydedilir."
                ),
                color=discord.Color.green(),
                timestamp=datetime.utcnow()
            )
            await interaction.followup.send(embed=result_embed, ephemeral=True)

        except Exception as e:
            logger.error(f"Error during auto setup server: {e}", exc_info=True)
            await interaction.followup.send(f"❌ Sunucu kurulurken hata oluştu: `{e}`", ephemeral=True)

    @app_commands.command(name="kanallari_kilitle", description="Tüm resmi ve kumar kanallarını üyelere mesaj yazmaya kilitler (Sadece okuma ve buton tıklama).")
    @owner_only()
    async def lock_all_channels(self, interaction: discord.Interaction):
        """Locks all official announcement, economy, and casino channels so members cannot chat, only interact."""
        await interaction.response.defer(ephemeral=True)
        guild = interaction.guild

        # Target channel names / patterns to lock
        target_names = [
            "bakiye-islemleri",
            "kumar-oyunlari",
            "destek-talebi",
            "liderlik-tablosu",
            "vip-bilgi",
            "bot-durumu",
            "duyurular",
            "kurallar",
            "etkinlikler",
            "hos-geldiniz"
        ]

        player_role = discord.utils.get(guild.roles, name="👥 Oyuncular") or \
                      discord.utils.get(guild.roles, name="Oyuncular") or \
                      discord.utils.get(guild.roles, name="Üye")

        locked_count = 0
        locked_list = []

        for ch in guild.text_channels:
            # Check if channel matches target list
            is_target = any(t in ch.name.lower() for t in target_names)
            if is_target:
                try:
                    # 1. Lock for @everyone
                    overwrite_everyone = ch.overwrites_for(guild.default_role)
                    overwrite_everyone.view_channel = True
                    overwrite_everyone.send_messages = False
                    overwrite_everyone.send_messages_in_threads = False
                    overwrite_everyone.add_reactions = False
                    await ch.set_permissions(guild.default_role, overwrite=overwrite_everyone)

                    # 2. Lock for Oyuncular (Members)
                    if player_role:
                        overwrite_player = ch.overwrites_for(player_role)
                        overwrite_player.view_channel = True
                        overwrite_player.send_messages = False
                        overwrite_player.send_messages_in_threads = False
                        overwrite_player.add_reactions = False
                        await ch.set_permissions(player_role, overwrite=overwrite_player)

                    # 3. Ensure Bot has full permission
                    overwrite_me = ch.overwrites_for(guild.me)
                    overwrite_me.view_channel = True
                    overwrite_me.send_messages = True
                    overwrite_me.embed_links = True
                    overwrite_me.manage_messages = True
                    await ch.set_permissions(guild.me, overwrite=overwrite_me)

                    locked_count += 1
                    locked_list.append(ch.mention)
                except Exception as e:
                    logger.warning(f"Failed to lock channel {ch.name}: {e}")

        embed = discord.Embed(
            title="🔒 Kanallar Başarıyla Kilitlendi!",
            description=(
                f"Aşağıdaki **{locked_count}** adet resmi ve kumar kanalında üyelerin mesaj yazması engellendi.\n\n"
                f"✅ **Durum:** Üyeler sadece kanalları görebilir ve **butonlara tıklayabilir**. Mesaj gönderemezler!\n\n"
                f"📋 **Kilitlenen Kanallar:**\n" + ("\n".join(f"• {c}" for c in locked_list) if locked_list else "*Kanal bulunamadı*")
            ),
            color=discord.Color.green(),
            timestamp=datetime.utcnow()
        )
        await interaction.followup.send(embed=embed, ephemeral=True)

    @app_commands.command(name="sunucu_sil", description="Sunucudaki tüm kanalları ve kategorileri tamamen siler.")
    @app_commands.checks.has_permissions(administrator=True)
    async def delete_all_channels(self, interaction: discord.Interaction):
        """Deletes all channels and categories in the guild."""
        await interaction.response.defer(ephemeral=True)
        guild = interaction.guild

        try:
            # Delete all channels
            deleted_count = 0
            for channel in list(guild.channels):
                try:
                    await channel.delete(reason="Admin isteği üzerine sunucu temizliği")
                    deleted_count += 1
                except Exception as channel_err:
                    logger.warning(f"Failed to delete channel {channel.name}: {channel_err}")
            
            # Since all channels are deleted, create a single temporary text channel first, then respond there
            try:
                temp_channel = await guild.create_text_channel(name="bilgilendirme", reason="Sunucu temizliği sonrası otomatik kanal")
                await temp_channel.send(f"✅ **Sunucu Başarıyla Temizlendi!**\nSunucudaki tüm kategori ve kanallar tamamen silindi (Toplam {deleted_count} adet).")
            except Exception as create_err:
                logger.error(f"Failed to create temp channel after deletion: {create_err}")

        except Exception as e:
            logger.error(f"Error during channel deletion: {e}", exc_info=True)
            try:
                await interaction.followup.send("❌ Temizlik sırasında bir hata oluştu.", ephemeral=True)
            except Exception:
                pass

    # Error handler for checks (e.g. Missing Permissions)
    @setup_panel.error
    @casino_profit_report.error
    @adjust_balance.error
    @give_money.error
    @remove_money.error
    @ban_gambling.error
    @unban_gambling.error
    @view_suspicious_logs.error
    @setup_server.error
    @lock_all_channels.error
    @delete_all_channels.error
    async def admin_commands_error(self, interaction: discord.Interaction, error: app_commands.AppCommandError):
        if isinstance(error, app_commands.errors.MissingPermissions):
            await interaction.response.send_message(
                "❌ **Yetki Hatası:** Bu komutu kullanmak için `Yönetici (Administrator)` yetkisine sahip olmalısınız.",
                ephemeral=True
            )
        else:
            logger.error(f"Admin command error: {error}", exc_info=True)
            if not interaction.response.is_done():
                await interaction.response.send_message(
                    "❌ Komut çalıştırılırken bir yetkilendirme veya sistem hatası oluştu.",
                    ephemeral=True
                )

    @commands.Cog.listener()
    async def on_member_join(self, member: discord.Member):
        """Automatically assigns the Oyuncular (Member) role to new joins, or the Bot role to bots."""
        guild = member.guild
        try:
            if member.bot:
                # Assign Bot Role to newly added bots
                bot_role = discord.utils.get(guild.roles, name="🌐 KolicGamble Official")
                if bot_role and bot_role not in member.roles:
                    await member.add_roles(bot_role, reason="Yeni bot katıldı - Otomatik bot rolü verildi.")
            else:
                # Assign Player / Member Role
                player_role = discord.utils.get(guild.roles, name="👥 Oyuncular") or \
                              discord.utils.get(guild.roles, name="Oyuncular") or \
                              discord.utils.get(guild.roles, name="Üye") or \
                              discord.utils.get(guild.roles, name="Oyuncu")
                
                if not player_role:
                    # Create Oyuncular role if it doesn't exist
                    player_role = await guild.create_role(
                        name="👥 Oyuncular",
                        color=discord.Color.from_rgb(149, 165, 166),
                        hoist=True,
                        reason="Otomatik Oyuncu rolü oluşturuldu."
                    )
                
                if player_role not in member.roles:
                    await member.add_roles(player_role, reason="Sunucuya yeni üye katıldı - Otomatik üye rolü verildi.")
                    logger.info(f"Assigned '{player_role.name}' role to new member {member.name} ({member.id})")

                # Auto register user profile in DB so they are ready
                await db.register_user(member.id)

                # Send friendly welcome embed to 👋・hos-geldiniz if channel exists
                welcome_channel = discord.utils.get(guild.text_channels, name="👋・hos-geldiniz") or \
                                  discord.utils.get(guild.text_channels, name="hos-geldiniz") or \
                                  discord.utils.get(guild.text_channels, name="hoş-geldiniz") or \
                                  discord.utils.get(guild.text_channels, name="hosgeldiniz") or \
                                  discord.utils.get(guild.text_channels, name="💬・genel-sohbet")

                ch_bakiye = discord.utils.get(guild.text_channels, name="📥・bakiye-islemleri")
                ch_kumar = discord.utils.get(guild.text_channels, name="💬・kumar-oyunlari")
                ch_etkinlik = discord.utils.get(guild.text_channels, name="🎁・etkinlikler")
                
                bakiye_ref = ch_bakiye.mention if ch_bakiye else "`#bakiye-islemleri`"
                kumar_ref = ch_kumar.mention if ch_kumar else "`#kumar-oyunlari`"
                etkinlik_ref = ch_etkinlik.mention if ch_etkinlik else "`#etkinlikler`"

                if welcome_channel:
                    welcome_embed = discord.Embed(
                        title="👋 Sunucuya Hoş Geldin!",
                        description=(
                            f"🎉 {member.mention} aramıza katıldı ve **`{player_role.name}`** rolü otomatik verildi!\n\n"
                            f"💰 **Hızlı Başlangıç:**\n"
                            f"• {bakiye_ref} kanalından **🔗 Hesap Eşleştir** ile Minecraft adını bağlayabilirsin.\n"
                            f"• {kumar_ref} kanalından eğlenceli oyunlara katılabilirsin.\n"
                            f"• {etkinlik_ref} kanalından büyük çekiliş ve para yağmurlarına katılabilirsin!"
                        ),
                        color=discord.Color.green(),
                        timestamp=datetime.utcnow()
                    )
                    welcome_embed.set_thumbnail(url=member.display_avatar.url)
                    welcome_embed.set_footer(text=f"Üye #{guild.member_count} • KolicGamble")
                    await welcome_channel.send(content=f"Hoş geldin {member.mention}! 🎁", embed=welcome_embed)

        except Exception as e:
            logger.warning(f"Error in on_member_join for {member.name}: {e}")

async def setup(bot):
    await bot.add_cog(AdminCog(bot))
