import imdb  # Used in movieFunc
import random  # Used in movieFunc
import discord  # Used in movieFunc
import datetime  # Used in helloFunc
import urllib  # Used in imageFunc
import lxml  # Used in imageFunc
import fandom  # Used in findWikiPage
import d20  # Used in rollDice
import ast
from .bedre_netflix import BedreNetflix
from .nerd_shit import NerdShit
from .generators import Generators

from gwendolyn.utils import cap

fandom.set_lang("da")
fandom.set_wiki("senkulpa")

class MyStringifier(d20.MarkdownStringifier):
    def _str_expression(self, node):
        if node.comment == None:
            resultText = "Result"
        else:
            resultText = node.comment.capitalize()

        return f"**{resultText}**: {self._stringify(node.roll)}\n**Total**: {int(node.total)}"

class Other():
    def __init__(self, bot):
        self.bot = bot
        self.bedre_netflix = BedreNetflix(self.bot)
        self.nerd_shit = NerdShit(self.bot)
        self.generators = Generators(self.bot)

    # Picks a random movie and returns information about it
    async def movieFunc(self, ctx):
        await self.bot.defer(ctx)

        self.bot.log("Creating IMDb object")
        imdbClient = imdb.IMDb()

        self.bot.log("Picking a movie")
        with open("gwendolyn/resources/movies.txt", "r") as f:
            movieList = f.read().split("\n")
        movieName = random.choice(movieList)

        self.bot.log(f"Searching for {movieName}")
        searchResult = imdbClient.search_movie(movieName)

        self.bot.log("Getting the data")
        movie = searchResult[0]
        imdbClient.update(movie)

        self.bot.log("Successfully ran /movie")

        title = movie["title"]
        plot = movie['plot'][0].split("::")[0]
        cover = movie['cover url'].replace("150","600").replace("101","404")
        cast = ", ".join([i["name"] for i in movie['cast'][:5]])
        embed = discord.Embed(title=title, description=plot, color=0x24ec19)
        embed.set_thumbnail(url=cover)
        embed.add_field(name="Cast", value=cast,inline = True)
        await ctx.send(embed = embed)

    # Responds with a greeting of a time-appropriate maner
    async def helloFunc(self, ctx):
        def time_in_range(start, end, x):
            # Return true if x is in the range [start, end]
            if start <= end:
                return start <= x <= end
            else:
                return start <= x or x <= end

        author = ctx.author.display_name
        now = datetime.datetime.now()
        if time_in_range(now.replace(hour=5, minute=0, second=0, microsecond=0),now.replace(hour=10, minute=0, second=0, microsecond=0), now):
            sendMessage = "Good morning, "+str(author)
        elif time_in_range(now.replace(hour=13, minute=0, second=0, microsecond=0),now.replace(hour=18, minute=0, second=0, microsecond=0), now):
            sendMessage = "Good afternoon, "+str(author)
        elif time_in_range(now.replace(hour=18, minute=0, second=0, microsecond=0),now.replace(hour=22, minute=0, second=0, microsecond=0), now):
            sendMessage = "Good evening, "+str(author)
        elif time_in_range(now.replace(hour=22, minute=0, second=0, microsecond=0),now.replace(hour=23, minute=59, second=59, microsecond=0), now):
            sendMessage = "Good night, "+str(author)
        else:
            sendMessage = "Hello, "+str(author)

        await ctx.send(sendMessage)

    # Finds a random picture online
    async def imageFunc(self, ctx):
        # Picks a type of camera, which decides the naming scheme
        cams = ("one","two","three","four")
        cam = random.choice(cams)
        self.bot.log("Chose cam type "+cam)
        if cam == "one":
            a = str(random.randint(0 ,9))
            b = str(random.randint(0,9))
            c = str(random.randint(0,9))
            d = str(random.randint(0,9))
            search = ("img_"+a+b+c+d)
        elif cam == "two":
            a = str(random.randint(2012,2016))
            b = str(random.randint(1,12)).zfill(2)
            c = str(random.randint(1,29)).zfill(2)
            search = ("IMG_"+a+b+c)
        elif cam == "three":
            a = str(random.randint(1,500)).zfill(4)
            search = ("IMAG_"+a)
        elif cam == "four":
            a = str(random.randint(0,9))
            b = str(random.randint(0,9))
            c = str(random.randint(0,9))
            d = str(random.randint(0,9))
            search = ("DSC_"+a+b+c+d)

        self.bot.log("Searching for "+search)

        # Searches for the image and reads the resulting web page
        page = urllib.request.urlopen("https://www.bing.com/images/search?q="+search+"&safesearch=off")
        read = page.read()
        tree = lxml.etree.HTML(read)
        images = tree.xpath('//a[@class = "iusc"]/@m')

        if len(images) == 0:
            await ctx.send("Found no images")
        else:
            # Picks an image
            number = random.randint(1,len(images))-1
            image = ast.literal_eval(str(images[number]))
            imageUrl = image["murl"]

            self.bot.log("Picked image number "+str(number))

            # Returns the image
            self.bot.log("Successfully returned an image")

            await ctx.send(imageUrl)

    # Finds a page from the Senkulpa Wikia
    async def findWikiPage(self, ctx, search : str):
        await self.bot.defer(ctx)
        foundPage = False

        if search != "":
            self.bot.log("Trying to find wiki page for "+search)
            searchResults = fandom.search(search)
            if len(searchResults) > 0:
                foundPage = True
                searchResult = searchResults[0]
            else:
                self.bot.log("Couldn't find the page")
                await ctx.send("Couldn't find page (error code 1002)")
        else:
            foundPage = True
            self.bot.log("Searching for a random page")
            searchResult = fandom.random()

        if foundPage:
            self.bot.log(f"Found page \"{searchResult[0]}\"")
            page = fandom.page(pageid = searchResult[1])
            content = page.summary

            images = page.images
            if len(images) > 0:
                image = images[0]
            else:
                image = ""
            self.bot.log("Sending the embedded message",str(ctx.channel_id))
            content += f"\n[Læs mere]({page.url})"
            embed = discord.Embed(title = page.title, description = content, colour=0xDEADBF)
            if image != "":
                embed.set_thumbnail(url=image)

            await ctx.send(embed = embed)

    async def rollDice(self, ctx, rollString):
        user = ctx.author.display_name
        while len(rollString) > 1 and rollString[0] == " ":
            rollString = rollString[1:]

        roll = d20.roll(rollString, allow_comments=True, stringifier=MyStringifier())
        await ctx.send(f"{user} :game_die:\n{roll}")

    async def helpFunc(self, ctx, command):
        if command == "":
            with open("gwendolyn/resources/help/help.txt",encoding="utf-8") as f:
                text = f.read()
            em = discord.Embed(title = "Help", description = text,colour = 0x59f442)
            await ctx.send(embed = em)
        else:
            self.bot.log(f"Looking for help-{command}.txt",str(ctx.channel_id))
            with open(f"gwendolyn/resources/help/help-{command}.txt",encoding="utf-8") as f:
                text = f.read()
            em = discord.Embed(title = command.capitalize(), description = text,colour = 0x59f442)
            await ctx.send(embed = em)

