from django.contrib.staticfiles.testing import StaticLiveServerTestCase

from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.webdriver import WebDriver
from recuperateur_reseau_viaire.models import Graph_viaire_ville_information, Ville
import re

class view_indexTests(StaticLiveServerTestCase):

    selenium = None

    @classmethod
    def setUpClass(cls):
        """
        Le but de cette méthode est d'initialiser selenium avant le début des tests de la classe

        """
        super().setUpClass()
        cls.selenium = WebDriver()
        cls.selenium.implicitly_wait(10)

    @classmethod
    def tearDownClass(cls):
        """
        Le but de cette méthode est de fermer selenium à la fin des tests de la classe
        """
        cls.selenium.quit()
        super().tearDownClass()

    def setUp(self) -> None:
        """
        Le but de cette méthode est que selenium soit dans l'index du site à chaque test
        """
        self.nom_ville_test_a = "commune"
        self.nom_ville_test_b = "ville"

        def ajoute_ville_et_gvvi(nom_ville):
            """
            Cette méthoe permet de créer dans la base de donnée une ville de nom nom_ville et ses informations associées
            dans la table Graph_viaire_ville_information
            :param nom_ville: le nom de la ville que nous voulons ajouter
            :return:
            """
            Ville.objects.create(ville_nom=nom_ville)
            Graph_viaire_ville_information.objects.create(gvvi_cout=0, gvvi_robustesse=0,
                                                          gvvi_d2_correlation_dimension=0,
                                                          gvvi_d1_information_dimension=0,
                                                          gvvi_d0_fractal_capacite_dimension=0,
                                                          gvvi_longueur_moyenne_rues=0, gvvi_tree_vs_complete_graph=0,
                                                          gvvi_org_plan_vs_organized=0, gvvi_connectivity=0,
                                                          gvvi_degre_moyen=0, gvvi_diametre=0, gvvi_nb_intersection=0,
                                                          ville=Ville.objects.get(ville_nom=nom_ville))

        # création d'une instance de Ville
        ajoute_ville_et_gvvi(self.nom_ville_test_a)
        ajoute_ville_et_gvvi(self.nom_ville_test_b)
        self.selenium.get('%s%s' % (self.live_server_url, '/recuperateur_reseau_viaire/'))

    def test_index_bouton_telechargement_ville(self):
        """
        Cette mthode test le bouton de téléchargement de la page index
        """
        self.selenium.find_element(
            By.LINK_TEXT, "Ajout"
        ).click()
        self.assertTrue(self.selenium.current_url.endswith("/recuperateur_reseau_viaire/telecharge_liste_commune"))

    def test_index_bouton_exporter(self):
        """
        Cette méthode va tester le bouton d'exportation de la base de donnée
        """
        self.selenium.find_element(
            By.LINK_TEXT, 'exporter'
        ).click()
        self.assertTrue(self.selenium.current_url.endswith("/recuperateur_reseau_viaire/export/"))

    def test_index_bouton_update_plusieurs_villes_sans_cocher_de_case(self):
        """
        Cette méthode va tester le bouton update qui permet de mettre à jour plusieurs lignes sans cocher de case
        """
        self.selenium.find_element(
            By.XPATH, '//button[@value="update"]'
        ).click()
        self.assertTrue(self.selenium.current_url.
                        find("/recuperateur_reseau_viaire/?bouton=update&csrfmiddlewaretoken=") != -1)
