# -*- coding: utf-8 -*-

"""Test Logos

Utilisation :
    créer les variables d'environnement: (indiquer les valeurs
    pour le serveur ScoDoc que vous voulez interroger)

    export SCODOC_URL="https://scodoc.xxx.net/"
    export SCODOC_USER="xxx"
    export SCODOC_PASSWD="xxx"
    export CHECK_CERTIFICATE=0 # ou 1 si serveur de production avec certif SSL valide

    (on peut aussi placer ces valeurs dans un fichier .env du répertoire tests/api).

    Lancer :
        pytest tests/api/test_api_absences.py
"""

import requests
from app.scodoc import sco_utils as scu
from tests.api.setup_test_api import API_URL, CHECK_CERTIFICATE, api_headers

# Etudiant pour les tests
from tests.api.tools_test_api import (
    verify_fields,
    ABSENCES_FIELDS,
    ABSENCES_GROUP_ETAT_FIELDS,
)

ETUDID = 1


# absences
def test_absences(api_headers):
    """
    Test 'absences'

    Route :
        - /absences/etudid/<int:etudid>
    """
    r = requests.get(
        f"{API_URL}/absences/etudid/{ETUDID}",
        headers=api_headers,
        verify=CHECK_CERTIFICATE,
        timeout=scu.SCO_TEST_API_TIMEOUT,
    )
    assert r.status_code == 200
    absences = r.json()

    assert isinstance(absences, list)
    for abs in absences:
        assert verify_fields(abs, ABSENCES_FIELDS) is True
        assert isinstance(abs["jour"], str)
        assert isinstance(abs["matin"], bool)
        assert isinstance(abs["estabs"], bool)
        assert isinstance(abs["estjust"], bool)
        assert isinstance(abs["description"], str)
        assert isinstance(abs["begin"], str)
        assert isinstance(abs["end"], str)

        assert abs["begin"] < abs["end"]


# absences_justify
def test_absences_justify(api_headers):
    """
    Test 'absences_just'

    Route :
        - /absences/etudid/<int:etudid>/just
    """
    r = requests.get(
        f"{API_URL}/absences/etudid/{ETUDID}/just",
        headers=api_headers,
        verify=CHECK_CERTIFICATE,
        timeout=scu.SCO_TEST_API_TIMEOUT,
    )
    assert r.status_code == 200
    absences = r.json()

    assert isinstance(absences, list)
    for abs in absences:
        assert verify_fields(abs, ABSENCES_FIELDS) is True
        assert isinstance(abs["jour"], str)
        assert isinstance(abs["matin"], bool)
        assert isinstance(abs["estabs"], bool)
        assert isinstance(abs["estjust"], bool)
        assert isinstance(abs["description"], str)
        assert isinstance(abs["begin"], str)
        assert isinstance(abs["end"], str)

        assert abs["begin"] < abs["end"]


def test_abs_groupe_etat(api_headers):
    """
    Test 'abs_groupe_etat'

    Routes :
        - /absences/abs_group_etat/<int:group_id>
        - /absences/abs_group_etat/group_id/<int:group_id>/date_debut/<string:date_debut>/date_fin/<string:date_fin>
    """
    group_id = 1
    r = requests.get(
        f"{API_URL}/absences/abs_group_etat/{group_id}",
        headers=api_headers,
        verify=CHECK_CERTIFICATE,
        timeout=scu.SCO_TEST_API_TIMEOUT,
    )
    assert r.status_code == 200

    list_absences = r.json()

    assert isinstance(list_absences, list)
    list_id_etu = []
    for etu in list_absences:
        list_id_etu.append(etu["etudid"])
        assert verify_fields(etu, ABSENCES_GROUP_ETAT_FIELDS) is True
        assert isinstance(etu["etudid"], int)
        assert isinstance(etu["list_abs"], list)

        list_abs = etu["list_abs"]
        for abs in list_abs:
            assert verify_fields(abs, ABSENCES_FIELDS) is True
            assert isinstance(abs["jour"], str)
            assert isinstance(abs["matin"], bool)
            assert isinstance(abs["estabs"], bool)
            assert isinstance(abs["estjust"], bool)
            assert isinstance(abs["description"], str)
            assert isinstance(abs["begin"], str)
            assert isinstance(abs["end"], str)

            assert abs["begin"] < abs["end"]

    # vérifie que chaque étudiant n'apparait qu'une seule fois
    assert len(set(list_id_etu)) == len(list_id_etu)

    date_debut = "Fri, 15 Apr 2021 00:00:00 GMT"
    date_fin = "Fri, 18 Apr 2022 00:00:00 GMT"

    r1 = requests.get(
        f"{API_URL}/absences/abs_group_etat/group_id/{group_id}/date_debut/{date_debut}/date_fin/{date_fin}",
        headers=api_headers,
        verify=CHECK_CERTIFICATE,
        timeout=scu.SCO_TEST_API_TIMEOUT,
    )
    assert r1.status_code == 200

    list_absences1 = r.json()

    assert isinstance(list_absences1, list)
    list_id_etu1 = []
    for etu in list_absences1:
        list_id_etu1.append(etu["etudid"])
        assert verify_fields(etu, ABSENCES_GROUP_ETAT_FIELDS) is True
        assert isinstance(etu["etudid"], int)
        assert isinstance(etu["list_abs"], list)

        list_abs1 = etu["list_abs"]
        for abs in list_abs1:
            assert verify_fields(abs, ABSENCES_FIELDS) is True
            assert isinstance(abs["jour"], str)
            assert isinstance(abs["matin"], bool)
            assert isinstance(abs["estabs"], bool)
            assert isinstance(abs["estjust"], bool)
            assert isinstance(abs["description"], str)
            assert isinstance(abs["begin"], str)
            assert isinstance(abs["end"], str)

            assert abs["begin"] < abs["end"]

    all_unique1 = True
    for id in list_id_etu1:
        if list_id_etu1.count(id) > 1:
            all_unique1 = False
    assert all_unique1 is True


# XXX TODO
# def reset_etud_abs(api_headers):
#     """
#     Test 'reset_etud_abs'
#
#     Routes :
#         - /absences/etudid/<int:etudid>/list_abs/<string:list_abs>/reset_etud_abs
#         - /absences/etudid/<int:etudid>/list_abs/<string:list_abs>/reset_etud_abs/only_not_just
#         - /absences/etudid/<int:etudid>/list_abs/<string:list_abs>/reset_etud_abs/only_just
#     """
#     list_abs = []
#     r = requests.get(
#         f"{API_URL}/absences/etudid/{ETUDID}/list_abs/{list_abs}/reset_etud_abs",
#         headers=api_headers,
#         verify=CHECK_CERTIFICATE,
#         timeout=scu.SCO_TEST_API_TIMEOUT,
#     )
#     assert r.status_code == 200
#
#     r_only_not_just = requests.get(
#         f"{API_URL}/absences/etudid/{ETUDID}/list_abs/{list_abs}/reset_etud_abs/only_not_just",
#         headers=api_headers,
#         verify=CHECK_CERTIFICATE,
#         timeout=scu.SCO_TEST_API_TIMEOUT,
#     )
#     assert r.status_code == 200
#
#
#     r_only_just = requests.get(
#         f"{API_URL}/absences/etudid/{ETUDID}/list_abs/{list_abs}/reset_etud_abs/only_just",
#         headers=api_headers,
#         verify=CHECK_CERTIFICATE,
#         timeout=scu.SCO_TEST_API_TIMEOUT,
#     )
#     assert r.status_code == 200