import os
import time
import re
import datetime
import csv
import pandas as pd
from slackclient import SlackClient




slack_client = SlackClient(os.environ.get('SLACK_BOT_TOKEN'))





USERNAME_REGEX = "^<@U$"


def send_response_to_channel(message, channel):
	slack_client.api_call("chat.postMessage", channel=channel, text=message)


def get_all_existing_users():
	all_slack_users = []

	api_call = slack_client.api_call("users.list")

	if api_call.get('ok'):
		users = api_call['members']
		for user in users:
			all_slack_users.append({"user_id": user['id'], "real_name": user['real_name']})

		return all_slack_users


def get_a_user_info(user_id):
	api_call = slack_client.api_call("users.info", user=user_id)

	if api_call.get('ok'):
		user_name = api_call['user']['name']

		return user_name


def write_to_csv():

	header = ['receiver_user_id', 'receiver_name', 'giver_user_id', 'date']

	with open("kudos.csv", "w", newline='') as f:
		writer = csv.writer(f, delimiter=',')
		writer.writerow(header)

	f.close()


def append_to_existing_csv(row):

	with open('kudos.csv', 'a') as f:
		writer = csv.writer(f, delimiter=',')
		writer.writerow(row)

	f.close()



def get_the_leaderboard():
	 
	data = pd.read_csv("kudos.csv") 
	lb = data['receiver_name'].value_counts()
	
	receiver = lb.keys().tolist()
	kudos_no = lb.tolist()

	results = [a for a in zip(receiver, kudos_no)]

	return results


def has_posted_today(giver_user_id):
	data = pd.read_csv("kudos.csv") 

	for key, row in data.iterrows():
		kudos_date_obj = datetime.datetime.strptime(row['date'], '%Y-%m-%d')

		# print(row['giver_user_id'], giver_user_id)
		# print("------------")
		# print(kudos_date_obj.date(), datetime.datetime.today().date())


		if row['giver_user_id'] == giver_user_id and kudos_date_obj.date() == datetime.datetime.today().date():

			return True

	return False
	





def parse_slack_events(slack_events):

	"""
	Get all slack events and check if it contains the word `Kudos` and a user
	"""

	for event in slack_events:

		if event["type"] == "message" and not "subtype" in event:

			words_in_text = event["text"].split(" ")

			first_word_in_text = words_in_text[0]

			if len(words_in_text) > 1:

				second_word_in_text = words_in_text[1]
			else:
				second_word_in_text = "nothing"

			regx = re.compile(USERNAME_REGEX)

			if first_word_in_text.lower() == "kudos":
				print("the slack text is ==== ", event["text"])

				for word in words_in_text:

					if regx.match(word[0:3]):

						giver = event["user"]
						receiver = word[2:-1]

						giver_name = get_a_user_info(giver)
						receiver_name = get_a_user_info(receiver)

						posted = has_posted_today(giver)

						if posted != True:

							if giver != receiver:

								given_on = datetime.datetime.today().date()

								row_data = [receiver, receiver_name, giver, given_on]

								append_to_existing_csv(row_data)

								message = ':thumbsup: `{}` has just received a `Kudo` from `{}`. Keep the Kudos coming in.'.format(receiver_name, giver_name)

								send_response_to_channel(message, event["channel"])

							else:
								message = '`Dissapointed!` @{} why do you want to game the system? Huh.'.format(giver_name)

								send_response_to_channel(message, event["channel"])

						else:
							message = '@{} you have already given out a Kudos today. `Great job!`'.format(giver_name)

							send_response_to_channel(message, event["channel"])


			elif regx.match(first_word_in_text[0:3]) and second_word_in_text.lower() == "leaderboard":

				lb = get_the_leaderboard()

				send_response_to_channel(lb, event["channel"])

			elif regx.match(first_word_in_text[0:3]) and second_word_in_text.lower() == "help":

				message = """- Start your message with Kudos, mention the receiver and say why. For example: `Kudos to @naanamensa for helping me out with my issue today.` 
- Want help? Do `@kudobot help`
- Want the leaderboard? Do `@kudobot leaderboard`
					"""

				send_response_to_channel(message, event["channel"])
				




if __name__ == "__main__":

	if slack_client.rtm_connect():
		print("Kudobot connected and running!")

		while True:
			parse_slack_events(slack_client.rtm_read())

			time.sleep(1)
	else:
		print("Connection failed. Exception traceback printed above.")