import discord
from discord import app_commands
from discord.ext import commands


def kick_command():
    @commands.hybrid_command(
        name="kick",
        description="Kicks a user from the server.",
    )
    @app_commands.describe(
        user="The user that should be kicked.",
        reason="The reason why the user should be kicked.",
    )
    async def kick(self, context, user: discord.User, *, reason: str = "Not specified"):
        try:
            member = context.guild.get_member(user.id)
            if not member:
                try:
                    member = await context.guild.fetch_member(user.id)
                except discord.NotFound:
                    embed = discord.Embed(
                        title="Error!",
                        description="This user is not in the server.",
                        color=0xE02B2B,
                    ).set_author(
                        name="Moderation",
                        icon_url="https://yes.nighty.works/raw/CPKHQd.png",
                    )
                    await context.send(embed=embed, ephemeral=True)
                    return

            if (
                not context.author.guild_permissions.kick_members
                and context.author != context.guild.owner
            ):
                embed = discord.Embed(
                    title="Missing Permissions!",
                    description="You don't have the `Kick Members` permission to use this command.",
                    color=0xE02B2B,
                ).set_author(
                    name="Moderation",
                    icon_url="https://yes.nighty.works/raw/CPKHQd.png",
                )
                await context.send(embed=embed, ephemeral=True)
                return

            if member and member.top_role >= context.guild.me.top_role:
                embed = discord.Embed(
                    title="Cannot Kick User",
                    description="This user has a higher or equal role to me. Make sure my role is above theirs.",
                    color=0xE02B2B,
                ).set_author(
                    name="Moderation",
                    icon_url="https://yes.nighty.works/raw/CPKHQd.png",
                )
                await context.send(embed=embed, ephemeral=True)
                return

            if member and context.author != context.guild.owner:
                if member.top_role >= context.author.top_role:
                    embed = discord.Embed(
                        title="Cannot Kick User",
                        description="You cannot kick this user as they have a higher or equal role to you.",
                        color=0xE02B2B,
                    ).set_author(
                        name="Moderation",
                        icon_url="https://yes.nighty.works/raw/CPKHQd.png",
                    )
                    await context.send(embed=embed, ephemeral=True)
                    return

            try:
                if member:
                    try:
                        await member.send(
                            embed=discord.Embed(
                                title="Kick",
                                description=f"You were kicked by **{context.author}** from **{context.guild.name}**!\nReason: {reason}",
                                color=0xE02B2B,
                            ).set_author(
                                name="Moderation",
                                icon_url="https://yes.nighty.works/raw/CPKHQd.png",
                            )
                        )
                    except (discord.Forbidden, discord.HTTPException):
                        pass

                await member.kick(reason=reason)

                embed = discord.Embed(
                    title="Kick",
                    description=f"**{user}** was kicked by **{context.author}**!",
                    color=0x7289DA,
                ).set_author(
                    name="Moderation",
                    icon_url="https://yes.nighty.works/raw/CPKHQd.png",
                )
                embed.add_field(name="Reason:", value=reason)

                await context.send(embed=embed)

            except discord.Forbidden:
                embed = discord.Embed(
                    title="Error!",
                    description="I don't have permission to kick this user. Make sure my role is above theirs.",
                    color=0xE02B2B,
                ).set_author(
                    name="Moderation",
                    icon_url="https://yes.nighty.works/raw/CPKHQd.png",
                )
                await context.send(embed=embed, ephemeral=True)
            except discord.HTTPException as e:
                if "Cannot kick the owner of a guild" in str(e):
                    embed = discord.Embed(
                        title="Cannot Kick User",
                        description="You cannot kick the server owner.",
                        color=0xE02B2B,
                    ).set_author(
                        name="Moderation",
                        icon_url="https://yes.nighty.works/raw/CPKHQd.png",
                    )
                else:
                    embed = discord.Embed(
                        title="Error!",
                        description=f"Discord API error: {str(e)}",
                        color=0xE02B2B,
                    ).set_author(
                        name="Moderation",
                        icon_url="https://yes.nighty.works/raw/CPKHQd.png",
                    )
                await context.send(embed=embed, ephemeral=True)
            except Exception as e:
                embed = discord.Embed(
                    title="Debug Error!",
                    description=f"Error type: {type(e).__name__}\nError message: {str(e)}",
                    color=0xE02B2B,
                ).set_author(
                    name="Moderation",
                    icon_url="https://yes.nighty.works/raw/CPKHQd.png",
                )
                await context.send(embed=embed, ephemeral=True)

        except Exception:
            embed = discord.Embed(
                title="Error!",
                description="An unexpected error occurred.",
                color=0xE02B2B,
            ).set_author(
                name="Moderation", icon_url="https://yes.nighty.works/raw/CPKHQd.png"
            )
            await context.send(embed=embed, ephemeral=True)

    return kick
