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

"""Test API: départements

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_departements.py
"""

import requests

from tests.api.setup_test_api import (
    API_URL,
    CHECK_CERTIFICATE,
    GET,
    POST_JSON,
    api_headers,
    api_admin_headers,
)
from tests.api.tools_test_api import (
    verify_fields,
    DEPARTEMENT_FIELDS,
    FORMSEMESTRE_FIELDS,
    verify_occurences_ids_etuds,
)
from app.scodoc import sco_utils as scu


def test_create_dept(api_admin_headers):
    """
    Routes: /departement/create,
            /departement/<string:dept_acronym>/edit
            /departement/<string:dept_acronym>/delete
    """
    dept = POST_JSON(
        "/departement/create",
        {"acronym": "XTEST", "visible": True},
        headers=api_admin_headers,
    )
    dept_r = GET(f"/departement/{dept['acronym']}", headers=api_admin_headers)
    assert dept["acronym"] == dept_r["acronym"]
    assert dept_r["visible"] is True
    dept_e = POST_JSON(
        f"/departement/{dept['acronym']}/edit",
        {"visible": False},
        headers=api_admin_headers,
    )
    dept_r = GET(f"/departement/{dept['acronym']}", headers=api_admin_headers)
    assert dept_r["visible"] is False
    r = POST_JSON(
        f"/departement/{dept['acronym']}/delete",
        headers=api_admin_headers,
    )
    assert r["OK"] is True


def test_departements(api_headers):
    """
    Routes: /departements_ids, /departement, /departement/<string:dept>/formsemestres_ids
    """
    # --- departement_ids : liste des ids
    r = requests.get(
        API_URL + "/departements_ids",
        headers=api_headers,
        verify=CHECK_CERTIFICATE,
        timeout=scu.SCO_TEST_API_TIMEOUT,
    )
    assert r.status_code == 200
    departements_ids = r.json()
    assert isinstance(departements_ids, list)
    assert len(departements_ids) > 0
    assert all(isinstance(x, int) for x in departements_ids)

    all_unique = True
    for id in departements_ids:
        if departements_ids.count(id) > 1:
            all_unique = False

    assert all_unique is True

    dept_id = departements_ids[0]

    # --- departement
    # Infos sur un département, accès par id
    r = requests.get(
        f"{API_URL}/departement/id/{dept_id}",
        headers=api_headers,
        verify=CHECK_CERTIFICATE,
        timeout=scu.SCO_TEST_API_TIMEOUT,
    )
    assert r.status_code == 200
    dept_a = r.json()
    # Infos sur un département, accès par acronyme4
    r = requests.get(
        f"{API_URL}/departement/{dept_a['acronym']}",
        headers=api_headers,
        verify=CHECK_CERTIFICATE,
        timeout=scu.SCO_TEST_API_TIMEOUT,
    )
    assert r.status_code == 200
    dept_b = r.json()

    assert dept_a == dept_b
    assert verify_fields(dept_a, DEPARTEMENT_FIELDS) is True
    assert isinstance(dept_a["id"], int)
    assert isinstance(dept_a["acronym"], str)
    assert dept_a["description"] is None or isinstance(dept_a["description"], str)
    assert isinstance(dept_a["visible"], bool)
    assert dept_a["date_creation"] is None or isinstance(dept_a["date_creation"], str)

    # --- departements : Liste des départements
    r = requests.get(
        API_URL + "/departements",
        headers=api_headers,
        verify=CHECK_CERTIFICATE,
        timeout=scu.SCO_TEST_API_TIMEOUT,
    )
    assert r.status_code == 200

    # --- formsemestre_ids : listes des ids de formsemestres du département
    r = requests.get(
        f"{API_URL}/departement/{dept_a['acronym']}/formsemestres_ids",
        headers=api_headers,
        verify=CHECK_CERTIFICATE,
        timeout=scu.SCO_TEST_API_TIMEOUT,
    )
    assert r.status_code == 200
    dept_ids_a = r.json()

    r = requests.get(
        f"{API_URL}/departement/id/{dept_a['id']}/formsemestres_ids",
        headers=api_headers,
        verify=CHECK_CERTIFICATE,
        timeout=scu.SCO_TEST_API_TIMEOUT,
    )
    assert r.status_code == 200
    dept_ids_b = r.json()

    assert dept_ids_a == dept_ids_b
    assert isinstance(dept_ids_a, list)
    assert all(isinstance(id, int) for id in dept_ids_a)
    assert len(dept_ids_a) > 0
    assert dept_id in dept_ids_a

    # Les erreurs
    id_inexistant = 50000
    r = requests.get(
        f"{API_URL}/departement/{id_inexistant}",
        headers=api_headers,
        verify=CHECK_CERTIFICATE,
        timeout=scu.SCO_TEST_API_TIMEOUT,
    )
    assert r.status_code == 404

    r = requests.get(
        f"{API_URL}/departement/{id_inexistant}/formsemestres_ids",
        headers=api_headers,
        verify=CHECK_CERTIFICATE,
        timeout=scu.SCO_TEST_API_TIMEOUT,
    )
    assert r.status_code == 404

    acronym_inexistant = "AAAAAAAAAAAAAAAAAAA"
    r = requests.get(
        f"{API_URL}/departement/{acronym_inexistant}",
        headers=api_headers,
        verify=CHECK_CERTIFICATE,
        timeout=scu.SCO_TEST_API_TIMEOUT,
    )
    assert r.status_code == 404

    r = requests.get(
        f"{API_URL}/departement/{acronym_inexistant}/formsemestres_ids",
        headers=api_headers,
        verify=CHECK_CERTIFICATE,
        timeout=scu.SCO_TEST_API_TIMEOUT,
    )
    assert r.status_code == 404


def test_list_etudiants(api_headers):
    fields = {"id", "code_nip", "code_ine", "nom", "nom_usuel", "prenom", "civilite"}

    r = requests.get(
        API_URL + "/departement/TAPI/etudiants",
        headers=api_headers,
        verify=CHECK_CERTIFICATE,
        timeout=scu.SCO_TEST_API_TIMEOUT,
    )
    assert r.status_code == 200
    etud_a = r.json()[0]

    r = requests.get(
        API_URL + "/departement/id/1/etudiants",
        headers=api_headers,
        verify=CHECK_CERTIFICATE,
        timeout=scu.SCO_TEST_API_TIMEOUT,
    )
    assert r.status_code == 200
    etud_b = r.json()[0]

    assert etud_a == etud_b
    assert verify_fields(etud_a, fields) is True
    assert isinstance(etud_a["id"], int)
    assert etud_a["code_nip"] is None or isinstance(etud_a["code_nip"], str)
    assert etud_a["code_ine"] is None or isinstance(etud_a["code_ine"], str)
    assert etud_a["nom"] is None or isinstance(etud_a["nom"], str)
    assert etud_a["nom_usuel"] is None or isinstance(etud_a["nom_usuel"], str)
    assert etud_a["prenom"] is None or isinstance(etud_a["prenom"], str)
    assert isinstance(etud_a["civilite"], str)
    assert len(etud_a["civilite"]) == 1

    all_unique = verify_occurences_ids_etuds(r.text)
    assert all_unique is True

    # Les erreurs
    id_inexistant = 50000
    r = requests.get(
        f"{API_URL}/departement/{id_inexistant}/etudiants",
        headers=api_headers,
        verify=CHECK_CERTIFICATE,
        timeout=scu.SCO_TEST_API_TIMEOUT,
    )
    assert r.status_code == 404

    acronym_inexistant = "AAAAAAAAAAAAAAAAAAA"
    r = requests.get(
        f"{API_URL}/departement/{acronym_inexistant}/etudiants",
        headers=api_headers,
        verify=CHECK_CERTIFICATE,
        timeout=scu.SCO_TEST_API_TIMEOUT,
    )
    assert r.status_code == 404


# liste_semestres_courant
def test_semestres_courant(api_headers):
    dept_id = 1
    r = requests.get(
        f"{API_URL}/departement/id/{dept_id}",
        headers=api_headers,
        verify=CHECK_CERTIFICATE,
        timeout=scu.SCO_TEST_API_TIMEOUT,
    )
    assert r.status_code == 200
    dept = r.json()
    assert dept["id"] == dept_id

    # Accès via acronyme
    r = requests.get(
        f"{API_URL}/departement/{dept['acronym']}/formsemestres_courants?date_courante=2022-07-01",
        headers=api_headers,
        verify=CHECK_CERTIFICATE,
        timeout=scu.SCO_TEST_API_TIMEOUT,
    )
    assert r.status_code == 200
    result_a = r.json()

    # accès via dept_id
    r = requests.get(
        f"{API_URL}/departement/id/{dept['id']}/formsemestres_courants?date_courante=2022-07-01",
        headers=api_headers,
        verify=CHECK_CERTIFICATE,
        timeout=scu.SCO_TEST_API_TIMEOUT,
    )
    assert r.status_code == 200
    result_b = r.json()
    assert result_a == result_b
    assert isinstance(result_a, list)  # liste de formsemestres
    assert len(result_a) > 0
    sem = result_a[0]
    assert verify_fields(sem, FORMSEMESTRE_FIELDS) is True