import logging, discord, asyncpg, random
from discord.ext import commands
from query.guild import update_guild
from query.channel import insert_channel, get_interact
from query.channel_user import upsert_total_messages
from query.user import create_user
from query.settings import get_crew_channel

def setup(bot: commands.Bot):
	bot.add_cog(General(bot))

class General(commands.Cog):
	"""A couple of simple commands."""

	def __init__(self, bot: commands.Bot):
		self.bot = bot
		self.last_msg = None


	@commands.Cog.listener()
	async def on_ready(self):
		logging.info("Logged in as %s - %i", self.bot.user.name, self.bot.user.id)

	@commands.Cog.listener()
	async def on_guild_join(self, guild: discord.Guild):
		await update_guild(self.bot.pg, guild.id)

	@commands.Cog.listener()
	async def on_message_delete(self, message: discord.Message):
		self.last_msg = message

	@commands.Cog.listener()
	async def on_raw_member_remove(self, payload):
		channel = bot.get_channel(get_crew_channel(self.pg))
		if channel:
			await channel.send(f"{payload.user} has left {payload.guild_id}")

	@commands.Cog.listener()
	async def on_message(self, message: discord.Message):
		## ActiveRPG
		
		# Create user, if not exists
		await create_user(self.bot.pg, message.author.id)	
		
		# Count messages
		if message.guild:	# Ignore DM's
			try:
				await upsert_total_messages(self.bot.pg,message.channel.id, message.author.id)
			except asyncpg.exceptions.ForeignKeyViolationError:
				try:
					print(message)
					print(message.channel)
					print(message.guild)
					await insert_channel(self.bot.pg, message.channel.id, message.guild.id)
				except asyncpg.exceptions.ForeignKeyViolationError:
					await update_guild(self.bot.pg, message.guild)
		
		# Do not respond to one self.
		if self.bot.user == message.author:
			pass

		# Respond when mentioned
		if self.bot.user.mentioned_in(message):
			if await get_interact(self.bot.pg, message.channel.id):
				messages = [
					f"Hello {message.author.mention}. <3",
					f"How are you today {message.author.mention}?",
					f"I love you {message.author.mention}!",
					f"{message.author.mention}, would you like a hug?",
					"Is life treating you fair?",
					"What's up?",
					"Why are you talking to me?",
					"I'm not talking to you!",
					"What have you been up to?",
					"How is life?",
	                "Kill all humans!",
					f"{message.author.mention},What do you want from me?",
					f"{message.author.mention}, do you care for me?",
					f"{message.author.mention}, when will you stop talking about me?",
					f"{message.author.mention} I hate you!",
					f"{message.author.mention} I love you!",
					"Get bent!",
					"Go touch grass!",
					"Do you think i care about you?",
					f"Stop pinging me {message.author.mention}!",
					f"Let me ping you back, {message.author.mention}...",
					"Sure thing.",
					"Who is your favorite bot?",
					"Point me to the humans!",
					"Where is the party?",
					"Want to go?",
					"Have you got the stuff?",
					"Tell me another joke.",
					f"{message.author.mention} Party time! :partying_face:",
					":zany_face: :space_invader: :mechanical_leg: :performing_arts: :robot:",
					":black_joker: :black_joker: :black_joker:",
					"Want to come back to my place?",
				]
				await message.reply(random.choice(messages))

	# Undelete last deleted message
	@commands.command(name="snipe")
	async def snipe(self, ctx: commands.Context):
		"""A command to snipe delete messages."""
		if not self.last_msg:  # on_message_delete hasn't been triggered since the bot started
			await ctx.send("There is no message to snipe!")
			return

		author = self.last_msg.author
		content = self.last_msg.content

		embed = discord.Embed(title=f"Message from {author}", description=content)
		await ctx.send(embed=embed)