import discord
from discord.ext import commands
import logging
import sqlite3

# Set up custom logging with date/time and error tags
logging.basicConfig(
    format="%(asctime)s %(levelname)-8s r6.bot %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S",
    level=logging.INFO
)

# Create intents
intents = discord.Intents.default()
intents.message_content = True  # Enable message content intent
intents.members = True 

# Initialize the bot with application_id
bot = commands.Bot(command_prefix='!', intents=intents, application_id='1341898739349983272')

# Database connection
def db_connect():
    conn = sqlite3.connect('r6bot.db', timeout=10, check_same_thread=False)
    cursor = conn.cursor()
    cursor.execute("PRAGMA journal_mode=WAL;")  # WAL mode for concurrent writes
    cursor.execute("PRAGMA synchronous=NORMAL;")  # Prevent excessive disk writes
    conn.commit()
    return conn

# Function to add/update user data in the database
def update_user(user_id, username, win=False, lose=False, nickname=None):
    conn = None
    try:
        conn = db_connect()
        cursor = conn.cursor()

        # Check if user exists
        cursor.execute("SELECT * FROM r6bot WHERE user_id = ?", (user_id,))
        user = cursor.fetchone()

        if user:
            wins, losses, current_username, current_nickname = user[2], user[3], user[1], user[4]
            if win:
                wins += 1
            if lose:
                losses += 1

            # Only update the nickname if it's provided
            if nickname is not None:
                current_nickname = nickname  # Update only nickname

            cursor.execute("""
                UPDATE r6bot 
                SET wins = ?, losses = ?, username = ?, nickname = ? 
                WHERE user_id = ?
            """, (wins, losses, current_username, current_nickname, user_id))
        else:
            # Insert new user if they don't exist in the database
            cursor.execute("""
                INSERT INTO r6bot (user_id, username, wins, losses, nickname) 
                VALUES (?, ?, ?, ?, ?)
            """, (user_id, username, 1 if win else 0, 1 if lose else 0, username))  # Set username as default nickname initially

        conn.commit()  # Ensure changes are saved

        # Ensure logging outputs the correct data types for win and lose
        logging.info(f"Updated DB for {username} (win={str(win)}, lose={str(lose)}, nickname={str(nickname)})")

    except sqlite3.DatabaseError as e:
        logging.error(f"Database error: {e}")
    except Exception as e:
        logging.error(f"Unexpected error: {e}")
    finally:
        if conn:
            conn.close()  # Always close the connection

# Register a slash command for /hello
@bot.tree.command(name="hello")
async def hello(interaction: discord.Interaction):
    logging.info("Received /hello command")
    await interaction.response.send_message("Hello, world!")
    logging.info("Sent hello message")

# /win Command with defined members
@bot.tree.command(name="win", description="Increase wins for mentioned users")
async def win(interaction: discord.Interaction, member1: discord.Member, member2: discord.Member = None, member3: discord.Member = None, member4: discord.Member = None, member5: discord.Member = None):
    if not any(role.id == 1341841178886410292 for role in interaction.user.roles):
        await interaction.response.send_message("You do not have permission to use this command.", ephemeral=True)
        logging.info("Unauthorized user tried a command")
        return

    members = [m for m in [member1, member2, member3, member4, member5] if m]  # Remove None values
    if not members:
        await interaction.response.send_message("No valid members found.", ephemeral=True)
        logging.info("No valid members found for win command.")
        return

    updated_members = []
    for member in members:
        update_user(member.id, member.name, win=True)  # No nickname passed, only updating wins
        updated_members.append(member.name)

    await interaction.response.send_message(f"Updated wins for {', '.join(updated_members)}.")
    logging.info(f"Updated wins for {', '.join(updated_members)}")

# /lose Command
@bot.tree.command(name="lose", description="Increase losses for mentioned users")
async def lose(interaction: discord.Interaction, member1: discord.Member, member2: discord.Member = None, member3: discord.Member = None, member4: discord.Member = None, member5: discord.Member = None):
    if not any(role.id == 1341841178886410292 for role in interaction.user.roles):
        await interaction.response.send_message("You do not have permission to use this command.", ephemeral=True)
        logging.info("Unauthorized user tried a command")
        return

    members = [m for m in [member1, member2, member3, member4, member5] if m]  # Remove None values
    if not members:
        await interaction.response.send_message("No valid members found.", ephemeral=True)
        logging.info("No valid members found for lose command.")
        return

    updated_members = []
    for member in members:
        update_user(member.id, member.name, lose=True)  # No nickname passed, only updating losses
        updated_members.append(member.name)

    await interaction.response.send_message(f"Updated losses for {', '.join(updated_members)}.")
    logging.info(f"Updated losses for {', '.join(updated_members)}")

# /nickname Command
@bot.tree.command(name="nickname")
async def nickname(interaction: discord.Interaction, new_username: str = None):
    if new_username is None:
        await interaction.response.send_message(f"Please provide a new nickname.")
        logging.info("No username was provided")
    elif new_username == "":
        await interaction.response.send_message(f"Nicknames cannot be blank!")
        logging.info("Empty username was entered")
    else:
        update_user(interaction.user.id, interaction.user.name, nickname=new_username)  # Update nickname only
        await interaction.response.send_message(f"Your nickname has been updated to {new_username}.")
        logging.info("Updated a Nickname")

# Print when the bot is ready
@bot.event
async def on_ready():
    logging.info(f"Logged in as {bot.user}")
    # Sync the commands with Discord
    await bot.tree.sync()

# Run the bot
bot.run('MTM0MTg5ODczOTM0OTk4MzI3Mg.GYFp_M.37g1sqY878-AIyhMuKV2YG8Bx5Wxazo76qytv4')  # Replace with your bot token