from discord.ext import commands
import discord
import random
import json
import datetime, pytz
import calendar

import requests
import urllib


class Utility:
	"""Commandes utilitaires."""

	def __init__(self, bot):
		self.bot = bot

	@commands.group(name="clock", pass_context=True, case_insensitive=True)
	async def clock(self, ctx):
		"""Display hour in a country"""

		if ctx.invoked_subcommand is None:
			text = open('texts/clocks.md').read()
			em = discord.Embed(title='Liste des Horloges', description=text, colour=0xEEEEEE)
			await ctx.send(embed=em)

	@clock.command(name="montréal", aliases=["mtl", "montreal"], pass_context=True)
	async def clock_montreal(self, ctx):
		then = datetime.datetime.now(pytz.utc)

		utc = then.astimezone(pytz.timezone('America/Montreal'))
		site = "http://ville.montreal.qc.ca/"
		img = "https://upload.wikimedia.org/wikipedia/commons/e/e0/Rentier_fws_1.jpg"
		country = "au Canada, Québec"
		description = "Montréal est la deuxième ville la plus peuplée du Canada. Elle se situe dans la région du Québec"

		form = '%H heures %M'
		tt = utc.strftime(form)

		em = discord.Embed(title='Heure à Montréal', description=f"A [Montréal]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE)
		em.set_thumbnail(url = img)
		await ctx.send(embed=em)

	@clock.command(name="vancouver", pass_context=True)
	async def clock_vancouver(self, ctx):
		then = datetime.datetime.now(pytz.utc)

		utc = then.astimezone(pytz.timezone('America/Vancouver'))
		site = "http://vancouver.ca/"
		img = "https://upload.wikimedia.org/wikipedia/commons/f/fe/Dock_Vancouver.JPG"
		country = "au Canada"
		description = "Vancouver, officiellement City of Vancouver, est une cité portuaire au Canada"

		form = '%H heures %M'
		tt = utc.strftime(form)

		em = discord.Embed(title='Heure à Vancouver', description=f"A [Vancouver]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE)
		em.set_thumbnail(url = img)
		await ctx.send(embed=em)

	@clock.command(name="new-york",aliases=["ny", "n-y", "new york"], pass_context=True)
	async def clock_new_york(self, ctx):
		then = datetime.datetime.now(pytz.utc)

		utc = then.astimezone(pytz.timezone('America/New_York'))
		site = "http://www1.nyc.gov/"
		img = "https://upload.wikimedia.org/wikipedia/commons/e/e3/NewYork_LibertyStatue.jpg"
		country = "aux U.S.A."
		description = "New York, est la plus grande ville des États-Unis en termes d'habitants et l'une des plus importantes du continent américain. "

		form = '%H heures %M'
		tt = utc.strftime(form)

		em = discord.Embed(title='Heure à New York', description=f"A [str(New York]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE)
		em.set_thumbnail(url = img)
		await ctx.send(embed=em)
			
	@clock.command(name="la", aliases=["los-angeles", "losangeles", "l-a", "los angeles"], pass_context=True)
	async def clock_la(self, ctx):
		then = datetime.datetime.now(pytz.utc)

		utc = then.astimezone(pytz.timezone('America/Los_Angeles'))
		site = "https://www.lacity.org/"
		img = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/LA_Skyline_Mountains2.jpg/800px-LA_Skyline_Mountains2.jpg"
		country = "aux U.S.A."
		description = "Los Angeles est la deuxième ville la plus peuplée des États-Unis après New York. Elle est située dans le sud de l'État de Californie, sur la côte pacifique."

		form = '%H heures %M'
		tt = utc.strftime(form)

		em = discord.Embed(title='Heure à Los Angeles', description=f"A [Los Angeles]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE)
		em.set_thumbnail(url = img)
		await ctx.send(embed=em)
			
	@clock.command(name="paris", aliases=["baguette"],pass_context=True)
	async def clock_paris(self, ctx):
		then = datetime.datetime.now(pytz.utc)

		utc = then.astimezone(pytz.timezone('Europe/Paris'))
		site = "http://www.paris.fr/"
		img = "https://upload.wikimedia.org/wikipedia/commons/a/af/Tour_eiffel_at_sunrise_from_the_trocadero.jpg"
		country = "en France"
		description = "Paris est la capitale de la France. Elle se situe au cœur d'un vaste bassin sédimentaire aux sols fertiles et au climat tempéré, le bassin parisien."

		form = '%H heures %M'
		tt = utc.strftime(form)

		em = discord.Embed(title='Heure à Paris', description=f"A [Paris]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE)
		em.set_thumbnail(url = img)
		await ctx.send(embed=em)
	
	@clock.command(name="berlin", pass_context=True)
	async def clock_berlin(self, ctx):
		then = datetime.datetime.now(pytz.utc)

		utc = then.astimezone(pytz.timezone('Europe/Berlin'))
		site = "http://www.berlin.de/"
		img = "https://upload.wikimedia.org/wikipedia/commons/9/91/Eduard_Gaertner_Schlossfreiheit.jpg"
		country = "en Allemagne"
		description = "Berlin est la capitale et la plus grande ville d'Allemagne. Située dans le nord-est du pays, elle compte environ 3,5 millions d'habitants. "

		form = '%H heures %M'
		tt = utc.strftime(form)

		em = discord.Embed(title='Heure à Berlin', description=f"A [Berlin]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE)
		em.set_thumbnail(url = img)
		await ctx.send(embed=em)
	
	@clock.command(name="berne", aliases=["zurich", "bern"], pass_context=True)
	async def clock_berne(self, ctx):
		then = datetime.datetime.now(pytz.utc)

		utc = then.astimezone(pytz.timezone('Europe/Zurich'))
		site = "http://www.berne.ch/"
		img = "https://upload.wikimedia.org/wikipedia/commons/d/db/Justitia_Statue_02.jpg"
		country = "en Suisse"
		description = "Berne est la cinquième plus grande ville de Suisse et la capitale du canton homonyme. Depuis 1848, Berne est la « ville fédérale »."

		form = '%H heures %M'
		tt = utc.strftime(form)

		em = discord.Embed(title='Heure à Berne', description=f"A [Berne]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE)
		em.set_thumbnail(url = img)
		await ctx.send(embed=em)
	
	@clock.command(name="tokyo", pass_context=True)
	async def clock_tokyo(self, ctx):
		then = datetime.datetime.now(pytz.utc)

		utc = then.astimezone(pytz.timezone('Asia/Tokyo'))
		site = "http://www.gotokyo.org/"
		img = "https://upload.wikimedia.org/wikipedia/commons/3/37/TaroTokyo20110213-TokyoTower-01.jpg"
		country = "au Japon"
		description = "Tokyo, anciennement Edo, officiellement la préfecture métropolitaine de Tokyo, est la capitale du Japon."

		form = '%H heures %M'
		tt = utc.strftime(form)

		em = discord.Embed(title='Heure à Tokyo', description=f"A [Tokyo]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE)
		em.set_thumbnail(url = img)
		await ctx.send(embed=em)
	
	@clock.command(name="moscou", aliases=["moscow", "moskova"], pass_context=True)
	async def clock_moscou(self, ctx):
		then = datetime.datetime.now(pytz.utc)

		utc = then.astimezone(pytz.timezone('Europe/Moscow'))
		site = "https://www.mos.ru/"
		img = "https://upload.wikimedia.org/wikipedia/commons/f/f7/Andreyevsky_Zal.jpg"
		country = "en Russie"
		description = "Moscou est la capitale de la Fédération de Russie et la plus grande ville d'Europe. Moscou est situé sur la rivière Moskova. "

		form = '%H heures %M'
		tt = utc.strftime(form)

		em = discord.Embed(title='Heure à Moscou', description=f"A [Moscou]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE)
		em.set_thumbnail(url = img)
		await ctx.send(embed=em)
			

	"""--------------------------------------------------------------------------------------------------------------------------"""

	@commands.command()
	async def ytdiscover(self, ctx):
		"""Random youtube channel"""
		with open('texts/ytb.json') as js:
			ytb = json.load(js)

		clef = str(random.randint(0,12))
		chaine = ytb["{}".format(clef)]

		embed = discord.Embed(title=chaine['name'], 
			url=chaine['url'], 
			description=f"**{chaine['name']}**, {chaine['desc']} \n[Je veux voir ça]({chaine['url']})")
		embed.set_thumbnail(url='https://outout.tech/tuxbot/yt.png')
		await ctx.send(embed=embed)

	"""--------------------------------------------------------------------------------------------------------------------------"""

	@commands.command(name='hastebin', pass_context=True)
	async def _hastebin(self, ctx, *, data):
		"""Poster sur Hastebin."""
		await ctx.message.delete()

		post = requests.post("https://hastebin.com/documents", data=data)

		try:
			await ctx.send(f"{ctx.message.author.mention} message posté avec succès sur :\nhttps://hastebin.com/{post.json()['key']}.txt")
		except json.JSONDecodeError:
			await ctx.send("Impossible de poster ce message. L'API doit être HS.")

	"""---------------------------------------------------------------------"""

	@commands.command(name='iplocalise', pass_context=True)
	async def _iplocalise(self, ctx, ipaddress):
		"""Recup headers."""
		if ipaddress.startswith("http://"):
			ipaddress = ipaddress.split("http://")[1]
		if ipaddress.startswith("https://"):
			ipaddress = ipaddress.split("https://")[1]
		iploading = await ctx.send("_réfléchis..._")
		ipapi = urllib.request.urlopen("http://ip-api.com/json/" + ipaddress)
		ipinfo = json.loads(ipapi.read().decode())

		if ipinfo["status"] != "fail":
			await iploading.edit(content="L'adresse IP ``{query}`` appartient à ``{org}`` et se situe à ``{city}``, dans ``{regionName}``, ``{country}``.".format(**ipinfo))
		else:
			await iploading.edit(content=f"Erreur, impossible d'avoir des informations sur l'adresse IP {ipinfo['query']}")

	"""--------------------------------------------------------------------------------------------------------------------------"""
	@commands.command(name='getheaders', pass_context=True)
	async def _getheaders(self, ctx, *, adresse):
		"""Recuperer les HEADERS :d"""
		print("Loaded")
		if adresse.startswith("http://") != True and adresse.startswith("https://") != True:
			 adresse = "http://" + adresse
		if len(adresse) > 200:
			await ctx.send("{0} Essaye d'entrer une adresse de moins de 200 caractères plutôt.".format(ctx.author.mention))
		elif adresse.startswith("http://") or adresse.startswith("https://") or adresse.startswith("ftp://"):
			try:
				get = urllib.request.urlopen(adresse, timeout = 1)
				embed = discord.Embed(title="Entêtes de {0}".format(adresse), color=0xd75858)
				embed.add_field(name="Code Réponse", value=get.getcode(), inline = True)
				embed.set_thumbnail(url="https://http.cat/{}".format(str(get.getcode())))
				if get.getheader('location'):
					embed.add_field(name="Redirection vers", value=get.getheader('location'), inline=True)
				if get.getheader('server'):
					embed.add_field(name="Serveur", value=get.getheader('server'), inline=True)
				if get.getheader('content-type'):
					embed.add_field(name="Type de contenu", value = get.getheader('content-type'), inline = True)
				if get.getheader('x-content-type-options'):
					embed.add_field(name="x-content-type", value= get.getheader('x-content-type-options'), inline=True)
				if get.getheader('x-frame-options'):
					embed.add_field(name="x-frame-options", value= get.getheader('x-frame-options'), inline=True)
				if get.getheader('cache-control'):
					embed.add_field(name="Controle du cache", value = get.getheader('cache-control'), inline = True)
				await ctx.send(embed=embed)
			except urllib.error.HTTPError as e:
				embed = discord.Embed(title="Entêtes de {0}".format(adresse), color=0xd75858)
				embed.add_field(name="Code Réponse", value=e.getcode(), inline = True)
				embed.set_thumbnail(url="https://http.cat/{}".format(str(e.getcode())))
				await ctx.send(embed=embed)
				print('''An error occurred: {} The response code was {}'''.format(e, e.getcode()))
			except urllib.error.URLError as e:
				print("ERROR @ getheaders @ urlerror : {} - adress {}".format(e, adresse))
				await ctx.send('[CONTACTER ADMIN] URLError: {}'.format(e.reason))
			except Exception as e:
				print("ERROR @ getheaders @ Exception : {} - adress {}".format(e, adresse))
				await ctx.send("{0} Impossible d'accèder à {1}, es-tu sur que l'adresse {1} est correcte et que le serveur est allumé ?".format(ctx.author.mention, adresse))
		else:
			await ctx.send("{0} Merci de faire commencer {1} par ``https://``, ``http://`` ou ``ftp://``.".format(ctx.message.author.mention, adresse))
	
	"""--------------------------------------------------------------------------------------------------------------------------"""
	
	@commands.command(name='github', pass_context=True)
	async def _github(ctx):
		"""Pour voir mon code"""
		text = "How tu veux voir mon repos Github pour me disséquer ? Pas de soucis ! Je suis un Bot, je ne ressens pas la douleur !\n https://github.com/outout14/tuxbot-bot"
		em = discord.Embed(title='Repos TuxBot-Bot', description=text, colour=0xE9D460)
		em.set_author(name='Outout', icon_url="https://avatars0.githubusercontent.com/u/14958554?v=3&s=400")
		await ctx.send(embed=em)

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