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


def test_admin_can_create_lecturer_account(driver, url, admin_username, admin_password, restore_database):
    # Administrator (admin@qq.com, password 123) logs in
    driver.maximize_window()
    login(driver, url, admin_username, admin_password)

    # Create a Lecturer account for Mr Lan (mrlan@qq.com, password [123Abc!])
    tab = driver.find_element(By.ID, 'tab_ins_accounts')
    tab.click()
    elem = driver.find_element(By.NAME, 'fullname')
    elem.send_keys('Mr Lan')
    elem = driver.find_element(By.NAME, 'email')
    elem.send_keys('mrlan@qq.com')
    elem = driver.find_element(By.NAME, 'password')
    elem.send_keys('123Abc!!')
    radio_button = driver.find_element(By.NAME, 'type')
    radio_button.click()
    button = driver.find_element(By.NAME, 'create_btn')
    button.click()

    # Log out Admin account
    logout(driver)

    # Log in Lecturer account
    login(driver, url, 'mrlan@qq.com', '123Abc!!')
    elems = driver.find_elements(By.CLASS_NAME, 'nav-link')
    assert '(Lecturer)' in elems[0].text
    assert 'Mr Lan' in elems[0].text
    driver.quit()


def test_lecturer_can_create_course(driver, url, restore_database):
    # Lecturer lanhui@qq.com logs in
    driver.maximize_window()
    login(driver, url, 'lanhui@qq.com', '123')

    # Create a course called CSC1001 Advanced Software Engineering, 2024
    elem = driver.find_element(By.NAME, 'name')
    elem.send_keys('Advanced Software Engineering')
    elem = driver.find_element(By.NAME, 'code')
    elem.send_keys('CSC1001')
    elem = driver.find_element(By.NAME, 'academic')
    elem.send_keys('2004')
    elem = driver.find_element(By.NAME, 'faculty')
    elem.send_keys('School of Computer Science and Technology')
    elem = driver.find_element(By.CLASS_NAME, 'btn-primary')
    elem.click()
    elems = driver.find_elements(By.CLASS_NAME, 'btn-default')
    last_elem = elems[-1]
    assert 'Advanced Software Engineering' in last_elem.text
    assert '(CSC1001)' in last_elem.text

    # Logout
    logout(driver)
    driver.quit()


def test_lecturer_can_post_assignment(driver, url, restore_database):
    # Lecturer lanhui@qq.com logs in
    driver.maximize_window()
    login(driver, url, 'lanhui@qq.com', '123')

    # Create an assignment called Take-home quiz 1 for course (CSC1111) - Project Management
    elem = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, '//div[@class="col-md-8"]/a[1]/div'))
    )
    elem.click()
    elem = driver.find_element(By.NAME, 'deadlinedate')
    elem.send_keys('002024/12/30')
    elem = driver.find_element(By.NAME, 'deadlinetime')
    elem.send_keys('23:59')
    elem = driver.find_element(By.NAME, 'title')
    elem.send_keys('Take-home quiz 1')
    elem = driver.find_element(By.NAME, 'instructions')
    elem.send_keys('This is a closed-book quiz.')
    elem = driver.find_element(By.NAME, 'marks')
    elem.send_keys('10')
    radio_button = driver.find_element(By.NAME, 'type')
    radio_button.click()
    elem = driver.find_element(By.CLASS_NAME, 'btn-primary')
    elem.click()

    # Check if the assignment has been successfully posted
    elem = driver.find_element(By.CLASS_NAME, 'card-title')
    assert 'Take-home quiz 1 (10 Marks, Individual)' in elem.text
    elem = driver.find_element(By.CLASS_NAME, 'text-muted')
    assert 'Deadline: 2024-12-30' in elem.text
    driver.quit()


def test_lecturer_can_add_student_numbers(driver, url, restore_database):
    # Lecturer lanhui@qq.com logs in
    driver.maximize_window()
    login(driver, url, 'lanhui@qq.com', '123')

    # Add ASE student numbers
    student_numbers = '''
    202420781739
    202420781740
    202420781741
    202420781742
    202420781743
    202420781745
    202420581366
    202420581368
    202420581369
    202420581370
    202420581372
    202420581373
    202420581374
    202420581376
    202420581378
    202420581381
    '''
    elem = driver.find_element(By.ID, 'admin_tab')
    elem.click()
    elem = driver.find_element(By.NAME, 'users')
    elem.send_keys(student_numbers)
    elem = driver.find_element(By.ID, 'register_btn')
    elem.click()

    elems = driver.find_elements(By.CSS_SELECTOR, 'p')
    added = 0
    student_lst = [number.strip() for number in student_numbers.strip().split('\n')]
    print(student_lst)
    for student_no in student_lst:
        for elem in elems:
            if student_no in elem.text and 'added' in elem.text:
                added += 1
                break
    assert added == len(student_lst)
    driver.quit()


def test_student_with_valid_student_number_can_sign_up(driver, url, restore_database):
    # Student with recognizable student number 202400000001 can sign up an account
    driver.get(url)
    driver.maximize_window()
    elem = driver.find_element(By.ID, 'signup_link')
    elem.click()
    elem = driver.find_element(By.NAME, 'fullname')
    elem.send_keys('Good Student')
    elem = driver.find_element(By.NAME, 'user_student_id')
    elem.send_keys('202400000001')
    elem = driver.find_element(By.NAME, 'email')
    elem.send_keys('goodstudent@qq.com')
    elem = driver.find_element(By.NAME, 'password')
    elem.send_keys('[123Abc]')
    elem = driver.find_element(By.NAME, 'confirmpassword')
    elem.send_keys('[123Abc]')
    elem = driver.find_element(By.ID, 'signup_btn')
    elem.click()
    logout(driver)

    # Log in Student account
    login(driver, url, '202400000001', '[123Abc]')
    elems = driver.find_elements(By.CLASS_NAME, 'nav-link')
    assert 'Student ID' in elems[0].text
    assert 'Good Student' in elems[0].text
    driver.quit()


def test_student_with_invalid_student_number_cannot_sign_up(driver, url, restore_database):
    # Student with unrecognizable student number cannot sign up an account
    driver.get(url)
    driver.maximize_window()
    elem = driver.find_element(By.ID, 'signup_link')
    elem.click()
    elem = driver.find_element(By.NAME, 'fullname')
    elem.send_keys('Good Student')
    elem = driver.find_element(By.NAME, 'user_student_id')
    elem.send_keys('202400000002')
    elem = driver.find_element(By.NAME, 'email')
    elem.send_keys('goodstudent@qq.com')
    elem = driver.find_element(By.NAME, 'password')
    elem.send_keys('[123Abc]')
    elem = driver.find_element(By.NAME, 'confirmpassword')
    elem.send_keys('[123Abc]')
    elem = driver.find_element(By.ID, 'signup_btn')
    elem.click()

    # Log in Student account
    login(driver, url, '202400000002', '[123Abc]')
    elems = driver.find_elements(By.CLASS_NAME, 'nav-link')
    assert not 'Student ID' in elems[0].text
    assert not 'Good Student' in elems[0].text
    driver.quit()


def test_student_with_weak_password_cannot_sign_up(driver, url, restore_database):
    driver.get(url)
    driver.maximize_window()
    weak_password = '123Abc'
    elem = driver.find_element(By.ID, 'signup_link')
    elem.click()
    elem = driver.find_element(By.NAME, 'fullname')
    elem.send_keys('Good Student')
    elem = driver.find_element(By.NAME, 'user_student_id')
    elem.send_keys('202400000001')
    elem = driver.find_element(By.NAME, 'email')
    elem.send_keys('goodstudent@qq.com')
    elem = driver.find_element(By.NAME, 'password')
    elem.send_keys(weak_password)
    elem = driver.find_element(By.NAME, 'confirmpassword')
    elem.send_keys(weak_password)
    elem = driver.find_element(By.ID, 'signup_btn')
    elem.click()

    # Log in Student account
    login(driver, url, '202400000001', weak_password)
    elems = driver.find_elements(By.CLASS_NAME, 'nav-link')
    assert not 'Student ID' in elems[0].text
    assert not 'Good Student' in elems[0].text
    driver.quit()


def test_student_can_join_course(driver, url, restore_database):
    # Student can join (CSC1111) - Project Management
    login(driver, url, '201825800050', '123')
    driver.maximize_window()

    # Search for CSC1111
    elem = driver.find_element(By.NAME, 'search')
    elem.send_keys('CSC1111')
    elem = driver.find_element(By.CLASS_NAME, 'btn-primary')
    elem.click()
    elems = driver.find_elements(By.CLASS_NAME, 'btn-default')
    assert 'CSC1111' in elems[0].text

    # Join
    elem = driver.find_element(By.CLASS_NAME, 'btn-success') # find the green Join button
    elem.click()

    # Log out, then log in to check the course-joining status
    logout(driver)
    login(driver, url, '201825800050', '123')
    elems = driver.find_elements(By.CLASS_NAME, 'btn-default')
    assert 'CSC1111' in elems[0].text
    assert 'Project Management' in elems[0].text
    assert 'Joined' in elems[0].text


def test_student_can_submit_assignment(driver, url, restore_database):
    ''' Note: Make sure the fields Posted_Date and Deadline in the second row of lab_reports_table are in the current year'''
    # Student can submit assignment for CSC1111
    login(driver, url, '201825800050', '123')
    driver.maximize_window()

    # Enter into the course and the find the assignment
    elems = driver.find_elements(By.CLASS_NAME, 'btn-default')
    elems[1].click()

    elem = driver.find_element(By.XPATH, '//div[@id="menu1"]/div/div/p/a[text()="Submit"]') # find the submit button
    elem.click()

    # Fill submission title, attach file, and submit
    elem = driver.find_element(By.NAME, 'title')
    elem.send_keys('Assignment submission from Mohamed')
    elem = driver.find_element(By.NAME, 'attachment1')
    elem.send_keys('/home/mrlan/Downloads/test/SeleniumHui/helper.py') # attach a file
    elem = driver.find_element(By.XPATH, '//form/button')
    elem.click()

    # Go the Submitted tab
    elem = driver.find_element(By.ID, 'myTab')
    elems = elem.find_elements(By.CLASS_NAME, 'nav-link')
    elems[2].click()

    elem = driver.find_element(By.XPATH, '//div[@id="menu3"]/div')
    assert 'Reading 2 (6 Marks)' in elem.text
    assert 'SUBMITTED' in elem.text
    assert 'helper.py' in elem.text


def test_student_can_request_remarking(driver, url, restore_database):
    # Student logs in
    login(driver, url, '201825800050', '123')
    driver.maximize_window()

    # Enter into the course
    elems = driver.find_elements(By.CLASS_NAME, 'btn-default')
    elems[1].click()

    # Go the Marked tab
    elem = driver.find_element(By.ID, 'myTab')
    elems = elem.find_elements(By.CLASS_NAME, 'nav-link')
    elems[3].click()

    # Send remarking request
    remarking_buttons = driver.find_elements(By.CLASS_NAME, 'btn-light')
    remarking_buttons[0].click()
    alert = driver.switch_to.alert
    alert.send_keys('I need higher marks, teacher.')
    alert.accept()

    elem = driver.find_element(By.XPATH, '//div[@id="menu4"]/div/div/p/span')
    assert 'Remarking request sent' == elem.text


def test_lecturer_can_mark_assignment(driver, url, restore_database):
    # Lecturer lanhui@qq.com logs in
    driver.maximize_window()
    login(driver, url, 'lanhui@qq.com', '123')

    # Enter into the course and the find the assignment
    elem = driver.find_element(By.XPATH, '//div[1]/a[3]/div') # course Software Engineering
    elem.click()

    elem = driver.find_element(By.XPATH, '//div[2]/div[2]/div/a[2]') # View link
    elem.click()

    elem = driver.find_element(By.CLASS_NAME, 'btn-primary') # Blue Mark button
    elem.click()

    # Submit mark and comment
    elem = driver.find_element(By.NAME, 'marks')
    elem.send_keys('1')
    elem = driver.find_element(By.NAME, 'feedback')
    elem.send_keys('Inadequate')
    form = driver.find_element(By.ID, 'submit-form')
    form.submit()

    elem = driver.find_element(By.ID, 'myTab')
    elems = elem.find_elements(By.CLASS_NAME, 'nav-link')
    assert 'Marked submissions (1)' == elems[1].text
    elems[1].click()
    elem = driver.find_element(By.XPATH, "//div[@id='menu2']/div/b")
    assert 'Reading 1 submission' in elem.text


def test_lecturer_cannot_see_tas_not_from_his_course(driver, url, restore_database):
    # Lecturer lanhui@qq.com logs in
    driver.maximize_window()
    login(driver, url, 'peter@qq.com', '123')

    elem = driver.find_element(By.ID, 'admin_tab')
    elem.click()
    tab = driver.find_element(By.ID, 'existing_accounts_tab')
    tab.click()
    elem = driver.find_element(By.ID, 'tab-existing-accounts')
    assert 'No TA' in elem.text

    # Logout
    logout(driver)
    driver.quit()