#!/usr/bin/python3

"""
  This is the Humor Application

  Usage: Prints a list of Humor categories
        Asks the User which Category they would like to see,
        Lists the number of entries in the selected category
        Asks the User to select an entry
        Displays the selected Entry

        Repeats until the User indicates they wish to quit.
"""

import os
import sys


def cls():
    os.system('cls')


def clear():
    os.system('clear')


def pause():
    input("Press Enter to Continue")


categories = []
data_holder = {}


def list_categories(file_dir):
    for entry in os.listdir(file_dir):
        categories.append(entry[:-4])
    categories.append("Quit")


def show_menu():
    cls() if sys.platform == 'win32' else clear()
    print('''\n\tWelcome to the Humor Application
       Please select from the following choices: \n''')
    for count, entry in enumerate(categories, 1):
        print("\t{0} {1}".format(count, entry))
    print()    


def show_detail_menu(category_value):
    records = data_holder[category_value]
    if isinstance(records, dict):
        keys = sorted(records.keys())
        for count, entry in enumerate(keys, 1):
            print("\t{0:>3d} {1}".format(count, entry))
    else:
        print("Number of Entries: {0}".format(len(records)))


def show_detail(category_value, selection_value):
    records = data_holder[category_value]
    if isinstance(records, dict):
        keys = sorted(records.keys())
        entry = keys[selection_value]
        print("{0}: {1}".format(entry, records[entry]))
    else:
        print("{0}: {1}".format(selection_value, records[selection_value]))


def talk_to_user(prompt):
    while True:
        results = input(prompt) 
        try:
            results = int(results.strip())
            return results
        except ValueError:
            print("Sorry Try Again ")


def load_file(location, name):
    if name not in data_holder:
        file_name = os.path.join(location, name) + '.txt'
        file_object = open(file_name, 'r')
        data = file_object.readlines()
        if '@' in data[0]:
            records = {}
            for record in data:
                key, value = record.split('@')
                records[key] = value
            data_holder[name] = records
        else:
            data_holder[name] = data     
        
       
directory = "Humor"
list_categories(directory)

while True:
    show_menu()
    selection = talk_to_user("Your Selection: ")
    if selection == len(categories):
        print("Goodbye")
        exit()
        
    if selection < 1 or selection > len(categories):
        print("Sorry Invalid Selection, Goodbye")
        exit()
    selection -= 1
    category = categories[selection]
    load_file(directory, category)
    show_detail_menu(category)
    selection = talk_to_user("Please Select: ")
    selection -= 1
    show_detail(category, selection)
    pause()
