import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import UnexpectedAlertPresentException, NoAlertPresentException, \
    ElementClickInterceptedException, NoSuchElementException, TimeoutException
from helper import signup


def is_textarea_empty(driver):
    # 获取<textarea>元素的内容,判断是否加入了生词
    textarea_element = driver.find_element(By.ID, 'selected-words')
    content = textarea_element.get_attribute("value")

    return content is None or content.strip() == ""


def get_user_level(driver):
    return float(driver.find_element(By.ID, 'user_level').text)


def scroll(total_time, driver):
    try:
        half_time = (total_time - 2) / 2  # 分成两半,一半时间滚到底,一半时间滚回顶,模拟阅读时间

        # 滚动到底部
        start_time = time.time()
        end_time = start_time + half_time
        while time.time() < end_time:
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        # 确保滚动更平滑
        time.sleep(1)

        # 滚动回顶部
        start_time = time.time()
        end_time = start_time + half_time
        while time.time() < end_time:
            driver.execute_script("window.scrollTo(0, -document.body.scrollHeight);")
        time.sleep(1)

    except ElementClickInterceptedException:
        print("加载出错")


def read_test_with_time(driver, total_time):
    # 获取点击前的user_level和text_level
    before_user_level = get_user_level(driver)
    before_text_level = float(driver.find_element(By.ID, 'text_level').text)

    # 检查是否加入了生词簿
    check = is_textarea_empty(driver)

    scroll(total_time, driver)
    # 定位“下一页”按钮
    next_button = driver.find_element(By.ID, 'load_next_article')
    # 模拟点击
    next_button.click()

    # 关闭弹窗
    try:
        WebDriverWait(driver, 1).until(EC.alert_is_present())
        driver.switch_to.alert.accept()
    except (UnexpectedAlertPresentException, NoAlertPresentException):
        pass

    # 等待页面加载完毕,正确地获取更新后的值
    time.sleep(2)

    # 获取点击后的user_level
    after_user_level = get_user_level(driver)

    # 等待3秒方便观察测试
    time.sleep(3)

    return before_user_level, after_user_level, before_text_level, check


def test_score_with_enough_time(driver, URL):
    try:
        # 登录并跳转到测试主页面
        signup(URL, driver)
        # 测试阅读到足够时间的等级变化
        before_user_level, after_user_level, before_text_level, check = read_test_with_time(driver, 18)

        # print(check, before_user_level, after_user_level, before_text_level)

        if before_user_level < before_text_level and check:
            assert before_user_level < after_user_level, 'The user level dose not increase after reading an article with a high level and clicking to navigate away without adding any new vocabulary. '


    except (NoSuchElementException, TimeoutException) as e:
        print("Error occurs: " + str(e))

    finally:
        driver.quit()


def test_score_without_enough_time(driver, URL):
    try:
        # 登录并跳转到测试主页面
        signup(URL, driver)
        # 测试阅读时间不足够的等级变化
        before_user_level, after_user_level, before_text_level, check = read_test_with_time(driver, 6)

        # print(check, before_user_level, after_user_level, before_text_level)

        if before_user_level < before_text_level and check:
            assert before_user_level == after_user_level, 'After the user quickly skipped through the article, the user level does not remain unchanged. '

    except (NoSuchElementException, TimeoutException) as e:
        print("Error occurs: " + str(e))

    finally:
        driver.quit()