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


# test case: user can request a password reset link by providing a valid email address
def test_user_can_request_password_reset_link(driver, url: str, restore_database: None):
    driver.maximize_window()

    # # Navigate to forgot password page
    driver.get(f"{url}/index.php")
    button = driver.find_element(By.ID, "recover_password_link")
    button.click()
    # Enter valid email and request reset link
    elem = driver.find_element(By.NAME, "email")
    elem.send_keys(
        "amanaf1994@gmail.com"
    )  # Ensure this email exists in the test database
    button = driver.find_element(By.ID, "recover_password_link_in_recover_password")
    button.click()
    # Wait for the success message indicating the token is generated and the reset link was sent containing the token
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "email_sent_success_message"))
    )

    success_message = driver.find_element(By.ID, "email_sent_success_message").text
    assert "We've sent a password reset link to your email address." in success_message
    driver.quit()


def test_user_can_reset_password(driver, url: str, restore_database: None):
    # Assuming a valid token is already generated and stored for the test user, we can't check it in db,
    # because we don't want the test to be dependent on the db
    token = "12b1f0bc8b7d57449e0df5ad8860e8084a4a5cfaad3e2eb97a4e5d3855ee4f6c"
    driver.maximize_window()
    driver.get(f"{url}/UpdatePassword.php?token={token}")

    # Check if the password reset form is displayed
    form = driver.find_element(By.ID, "update_password_form")
    assert form is not None

    # Enter new password
    new_password = "NewPassword123!"  # New password
    elem = driver.find_element(By.NAME, "password")
    elem.send_keys(new_password)

    # Confirm the new password
    elem = driver.find_element(By.NAME, "confirmpassword")
    elem.send_keys(new_password)

    # Submit the form to reset the password
    button = driver.find_element(By.ID, "update_password_btn")
    button.click()

    # Wait for the success message indicating the password has been reset
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "password_update_success_message"))
    )

    success_message = driver.find_element(By.ID, "password_update_success_message").text
    assert "Your password has been reset." in success_message

    # # Now, try logging in with the new password
    login(driver, url, "amanaf1994@gmail.com", new_password)

    # Verify that the user is logged in
    elems = driver.find_elements(By.CLASS_NAME, "nav-link")
    assert (
        "Student ID:" in elems[0].text
    )  # Ensure the Student ID appears in the navigation

    driver.quit()