from socket import *
from random import randint
import sys
from threading import Thread

serverPort = 6789

questions = []
answers = []
correct = -1

def loadQuiz():

    global correct
    global answers
    with open("questions.txt","r") as f:
        for line in f:
            # if line is empty, skip
            if len(line.strip()) == 0:
                continue
            # if line starts with number followed by ".", it is a question
            if line[0].isdigit() and line[1] == ".":
                if correct != -1:
                    questions.append((question,answers,correct))
                question = line.strip()
                answers = []
                correct = -1
            else:
                if "*" in line.strip():
                    correct = len(answers)+1
                answers.append(line.replace("*","").strip())
#    print(questions)
        

def generateRandomQuestion():
    questionNumber = randint(0,len(questions)-1)
    return questions[questionNumber]

def writeAndFlush(stream,string):
    stream.writelines(string)
    stream.flush()

def onNewClient(connectionSocket,addr):
    print(f"New Client Connected: {addr}")
    # Create the streams once
    inStream = connectionSocket.makefile('r')
    outStream = connectionSocket.makefile('w')

    while True:
        question = generateRandomQuestion()
        sendQuestion(question,outStream)
        response = inStream.readline().strip()
        while response.lower() != "quit\n" and response != '':
            if response == '':
                print("CLIENT STREAM INTERRUPTED")
            elif (response.lower()=='quit'):
                break
            else:
                print(f"CLIENT RESPONSE: <{response}> -- CORRECT: <{question[2]}>")
                if int(response) == int(question[2]):
                    writeAndFlush(outStream,"Risposta corretta!\n")
                else:
                    writeAndFlush(outStream,"Risposta sbagliata!\n")
            
            
            question = generateRandomQuestion()
            sendQuestion(question,outStream)
            response = inStream.readline().strip()


        writeAndFlush(outStream,"quit\n")
        connectionSocket.close()
        break


def sendQuestion(question, outStream):
    serverOutput = f"{question[0]}\n"
    for answer in question[1]:
        serverOutput += f"{answer}\n"
    writeAndFlush(outStream,f"{serverOutput}\n")

def main():

    loadQuiz()

    server = socket()
    server.bind (('',serverPort))

    server.listen(2)
    print (f"SERVER LISTENING ON PORT {serverPort}")

    while True:
        connectionSocket, addr = server.accept()
        Thread(target=onNewClient, args=(connectionSocket, addr)).start()

if __name__ == "__main__":
    main()