#!/usr/bin/python
# Toggle me for debugging
debug = 1

# Import the libraries we will use
from datetime import datetime
from gtts import gTTS
import discord
import re
import sys
import random
import os
import asyncio


async def gameLoop():
	# Set bot presence
	await client.change_presence(activity=discord.Game(name='madlibs.py'))
	# Introduce yourself
	channel = client.get_channel(656233549837631508)
	await channel.send("**<<madlibsDiscord.py - Written by Caleb Fontenot>>**") 
	await channel.send("Initial project started on **July 13, 2019**")
	await channel.send("Discord Bot started on **December 16, 2019**")
	# Notify if verbose
	if debug == 1:
		await channel.send("Debug mode is enabled! Being verbose!")
	# Now on to business!
	# Load files
	async with channel.typing():	
		f = open('storyCount.txt', 'r')
		StoryCount = f.read()
		IntStoryCount = int(StoryCount)
		await channel.send("Detected "+str(IntStoryCount)+" stories")
	# Randomly pick what story we will use
	story = random.randint(1, IntStoryCount)
	
	#Declare vars
	storyContentStr = []
	storyNameStr = []
	# Alright, let's get the data from stories.txt
	i = 1
	f = open('stories.txt', 'r')
	for line in f.readlines():
		if i % 2 == 0 :
			storyContent = line
			storyContentStr.append(storyContent)	
		else:
			storyName = line
			storyNameStr.append(storyName)
		i+=1
	f.close()
	await channel.send(storyNameStr)
	# Print current story title, but remove the brackets first
	filteredTitle = re.findall(r'<(.*?)>', storyNameStr[story-1])
		
	# print the first result
	await channel.send("Current story title is "+'"'+str(filteredTitle[0])+'"'+'\n')
# Alright, now onto the tricky part. We need to filter out all of the bracketed words in stories.txt, putting them into a list, replacing them with incremental strings. We also need to count how many there 	are for later.
# Pull all of the items with the <> brackets
	filtered = re.findall(r'<(.*?)>', storyContentStr[story-1])
	# We got them!
	if debug == 1:
		await channel.send(str(filtered))
	# Now we need to count them
	replacedNumber = len(filtered)
	
	# Run a loop to get the words
	
	replaceList = []
	#replaceList =['', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', 	'17', '18', '19', '20', '21', '22', '23', '24']
	replaceList.append("")
	await channel.send(str("Type a noun, verb, adjective, or adverb depending on what it asks you, followed by enter."))
	
	for loopCount in range(replacedNumber):
		#Wait for user to reply
		await channel.send("Give me a(n) "+"**"+str(filtered[loopCount])+"**"+": ")	
		raw_message = await client.wait_for('message')
		replaceVar = raw_message.content
		print("You gave me: "+replaceVar)
		replaceList.append(replaceVar)
	print(replaceList)
# Run a loop to replace the words

	await channel.send("Replacing Words...")
	
	# Split the Story Content into a list
	storyContentList = re.split(r'<.*?>', storyContentStr[story-1])
	# Count the items in the list
	storyContentCount = len(storyContentList)
	x = 0
	for loopCount in range(storyContentCount):
		#print(storyContentList[loopCount])
		storyContentList.insert(x, replaceList[loopCount])
		x = x+2
	# To get colored words for our output, we need to add the appropiate commands to our variable.
	x = 0

	# Merge lists into a string
	generatedStory = ""
	generatedStory = generatedStory.join(storyContentList)
# Send Story to Discord
	await channel.send(generatedStory)
	#exit()
	#Alright! We're done! Let's save the story to a file
	now = datetime.now()
	currentDate = now.strftime("%d-%m-%Y-%H:%M:%S")
	saveFile = 'saved stories/generatedStory-'+currentDate
	if os.path.exists("saved stories"):
		pass
	else:
		os.system("mkdir \"saved stories\"")

	print("Saving story to .txt file")
	await channel.send("Saving story to .txt file")
	async with channel.typing():
		file = open(saveFile+'.txt', 'w+')	

		line_offset = []
		offset = 0

		for line in file:
			line_offset.append(offset)
			offset += len(line)
		file.seek(0)
		file.write(filteredTitle[0]+'\n'+'\n')
		file.write(generatedStory)
		file.write('\n'+"Generated by Caleb Fontenot\'s madlibs.py")
		file.close()
	#Send generated txt file to Discord
	await channel.send("Sending .txt file...")
	discordFile = discord.File(saveFile+'.txt', filename="generatedStory.txt")
	await channel.send(file=discordFile)


#Setup Discord functions and announce on discord that we are ready

class MyClient(discord.Client):

	async def on_ready(self):
		print('Logged on as', self.user)
		channel = client.get_channel(656233549837631508)
		await channel.send("madlibs.py - Discord Edition has successfully connected!")
		await channel.send("Run `mad!start` to start a a game")
		print("Ready!")		
	async def on_message(self, message, pass_context=True):
		if message.content == 'mad!start':
			channel = client.get_channel(656233549837631508)			
			await gameLoop()
			await channel.send("Done!")
#Run main Game loop

# The Discord bot ID isn't stored in this script for security reasons, so we have to go get it
f = open('botID.txt', 'r')
BotID = f.read()

# Connect Bot To Discord and start running
client = MyClient()
client.run(BotID)
exit()


	# say the tts
	#print('\n'+"Processing Text-To-Speech, please wait..."+'\n')
	#tts = gTTS(text=generatedStory+"This story was generated by Caleb Fontenot's MadLibs.py", lang='en')
	#tts.save("TTS.mp3")
	##os.system("play TTS.mp3")
	#os.system("mv TTS.mp3 "+"\""+saveFile+".mp3"+"\"")
	#Start Discord Bot loop
