import pronotepy
from pronotepy.ent import ile_de_france
from datetime import date
from datetime import datetime
import time
import json
import requests
import os
from dotenv import load_dotenv
load_dotenv()
DISCORD_WEBHOOKS_PRONOTE = os.getenv("DISCORD_WEBHOOKS_PRONOTE")
ENT_USERNAME = os.getenv("ENT_USERNAME")
ENT_PASSWORD = os.getenv("ENT_PASSWORD")
PRNT_USERNAME = os.getenv("PRNT_USERNAME")
PRNT_PASSWORD = os.getenv("PRNT_PASSWORD")
ENT = os.getenv("ENT")
path = 'new/pronote/'
path =''

def date_encoder(obj):
    if isinstance(obj, date):
        return obj.isoformat()
    raise TypeError("Type not serializable")

def envoyer_message_webhook(contenu):
    data = {
        'content': contenu
    }
    try:
        response = requests.post(DISCORD_WEBHOOKS_PRONOTE, json=data)
        if response.status_code == 204:
            print(f'{datetime.now().strftime("%H:%M")} : Send')
        else:
            print(f"Échec de l'envoi du message. Code d'état : {response.status_code}")
    except Exception as e:
        print(e)

def refresh(send):
    content = ''
    try :
        # client = pronotepy.Client('https://0910626l.index-education.net/pronote/eleve.html',
        #                     username=ENT_USERNAME,
        #                     password=ENT_PASSWORD,
        #                     ent=globals().get(ENT)) #ile_de_france
        client = pronotepy.Client('https://0910626l.index-education.net/pronote/eleve.html?login=true',
                            username=PRNT_USERNAME,
                            password=PRNT_PASSWORD)
        if not client.logged_in:
            exit(1)

        if send == 1:
            with open(path + 'grades.txt', 'r') as file:
                prev_grades = json.load(file)

            with open(path + 'average.txt', 'r') as file:
                prev_average = json.load(file)

        new_average = client.periods[0].overall_average

        new_grades_list = []
        for period in client.periods:
            for grade in period.grades:
                obj = grade.date
                gooddate = obj.isoformat()
                grade_dict = {
                    'grade': grade.grade,
                    'average': grade.average,
                    'coefficient': grade.coefficient,
                    'comment': grade.comment,
                    'date': gooddate,
                    'default_out_of': grade.default_out_of,
                    # 'id': grade.id,
                    'is_bonus': grade.is_bonus,
                    'is_optional': grade.is_optionnal,
                    'is_out_of_20': grade.is_out_of_20,
                    'max': grade.max,
                    'min': grade.min,
                    'out_of': grade.out_of,
                    # 'period_id': grade.period.id,
                    'period_name': grade.period.name,
                    # 'subject_id': grade.subject.id,
                    'subject_groups': grade.subject.groups,
                    'subject_name': grade.subject.name,
                    }
                new_grades_list.append(grade_dict)

        if send == 1:
            if len(new_grades_list) != len(prev_grades):
                changes = 0
                while len(new_grades_list) != len(prev_grades):
                    prev_grades.append('tmp')
                for i,old in zip(new_grades_list, prev_grades):
                    
                    if i != old:
                        changes+=1           
                    if changes == 1:
                        content = f"""**{i['subject_name']}** : {i['comment']}
                        {datetime.strptime(str(i['date']), "%Y-%m-%d").strftime("%d %B %Y")}
                        **{i['grade']}/{i['out_of']}** | Coef : {i['coefficient']}
                        Moy : **{i['average']}/{i['out_of']}**
                        :arrow_up_small: : {i['max']}/{i['out_of']} | :arrow_down_small: : {i['min']}/{i['out_of']}

                        Moy G : {new_average}({float(new_average)-float(prev_average)})
                        """
                        print('content: ', content)
                else:
                    print(f'{datetime.now().strftime("%H:%M")} : No change')

        ################
        with open(path + 'grades.txt', 'w') as file:
            json.dump(new_grades_list, file, indent=2, default=date_encoder)

        with open(path + 'average.txt', 'w') as file:
            json.dump(new_average, file, indent=2)

        return 1, content
    except Exception as e:
        return e, content


# schedule.every(20).minutes.do(refresh)
# print('refresh: 20')
# while True:
#     schedule.run_pending()
#     time.sleep(1)


status = 0
while status != 1:
    status, content = refresh(send = 0)
    print('content: ', content)
    print('status: ', status)
    if status != 1 :
        print(status)
        envoyer_message_webhook(status)
        time.sleep(2*60)


min = 20
print('refresh rate: ', 20)
while True:
    status = 0
    while status != 1:
        status, content = refresh(send = 1)
        if status != 1 :
            print(status)
            envoyer_message_webhook(status)
            time.sleep(2*60)
        elif content != '':
            envoyer_message_webhook(content)
        else :
            print('No change')
    time.sleep(min*60)

# ### debug
# # refresh(send=1)