import unittest
import time
import urllib.parse as urlparse
from urllib.parse import parse_qs
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select, WebDriverWait
from selenium.webdriver.support.select import Select

SCODOC_ID = "enseignantUS"
SCODOC_PASS = "enseignant@"
SCODOC_CHEF = "chefdesetudesUS"
SCODOC_CHEF_PASS = "passwordUS42"
nomDPT = "AurelienUS"
SCODOC_ADMIN_ID = "admin"
SCODOC_ADMIN_PASS = "root_pass_42"
baseURL = "https://scodoc-dev-iutinfo.univ-lille.fr/ScoDoc/"


class PythonOrgSearch(unittest.TestCase):
    # Permet de se connecter et se remettre sur la page d'accueil avant chaque test
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.url = baseURL + nomDPT + "/Scolarite"
        self.wait = WebDriverWait(self.driver, 10)
        self.driver.get(baseURL)
        self.driver.find_element_by_id("name").send_keys(SCODOC_ID)
        self.driver.find_element_by_id("password").send_keys(SCODOC_PASS)
        self.driver.find_element_by_id("submit").click()

    # Test : Vérifie s'il y a un semestre en cours
    # @expected  : La class listesems n'est pas vide et contient "Session en cours"
    def test_01semestre_en_cours(self):
        driver = self.driver
        url = self.url
        driver.get(url)
        time.sleep(1)
        self.assertTrue(
            "Sessions en cours" in driver.find_element_by_class_name("listesems").text
        )

    # Test : Vérifie si une matière existe
    # @expected : Le nom de la matière est présent dans le semestre préalablement testé
    def test_02matiere_existante(self):
        driver = self.driver
        url = self.url
        driver.get(url)
        driver.find_element_by_link_text("DUT Informatique semestre 4").click()
        time.sleep(1)
        try:
            driver.find_element_by_class_name("formsemestre_status_ue")
            self.assertTrue(True)
        except NoSuchElementException:
            self.assertFalse(False)

    # Test : Ajout d'un enseignant comme résponsable d'un module
    # @expected : Le nom de l'enseignant apparait désormais sur la page d'information du module
    def test_03ajout_enseignant_sur_module(self):
        driver = self.driver
        url = self.url
        self.driver.get(
            "https://"
            + SCODOC_ADMIN_ID
            + ":"
            + SCODOC_ADMIN_PASS
            + "@scodoc-dev-iutinfo.univ-lille.fr/force_admin_authentication"
        )
        driver.get(url)
        driver.find_element_by_link_text("DUT Informatique semestre 4").click()
        driver.find_element_by_link_text("M4101C").click()
        time.sleep(1)
        driver.find_element_by_partial_link_text("modifier les enseignants").click()
        time.sleep(1)
        driver.find_element_by_id("ens_id").send_keys("ENSEIGNANT Test (enseignantUS)")
        driver.find_element_by_id("tf_submit").click()
        time.sleep(1)
        self.assertTrue("Enseignants du" in driver.page_source)
        self.assertTrue(SCODOC_ID in driver.page_source)

    # Test : Création d'une interrogation en tant que chef des études
    # @eexpected : L'interrogation apparait désormais dans ce module
    def test_04creation_interrogation(self):
        descriptionInterrogation = "Interrogation numero 2"
        driver = self.driver
        url = self.url
        driver.get(baseURL)
        driver.find_element_by_link_text("déconnecter").click()
        driver.get(baseURL)
        driver.find_element_by_id("name").send_keys(SCODOC_CHEF)
        driver.find_element_by_id("password").send_keys(SCODOC_CHEF_PASS)
        driver.find_element_by_id("submit").click()
        driver.get(url)
        driver.find_element_by_link_text("DUT Informatique semestre 4").click()
        driver.find_element_by_link_text("M4101C").click()
        time.sleep(1)
        driver.find_element_by_link_text("Créer nouvelle évaluation").click()
        time.sleep(1)
        driver.find_element_by_id("tf_description").send_keys(descriptionInterrogation)
        driver.find_element_by_id("tf_coefficient").send_keys("2")
        driver.find_element_by_id("tf_submit").click()
        time.sleep(1)
        self.assertTrue(descriptionInterrogation in driver.page_source)

    # Test Vérifie si une interrogation existe sur un module
    # @expected "Module" est présent dans le "formsemetre"
    def test_05interro_existante(self):
        driver = self.driver
        url = self.url
        driver.get(url)
        driver.find_element_by_link_text("DUT Informatique semestre 4").click()
        driver.find_element_by_link_text("M4101C").click()
        time.sleep(1)
        self.assertTrue(
            "Module" in driver.find_element_by_class_name("formsemestre").text
        )

    # Test Entree des notes pour le premier étudiant inscrit à un module
    # @expected : "saisir note" est remplacé par "afficher" sur la page d'information de l'interrogation concernée
    def test_06entree_note(self):
        driver = self.driver
        url = self.url
        driver.get(url)
        driver.find_element_by_link_text("DUT Informatique semestre 4").click()
        driver.find_element_by_link_text("M4101C").click()
        time.sleep(1)
        driver.find_element_by_class_name("notes_img").click()
        time.sleep(1)
        element = driver.find_element_by_class_name("note")
        element.send_keys("12")
        driver.find_element_by_id("formnotes_submit").click()
        self.wait.until(EC.url_changes(url))
        self.assertTrue(
            driver.find_element_by_link_text("afficher").text in driver.page_source
        )
        driver.get(
            "https://scodoc-dev-iutinfo.univ-lille.fr/ScoDoc/AurelienUS/Scolarite/search_etud_in_dept"
        )
        element = driver.find_element_by_name("expnom")
        element.send_keys("UneAutreEtudiante")
        element.submit()
        time.sleep(5)
        self.assertTrue("12" in driver.find_elements_by_class_name("rcp_moy").text)

    # Test : Ajoute les notes manquante poru les étudiants concernés dans une interrogation
    # @expected : Tout les étudiants on une note
    def test_07ajout_note_incomplete(self):
        driver = self.driver
        url = self.url
        driver.get(url)
        driver.find_element_by_link_text("DUT Informatique semestre 4").click()
        driver.find_element_by_link_text("M4101C").click()
        time.sleep(1)
        driver.find_element_by_class_name("notes_img").click()
        elements = driver.find_elements_by_class_name("note")
        for element in elements:
            print(element.text)
            if element.text != "":
                element.send_keys(15)
        driver.find_element_by_id("formnotes_submit").click()

    # Test : Suppresion des notes pour tout les étudiants concernés dans une interrogation
    # @expected : La moyenne ne s'affiche plus, "afficher" disparait de la page d'information de l'interrogation
    def test_08suppression_note(self):
        driver = self.driver
        url = self.url
        driver.get(url)
        driver.find_element_by_link_text("DUT Informatique semestre 4").click()
        driver.find_element_by_link_text("M4101C").click()
        time.sleep(1)
        driver.find_element_by_class_name("notes_img").click()
        time.sleep(1)
        elements = driver.find_elements_by_class_name("note")
        for element in elements:
            element.clear()
            element.send_keys("SUPR")
        driver.find_element_by_id("formnotes_submit").click()
        self.wait.until(EC.url_changes(url))
        try:
            driver.find_element_by_link_text("afficher")
            self.assertFalse(False)
        except NoSuchElementException:
            self.assertTrue(True)

    # Test : SUppression d'une interrogation par le chef des études
    # @expected : L'interrogation n'apparait plus sur le module, les notes sont supprimées également
    def test_09suppresion_interrogation(self):
        descriptionInterrogation = "Interrogation numero 2"
        driver = self.driver
        url = self.url
        driver.get(baseURL)
        driver.find_element_by_link_text("déconnecter").click()
        driver.get(baseURL)
        driver.find_element_by_id("name").send_keys(SCODOC_CHEF)
        driver.find_element_by_id("password").send_keys(SCODOC_CHEF_PASS)
        driver.find_element_by_id("submit").click()
        driver.get(url)
        driver.find_element_by_link_text("DUT Informatique semestre 4").click()
        driver.find_element_by_link_text("M4101C").click()
        time.sleep(1)
        id = driver.find_element_by_link_text(descriptionInterrogation).text
        urlDelete = (
            baseURL
            + nomDPT
            + "/Scolarite/Notes/evaluation_delete?evaluation_id=%s" % id
        )
        driver.get(urlDelete)
        driver.get(url)
        self.assertFalse(descriptionInterrogation in driver.page_source)

    # Test : Suppression d'un enseignant responsable d'un module
    # @expected : L'enseignant n'apparait plus comme responsable dans ce module
    def test_10suppression_enseignant_sur_module(self):
        driver = self.driver
        url = self.url
        self.driver.get(
            "https://"
            + SCODOC_ADMIN_ID
            + ":"
            + SCODOC_ADMIN_PASS
            + "@scodoc-dev-iutinfo.univ-lille.fr/force_admin_authentication"
        )
        driver.get(url)
        driver.find_element_by_link_text("DUT Informatique semestre 4").click()
        driver.find_element_by_link_text("M4101C").click()
        time.sleep(1)
        driver.find_element_by_partial_link_text("modifier les enseignants").click()
        time.sleep(1)
        elements = driver.find_elements_by_link_text("supprimer")
        for element in elements:
            element.click()
            time.sleep(1)
        time.sleep(1)
        self.assertTrue(SCODOC_ID not in driver.page_source)

    # ferme la fenetre
    def tearDown(self):
        self.driver.close()


if __name__ == "__main__":
    unittest.main()