"""
deze python script werkt, en werkt in de terminal
voor een web versie, zie moderator_web.py
deze script en moderator_web.py werken onafhankelijk van elkaar
"""
import hashlib
import getpass
import database_connector
from api_keys import *
import datetime
from TwitterAPI import TwitterAPI

conn = database_connector.conn
cur = database_connector.cur

def newaccount():
	"""
		Spreekt voorzich, dit was een test functie om sql een beetje onder de knie te krijgen
		:returns True on success, False on error
	"""
	try:
		username = input('Gebruikersnaam: ').lower()
		if len(username) > 64 or len(username) < 3:
			print('Gebruikersnaam lengte is ongeldig, gebruik minimaal 3 en maximaal 64 tekens!')
			return False
		elif ' ' in username:
			print('Gebruikersnaam bevat spatie, dat mag niet')
			return False
		print('Uw gebruikersnaam is: ' + username)
	except:
		print('Ongeldige invoer')
		return False

	try:
		password1 = getpass.getpass('Voer wachtwoord in: ')
		password2 = getpass.getpass('Herhaal wachtwoord: ')
		if len(password1) < 4:
			print('Wachtwoord lengte is te weinig, gebruik minimaal 4 tekens!')
			return False
		elif password1 != password2:
			print('Wachtwoorden zijn niet hetzelfde!')
	except:
		print('Ongeldige invoer')
		return False

	cur.execute("SELECT naam FROM moderators WHERE naam = (%s);", (username, ))
	sqlreturn = cur.fetchone()

	if sqlreturn == None:
		"""
			password1 appenden met 'saltedlol' an beide encoden als utf8(ja ik weet het, zo werkt salting niet)
			daarna hashen met sha256(ja ik weet het er zijn betere manieren)
			
			na al dat gedoe, in de database inserten met gebruikersnaam en hash
		"""
		hashedpass = hashlib.sha256(password1.encode('UTF-8') + 'saltandpepper'.encode('UTF-8')).hexdigest()
		try:
			cur.execute("INSERT INTO moderators(naam, hash) VALUES (%s, %s)", (username, hashedpass))
			conn.commit()
			print('Account aangemaakt!')
			return True
		except:
			print('Fout bij het aanmaken van account!')
			return False
	else:
		print('Probleem met de database, bestaat de gebruiker al?')
		return False


def publishtwit(berichtid):
	"""
		ontvangt lokaal bericht id en published dat bericht naar twitter
		na het publishen, de functie pakt dan de twitter uniek id en zet het in de twitter berichten table met alle
		waarden die twitter mee heeft gegeven zoals: id, tijd, datum
		na het successfol publishen gaat de bericht status naar published(5)
	"""
	twitter_API = TwitterAPI(TWITTER_APIKEY, TWITTER_APISECRET, TWITTER_ACCESSTOKEN, TWITTER_ACCESSSECRET)

	cur.execute("SELECT * FROM berichten WHERE berichtid = (%s)", [berichtid])
	bericht = cur.fetchone()

	cur.execute("SELECT naam FROM locaties WHERE locatieid = (%s)", [bericht[9]])
	locatie = cur.fetchone()

	# het bericht dat gepubliceerd wordt
	formatted = str(bericht[1] + ' | Door ' + bericht[4] + ' op ' + locatie[0])

	if len(formatted) < 180:
		response = twitter_API.request('statuses/update', {'status': formatted})
		jsonresponse = response.json()
		if response.status_code == 200:
			# vul tabel twitterberichten eerst in
			QUERY = 'INSERT INTO twitterberichten(twitterid, datumpublished) VALUES (%s, %s)'
			DATA = (jsonresponse['id'], jsonresponse['created_at'])
			cur.execute(QUERY, DATA)

			# link twitterberichten met bericht in berichten tabel
			QUERY = 'UPDATE berichten SET twitterid = (%s) WHERE berichtid = (%s)'
			DATA = (jsonresponse['id'], berichtid)
			cur.execute(QUERY, DATA)
			conn.commit()
			return True
		else:
			print('Probleem met het publishen naar twitter')
			return False
	else:
		print('bericht is te lang')
		return False



def getmessage(moderatorid):
	"""
		vraagt de outste bericht op en zet het bericht gelijk op moderator lock(2)
		returnt een tuple met de oudste bericht met de status 1(pending moderation)
		de tuple ziet er alsvolgt uit: (berichtid int, berichtinhoud str, datum date, tijd time, naam str)
	"""
	cur.execute("SELECT berichtid, bericht, datumontvangen, tijdontvangen, naamposter FROM berichten WHERE statusid = 1 ORDER BY datumontvangen, tijdontvangen LIMIT 1")

	gottuple = cur.fetchone()

	if gottuple == None:
		return False

	cur.execute("UPDATE berichten SET statusid = 2, moderatorid = (%s) WHERE berichtid = (%s)", (moderatorid, gottuple[0]))
	conn.commit()
	return gottuple

def unlockmessage(berichtid):
	cur.execute("UPDATE berichten SET statusid = 1, moderatorid = NULL WHERE berichtid = (%s)", [berichtid])
	conn.commit()
	return True

def acceptmessage(berichtid, moderatorid):

	time = datetime.datetime.utcnow().strftime("%H:%M:%S")
	date = datetime.datetime.utcnow().strftime("%Y-%m-%d")

	QUERY = "UPDATE berichten SET statusid = 4, datumgekeurd = (%s), tijdgekeurd = (%s), moderatorid = (%s)  WHERE berichtid = (%s)"
	DATA = (date, time, moderatorid, berichtid)
	cur.execute(QUERY, DATA)
	conn.commit()
	return True

def rejectmessage(berichtid, moderatorid):

	time = datetime.datetime.utcnow().strftime("%H:%M:%S")
	date = datetime.datetime.utcnow().strftime("%Y-%m-%d")

	QUERY = "UPDATE berichten SET statusid = 3, datumgekeurd = (%s), tijdgekeurd = (%s), moderatorid = (%s)  WHERE berichtid = (%s)"
	DATA = (date, time, moderatorid, berichtid)
	cur.execute(QUERY, DATA)
	conn.commit()
	return True


def moderateloop(moderatorid):
	"""
		deze functie stop alleen als de gebruiker het aangeeft met: q

		deze functie vraagt ten eerste de outste bericht door getmessage()
		daarna weergeven de bericht, naam, tijd en datum.
		als de moderator het bericht goedkeurt de status van bericht veranderen naar moderator accepted(4)
		als de bericht wordt afgewezen verander de status naar moderator rejected(3) en loop weer verder
		nadat de bericht is goedgekeurt direct de functie publishtwit(berichtid) en loopt weer verder
	"""

	while True:
		exitvar = False

		bericht = getmessage(moderatorid)

		if bericht == False:
			print('Er zijn geen berichten meer om te weergeven, probeer het later opnieuw')
			return True

		print("Op " + str(bericht[2]) + " " + str(bericht[3]) + " heeft " + str(bericht[4]) + " een bericht achtergelaten")
		print(str(bericht[0]) + "    " + str(bericht[1]))

		while exitvar != True:
			try:
				modinput = input('r = reject, a = accept, q = quit: ').lower()
				if modinput == 'r':
					if rejectmessage(bericht[0], moderatorid):
						print('Moderatie opgeslagen')
					else:
						print('Probleem met het opslaan van de moderatie')
					exitvar = True
				elif modinput == 'a':
					if acceptmessage(bericht[0], moderatorid):
						print('Bericht successvol opgeslagen in database')
					else:
						print('Probleem met het opslaan van de moderatie.')

					if publishtwit(bericht[0]):
						print('Bericht is successvol gepubliceerd op twitter')
					else:
						print('Probleem met het publiceren op twitter')

					exitvar = True
				elif modinput == 'q':
					unlockmessage(bericht[0])
					return True
			except:
				print('Ongeldige invoer')


def listmessages(moderatorid):
	while True:
		inputcorrect = False
		print('_________________________________')
		print('Lijst opvragen')
		print('1. Berichten weergeven')
		print('2. Moderators weergeven')
		print('3. Gepubliseerde berichten weergeven')
		print('4. Locaties weergeven')
		print('0. Vorige Menu')
		print('_________________________________')

		while inputcorrect == False:
			try:
				optie = int(input('Kies optie: '))
				inputcorrect = True
			except:
				print('Ongeldige invoer')

		if optie == 0:
			return True
		elif optie == 1:
			return
		elif optie == 2:
			return
		elif optie == 3:
			return
		elif optie == 4:
			return
		else:
			print('Ongeldige invoer')

def menu(moderatorid, moderatornaam):
	while True:
		inputcorrect = False

		print('_________________________________')
		print('Hoofdmenu, ingelogd als: ' + moderatornaam)
		print('1. Berichten moderatie wachtrij')
		print('2. Lijst opvragen')
		print('3. Account aanmaken')
		print('0. Uitloggen')
		print('_________________________________')

		while inputcorrect == False:
			try:
				optie = int(input('Kies optie: '))
				inputcorrect = True
			except:
				print('Ongeldige invoer')


		if optie == 0:
			return True
		elif optie == 1:
			moderateloop(moderatorid)
		elif optie == 2:
			#listmessages(moderatorid)
			print('Optie moet nog aangemaakt worden')
		elif optie == 3:
			newaccount()
		else:
			print('Ongeldige invoer')



def login():
	"""
	deze functie is de eerste die opgeroepen wordt, en vraagt de moderator om in te loggen
	na een successfol inlog start de functie menu() met parameter moderatorid
	als er niet wordt ingelogd stop de functie
	"""

	try:
		username = input('Gebruikersnaam: ')
		password = getpass.getpass('Wachtwoord: ')
	except:
		print('Ongeldige invoer')

	hashedpass = hashlib.sha256(password.encode('UTF-8') + 'saltandpepper'.encode('UTF-8')).hexdigest()

	cur.execute("SELECT * FROM moderators WHERE naam = (%s);", [username])
	sqlreturn = cur.fetchone()

	if sqlreturn == None:
		print('Gebruiker niet gevonven')
		return False
	elif hashedpass != sqlreturn[2]:
		print('Wachtwoord onjuist')
		return False

	menu(sqlreturn[0], sqlreturn[1])


while True:
	login()