from plugin import plugin, require
from colorama import Fore
import akinator
import subprocess
import sys


"""
Simple akinator text based game: think up a character, answer questions and akinator will find it !
https://pypi.org/project/akinator.py/
"""


@require(network=True)
@plugin("akinator")
def akinator_main(jarvis, s):

    opening_message(jarvis)
    jarvis.say('Press "g" to start, or "q" to quit !')
    while True:
        user_in = jarvis.input()
        if user_in == 'q':
            jarvis.say("See you next time :D", Fore.CYAN)
            break
        elif user_in == 'g':
            main_game(jarvis)
            break
        else:
            jarvis.say('Press "g" to start, or "q" to quit !')


# Helper methods


def opening_message(jarvis):
    ''' Messages displayed when akinator called '''

    jarvis.say('')
    jarvis.say('Let\'s play !')
    jarvis.say('You have to think of a public personality, answer to some questions and I will try to guess who it is !')
    jarvis.say('Rules: ')
    print_help(jarvis)


def main_game(jarvis):
    ''' Handling of the akinator library '''

    aki = akinator.Akinator()
    try:
        q = aki.start_game()
    except (akinator.AkiServerDown, akinator.AkiTechnicalError):
        try:
            q = aki.start_game("en2")  # 2nd server if the 1st is down
        except (akinator.AkiServerDown, akinator.AkiTechnicalError):
            q = aki.start_game("en3")  # 3rd server if the 2nd is down

    # questions loop
    while aki.progression <= 80:
        try:
            a = input(q + "\n")
        except EOFError:
            a = "cantDoThat"
        if a == "b":
            try:
                q = aki.back()
            except akinator.CantGoBackAnyFurther:
                pass
        elif a == "h":
            print_help(jarvis)
        elif a == "q":
            jarvis.say("See you next time !")
            return
        else:
            try:
                q = aki.answer(a)
            except akinator.InvalidAnswerError:
                jarvis.say("answer not understood, type \"h\" for help", Fore.MAGENTA)

    aki.win()

    imageViewerFromCommandLine = {'linux': 'xdg-open',
                                  'win32': 'explorer',
                                  'darwin': 'open'}[sys.platform]  # get an image Viewer
    try:
        subprocess.run([imageViewerFromCommandLine, aki.picture])  # display image of answer
    except Exception:
        pass
    correct = jarvis.input(f"It's {aki.name} ({aki.description})! Was I correct?\n\t")
    if correct.lower() == "yes" or correct.lower() == "y":
        jarvis.say("Yay !!! :D", Fore.GREEN)
    else:
        jarvis.say("Oups :(", Fore.GREEN)


def print_help(jarvis):
    ''' Print help '''
    jarvis.say("To answer, you have the following options: ", Fore.GREEN)
    jarvis.say("\t \"yes\" or \"y\" or \"0\" for YES", Fore.GREEN)
    jarvis.say("\t \"no\" or \"n\" or \"1\" for NO", Fore.GREEN)
    jarvis.say("\t \"i\" or \"idk\" or \"i dont know\" or \"2\" for I DON\'T KNOW", Fore.GREEN)
    jarvis.say("\t \"probably\" or \"p\" or \"3\" for PROBABLY", Fore.GREEN)
    jarvis.say("\t \"probably not\" or \"pn\" or \"4\" for PROBABLY NOT", Fore.GREEN)
    jarvis.say("\t \"q\" to QUIT", Fore.GREEN)