import sys
import os
import py_compile

def timelimit(timeout, func, args=(), kwargs={}):
    import threading
    class FuncThread(threading.Thread):
        def __init__(self):
            threading.Thread.__init__(self)
            self.result = None
        def run(self):
            self.result = func(*args, **kwargs)
    it = FuncThread()
    it.start()
    it.join(timeout)
    if it.isAlive():
        return "\nIl tuo programma sta eseguendo un ciclo infinito.\nPer ucciderlo non basta premere invio\n devi chiudere la finesta con il mouse"
    else:
        return it.result


os.chdir(os.path.dirname(sys.argv[0]))
d=os.getcwd()
if d!="/home/biar/Desktop/esame":
    print("Attenzione: stai salvando il tuo compito su una cartella sbagliata\n Contatta il docente")


def registra():
##    if "D:\\S\\Dropbox\\Correttore\\Nuovo correttore\\PYC" not in sys.path:
##        sys.path.append("D:\\S\\Dropbox\\Correttore\\Nuovo correttore\\PYC")
##    if "C:\\Docs\\Dropbox\\Correttore\\Nuovo correttore\\PYC" not in sys.path:
##        sys.path.append("C:\\Docs\\Dropbox\\Correttore\\Nuovo correttore\\PYC")

    file = '../studente.txt'
    file1 = '../data.pyc'
    f = open(file,'w', encoding='utf-8')
    f1 = open(file1,'w', encoding='utf-8')

    nome = input('Inserisci Nome: ')
    while len(nome.strip())<2:
        nome = input('Inserisci Nome: ')
    nome = nome.capitalize()
    cognome = input('Inserisci Cognome: ')
    while len(cognome.strip())<2:
        cognome = input('Inserisci Cognome: ')
    cognome = cognome.capitalize()

    matricola = (input('Inserisci Matricola: '))
    while not matricola.isdecimal():
        matricola = (input('Inserisci Matricola: '))

    print(matricola, file = f)
    print(cognome, file = f)
    print(nome, file = f)
    f.close()
    print(matricola, file = f1)
    print(cognome, file = f1)
    print(nome, file = f1)
    f1.close()


while not os.path.isfile("../studente.txt"):
    registra()


righe=0
while righe!=3:
    righe=0
    for elem in open("../studente.txt", encoding="utf-8"):
        if len(elem)>1:
            righe=righe+1
    if righe!=3:
        registra()  
f=open("config.txt","r", encoding="UTF8")
for i in range(6):
    s=f.readline().strip()
if s != "NoHelperModules":
    exec("import " + s)
for i in range(2):
    s=f.readline().strip()
try:    
    print("Compilo ",s)
    py_compile.compile(s,doraise=True)
except py_compile.PyCompileError:
    tb=sys.exc_info()[2]
    tbb=tb.tb_next
    tbbb=tbb.tb_next
    print("Si è verificato un errore di compilazione")
    #print(sys.exc_info()[0])
    print(sys.exc_info()[1])
    tb=sys.exc_info()[2]
    h=input("Premere invio per terminare...")
    sys.exit()
try:
    exec("import "+s[0:len(s)-3])
    #print("import "+s[0:len(s)-3])
    metodoStu=s[0:len(s)-3]
    s=f.readline().strip()
    s=f.readline().strip()
    exec("import "+s[0:len(s)-3])
    #print("import "+s[0:len(s)-3])
    metodoDoc=s[0:len(s)-3]
    s=f.readline().strip()
    s=f.readline().strip()
    metodoStu+="."+s
    metodoDoc+="."+s
    #print("stu="+metodoStu)
    #print("doc="+metodoDoc)
    while s[0]!="(":
        s=f.readline().strip()
    i=1
    errori=0
    while len(s)>0:
        s.strip()
        print("========================")
        print(metodoStu[6:]+s)
##        f2=s.lower().find(".txt")+4
##        if ".txt" in s:
##            print(s[2:f2]+":\n"+open((s[2:f2]),encoding='utf8').read())
##        f2=s.lower().find(".csv")+4
##        if ".csv" in s.lower():
##            print(s[2:f2]+":\n"+open((s[2:f2]),encoding='utf8').read())             
        print("========================")
        exec("doc="+metodoDoc+s)
        print("Il risultato giusto: ",doc,"\n***********")    


        command="stu=timelimit(3,"+ metodoStu+", ["+s[1:-1]+"])"
        exec(command)
        #exec("stu="+metodoStu+s)


        print("Il tuo risultato: ",stu,"\n***********")
        if stu==doc:
            print("Il tuo risultato è giusto!")
        else:
           print("Il tuo risultato è sbagliato!")
           errori=errori+1
        print("--------------------------------------------")   
        s=f.readline().strip()
        i=i+1
    if errori>0:
        print("ATTENZIONE !!!! Il tuo metodo ha fallito ",errori, " volte")
    else:
        print("CONGRATULAZIONI!!! Il tuo programma ha superato tutti i test")
    if d[0:-1]!="T:\\Esame\\Eserc" and False:
        print("Attenzione: stai salvando il tuo compito su una cartella sbagliata\n Contatta il docente")
    
except BaseException:
    tb=sys.exc_info()[2]
    tbb=tb.tb_next
    tbbb=tbb.tb_next
    print("Durante l'esecuzione del tuo codice")
    print("si è verificato un errore alla linea:", tbbb.tb_lineno)
    #print(sys.exc_info()[0])
    print(sys.exc_info()[1])
    tb=sys.exc_info()[2]
if d[0:-1]!="T:\\Esame\\Eserc" and False:
    print("Attenzione: stai salvando il tuo compito su una cartella sbagliata\n Contatta il docente")
    
h=input("Premere invio per terminare...")     
#************************
