import logging as log
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.options import Options
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

debug = True

def slip(secondes):
    if debug:
        time.sleep(secondes)


def element_visible_actif(elem):
    assert elem.is_displayed()
    assert elem.is_enabled()




def writeInInput(inputElement, text):
    assert inputElement.is_displayed(), "Le champ texte n'est pas affiché"
    assert inputElement.is_enabled(), "Le champ texte n'est pas activé"
    inputElement.clear()
    inputElement.send_keys(text)


@pytest.mark.skip("Je veux pas le faire")
def test_loginOK():
    log.info("Test du Login avec succès")
    options = webdriver.FirefoxOptions()
    options.add_argument('--headless')

    driver = webdriver.Firefox(options=options)
    
    driver.get("https://www.saucedemo.com/")
    assert driver.current_url == "https://www.saucedemo.com/", "Nous ne somme pas sur la bonne page"

    username = driver.find_element(By.ID,"user-name")
    password = driver.find_element(By.ID,"password")
    login = driver.find_element(By.ID, "login-button")

    writeInInput(inputElement=username, text="standard_user")
    writeInInput(password, text="secret_sauce")
    login.click()

    assert driver.current_url == "https://www.saucedemo.com/inventory.html", "Nous ne somme pas sur la bonne page"

    driver.quit()

@pytest.mark.skip("JE VEUX PAS LE FAIRE")
def test_login_KO_saucedemo():

    options = webdriver.FirefoxOptions()
    options.add_argument('--headless')

    driver = webdriver.Firefox(options=options)
    url_sauce_demo="https://www.saucedemo.com/"
    titre_page="Swag Labs"

    driver.get(url_sauce_demo)
    log.info("Le titre de la page" + driver.title)
    log.info("L'URL de la page " + driver.current_url)
    assert driver.current_url==url_sauce_demo, "L'url de la page ouverte ("+ driver.current_url+") n'est pas égal à "+url_sauce_demo
    assert driver.title==titre_page, "Le titre de la page ("+driver.title+") n'est pas égal à " + titre_page

    champ_username = driver.find_element(By.XPATH,'//*[@id="user-name"]')
    log.info(champ_username)
    champ_username.send_keys("user565")
    log.info("texte du champ username"+champ_username.text) 
    log.info("L'attribut du champ username est "+ champ_username.get_attribute("placeholder") )
    assert champ_username.get_attribute("value")!="standard_user"

    champ_mdp = driver.find_element(By.CSS_SELECTOR,'#password')
    champ_mdp.send_keys("password")
   # champ_mdp.send_keys(Keys.RETURN)
    button_login = driver.find_element(By.ID,"login-button")
    button_login.click()
    assert driver.current_url==url_sauce_demo, "l'url de la page ouverte ("+ driver.current_url + ") n'est  pas égal à " + url_sauce_demo

    message_erreur = driver.find_element(By.CSS_SELECTOR, "[data-test=error]")
    assert message_erreur.is_displayed(),"Le message d'erreur n'est pas affiché"
    assert message_erreur.text ==  "Epic sadface: Username and password do not match any user in this service"
    slip(5)
    driver.quit()

@pytest.mark.skip("JE VEUX PAS LE FAIRE")
def test_login_OK_logout_saucedemo():

    options = webdriver.FirefoxOptions()
    options.add_argument('--headless')

    driver = webdriver.Firefox(options=options)
    #driver.implicitly_wait(15)
    wait = WebDriverWait(driver,15)

    url_sauce_demo="https://www.saucedemo.com/"
    titre_page="Swag Labs"

    driver.get(url_sauce_demo)
    log.info("Le titre de la page" + driver.title)
    log.info("L'URL de la page " + driver.current_url)
    assert driver.current_url==url_sauce_demo, "L'url de la page ouverte ("+ driver.current_url+") n'est pas égal à "+url_sauce_demo
    assert driver.title==titre_page, "Le titre de la page ("+driver.title+") n'est pas égal à " + titre_page

    champ_username = driver.find_element(By.XPATH,'//*[@id="user-name"]')

    log.info(champ_username)
    champ_username.send_keys("standard_user")
    log.info("texte du champ username"+champ_username.text) 
    log.info("L'attribut du champ username est "+ champ_username.get_attribute("placeholder") )
    assert champ_username.get_attribute("value")=="standard_user"

    champ_mdp = driver.find_element(By.CSS_SELECTOR,'#password')
    champ_mdp.send_keys("secret_sauce")
   # champ_mdp.send_keys(Keys.RETURN)
    button_login = driver.find_element(By.ID,"login-button")
    element_visible_actif(button_login)
    button_login.click()
    assert driver.current_url=="https://www.saucedemo.com/inventory.html", "l'url de la page ouverte ("+ driver.current_url + ") n'est pas égal à https://www.saucedemo.com/inventory.html" 
    
    button_burger= driver.find_element(By.ID,"react-burger-menu-btn")
    element_visible_actif(button_burger)
    button_burger.click()
   
    #button_logout= driver.find_element(By.ID,"logout_sidebar_link")

    try:
        button_logout=wait.until(EC.element_to_be_clickable((By.ID,"logout_sidebar_link")))
    except TimeoutException:
        log.error("Erreur dans l'attennte explicite")
    
    #element_visible_actif(button_logout) #ça fonctionne pas très bien
    button_logout.click()
    assert driver.current_url==url_sauce_demo, "L'url de la page ouverte ("+ driver.current_url+") n'est pas égal à "+url_sauce_demo


    slip(2)
    driver.quit()

@pytest.mark.skip("JE VEUX PAS LE FAIRE")
def test_ajout_panier():
    
    options = webdriver.FirefoxOptions()
    options.add_argument('--headless')

    driver = webdriver.Firefox(options=options)
    
    #driver=webdriver.Chrome()
    url_sauce_demo="https://www.saucedemo.com/"



    driver.get(url_sauce_demo)

    champ_username = driver.find_element(By.XPATH,'//*[@id="user-name"]')

    log.info(champ_username)
    champ_username.send_keys("standard_user")
    log.info("texte du champ username"+champ_username.text) 
    log.info("L'attribut du champ username est "+ champ_username.get_attribute("placeholder") )
    assert champ_username.get_attribute("value")=="standard_user"

    champ_mdp = driver.find_element(By.CSS_SELECTOR,'#password')
    champ_mdp.send_keys("secret_sauce")
   # champ_mdp.send_keys(Keys.RETURN)
    button_login = driver.find_element(By.ID,"login-button")
    element_visible_actif(button_login)
    button_login.click()
    assert driver.current_url=="https://www.saucedemo.com/inventory.html", "l'url de la page ouverte ("+ driver.current_url + ") n'est pas égal à https://www.saucedemo.com/inventory.html" 
    button_add=driver.find_element(By.ID,"add-to-cart-sauce-labs-backpack")
    button_add.click()
    button_panier=driver.find_element(By.CLASS_NAME,"shopping_cart_link")
    button_panier.click()

    slip(2)
    driver.quit()

def exists_element_by_class(driver, class_elt):
    try:
        driver.find_element(By.CLASS_NAME,class_elt)
    except:
        return False
    return True

#@pytest.mark.skip("JE VEUX PAS LE FAIRE")
def test_click_button_add_to_cart():
    log.info('Test sur le bouton "add to cart" change pour "remove" quand on clic dessus + bouton panier s\'incrémente')
    options = webdriver.FirefoxOptions()
    options.add_argument('--headless')
    driver = webdriver.Firefox(options=options)
    
    # driver=webdriver.Chrome()

    url_sauce_demo = "https://www.saucedemo.com/"
    driver.get(url_sauce_demo)
    
    # Vérification login
    champ_username = driver.find_element(By.XPATH,'//*[@id="user-name"]')
    champ_username.send_keys("standard_user")
    assert champ_username.get_attribute("value") == "standard_user"
    champ_mdp = driver.find_element(By.CSS_SELECTOR,'#password')
    champ_mdp.send_keys("secret_sauce")
    button_login = driver.find_element(By.ID,"login-button")
    element_visible_actif(button_login)
    button_login.click()
    assert driver.current_url == "https://www.saucedemo.com/inventory.html", "l'url de la page ouverte ("+ driver.current_url + ") n'est pas égal à https://www.saucedemo.com/inventory.html" 

    # Récupérer état button "cart" : s'il a un badge récupérer le n° d'articles ajoutés, sinon n° article =0
    nb_product_initial = 0
    if exists_element_by_class(driver,"add-to-cart-sauce-labs-backpack") and exists_element_by_class(driver,"shopping_cart_badge"):
        badge_panier = driver.find_element(By.CLASS_NAME,"shopping_cart_badge")
        nb_product_initial = badge_panier.text
    log.info(f"à la connexion, il y a {nb_product_initial} dans le panier")
    slip(2)

    # Vérification clic button "add to cart" change de texte vers "remove"
    button_add = driver.find_element(By.ID,"add-to-cart-sauce-labs-backpack")
    button_add.click()
    badge_panier = driver.find_element(By.CLASS_NAME,"shopping_cart_badge")
    log.info(f"à l'ajout d'un article', il y a {badge_panier.text} dans le panier")
    slip(2)
    assert False == exists_element_by_class(driver,"add-to-cart-sauce-labs-backpack")
    assert True == exists_element_by_class(driver,"remove-sauce-labs-backpack")
    # et que le button "cart" a un badge avec n° incrémenté
    assert str(nb_product_initial+1) == badge_panier.text

    # Vérification clic button "remove" change de texte vers "add to cart"
    log.info("click sur 'add to cart' change button and add a badge on icon cart")

    # Vérification button "cart" a un badge avec n° incrémenté ou supprimé si de 1 à 0

    slip(2)
    driver.quit()