from helper import login, logout
import time
import pytest
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select

def test_attempt_recovery_with_unanswered_security_questions(driver, url, restore_database):
    # Student goodstd@qq.com with no answered questions
    driver.get(url)
    driver.maximize_window()
    
    elem = driver.find_element(By.ID, 'goRecover')
    elem.click()
    elem = driver.find_element(By.NAME, 'email')
    elem.send_keys("goodstd@qq.com")
    elem = driver.find_element(By.ID, 'rec')
    elem.click()
    
    wait = WebDriverWait(driver, 10)
    alert_elem = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "alert-warning")))
    assert "no security questions found for this user." in alert_elem.text.lower() 
 
    driver.quit()

def test_set_security_questions(driver, url, restore_database):
    # Student goodstd@qq.com logs in
    driver.get(url)
    driver.maximize_window()
    login(driver, url, 'goodstd@qq.com', '[123Abc]')
    question1 = driver.find_element(By.ID, 'security_question1')
    question2 = driver.find_element(By.ID, 'security_question2')
    select_question1 = Select(question1)
    select_question1.select_by_index(1)
    select_question2 = Select(question2)
    select_question2.select_by_index(2)
    answer1 = driver.find_element(By.ID, 'security_answer1')
    answer1.send_keys("mImI")
    answer2 = driver.find_element(By.ID, 'security_answer2')
    answer2.send_keys("TitaNic")
    submit_button = driver.find_element(By.ID, 'submit_recovery')
    submit_button.click() 
    
    # Assertion: Check if password recovery confirmation or success message appears
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'alertgood')))
    recovery_success = driver.find_element(By.ID, 'alertgood')
    assert recovery_success.is_displayed(), "Password recovery failed or confirmation message not displayed."
    
    logout(driver)
    
    #Log in Student account
    login(driver, url, 'goodstd@qq.com', '[123Abc]')
    elems = driver.find_elements(By.CLASS_NAME, 'nav-link')
    assert 'Student ID' in elems[0].text
    assert 'Good Std' in elems[0].text 
    
    driver.quit()


def test_password_recover_wrong_answers(driver, url, restore_database):
    # Student goodstd2@qq.com recover password --> wrong answers
    driver.get(url)
    driver.maximize_window()
    elem = driver.find_element(By.ID, 'goRecover')
    elem.click()
    elem = driver.find_element(By.NAME, 'email')
    elem.send_keys("goodstd2@qq.com")
    elem = driver.find_element(By.ID, 'rec')
    elem.click()
    elem = driver.find_element(By.NAME, 'answer1')
    elem.send_keys("wrong")
    elem = driver.find_element(By.NAME, 'answer2')
    elem.send_keys("wrong")
    elem = driver.find_element(By.ID, 'sub')
    elem.click()
    
    driver.quit()
    
def test_recover_password_with_weak_password(driver, url, restore_database):
    driver.get(url)
    driver.maximize_window()
    elem = driver.find_element(By.ID, 'goRecover')
    elem.click()
    elem = driver.find_element(By.NAME, 'email')
    elem.send_keys("goodstd2@qq.com")
    elem = driver.find_element(By.ID, 'rec')
    elem.click()
    elem = driver.find_element(By.NAME, 'answer1')
    elem.send_keys("Wenzhou")
    elem = driver.find_element(By.NAME, 'answer2')
    elem.send_keys("HotPot")
    elem = driver.find_element(By.ID, 'sub')
    elem.click()
    elem = driver.find_element(By.NAME, 'new_password')
    elem.send_keys("123")
    elem = driver.find_element(By.NAME, 'confirm_password')
    elem.send_keys("123")
    elem = driver.find_element(By.ID, "butt")
    elem.click()
    
    wait = WebDriverWait(driver, 10)
    alert_elem = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "alert-danger")))
    assert "password must be at least 8 characters long and include uppercase and lowercase letters, numbers, and special characters." in alert_elem.text.lower() 
    
    driver.quit()

def test_recover_password_successfully(driver, url, restore_database):
    # Student goodstd2@qq.com recover password ---> correct answers
    driver.get(url)
    driver.maximize_window()
    elem = driver.find_element(By.ID, 'goRecover')
    elem.click()
    elem = driver.find_element(By.NAME, 'email')
    elem.send_keys("goodstd2@qq.com")
    elem = driver.find_element(By.ID, 'rec')
    elem.click()
    elem = driver.find_element(By.NAME, 'answer1')
    elem.send_keys("wenzhou")
    elem = driver.find_element(By.NAME, 'answer2')
    elem.send_keys("hotpot")
    elem = driver.find_element(By.ID, 'sub')
    elem.click()
    elem = driver.find_element(By.NAME, 'new_password')
    elem.send_keys("123Abc!!")
    elem = driver.find_element(By.NAME, 'confirm_password')
    elem.send_keys("123Abc!!")
    elem = driver.find_element(By.ID, "butt")
    elem.click()
    
    #Log in Student account
    login(driver, url, 'goodstd2@qq.com', '123Abc!!')
    elems = driver.find_elements(By.CLASS_NAME, 'nav-link')
    assert 'Student ID' in elems[0].text
    assert 'Good Std2' in elems[0].text    
    driver.quit()

def test_recovery_invalid_user_cannot_recover(driver, url, restore_database):
    # Unrecognizable user cannot recover
    driver.get(url)
    driver.maximize_window()
    elem = driver.find_element(By.ID, 'goRecover')
    elem.click()
    elem = driver.find_element(By.NAME, 'email')
    elem.send_keys("goodstd3@qq.com")
    elem = driver.find_element(By.ID, 'rec')
    elem.click()
    
    wait = WebDriverWait(driver, 10)
    alert_elem = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "alert-danger")))
    assert "email address is not recognized." in alert_elem.text.lower()
   
    driver.quit()