import requests
import string
import random


def randomString(len=10):
    """Generate a random string of fixed length"""
    letters = string.ascii_lowercase
    return "".join(random.choice(letters) for i in range(len))


# Defined once per test run
username = randomString()
projectName = randomString()

# The base URL of the API
base_url = "http://localhost:8080"

# Endpoint to test
registerPath = base_url + "/api/register"
loginPath = base_url + "/api/login"
addProjectPath = base_url + "/api/project"
submitReportPath = base_url + "/api/submitReport"
getWeeklyReportPath = base_url + "/api/getWeeklyReport"


# Posts the username and password to the register endpoint
def register(username: string, password: string):
    print("Registering with username: ", username, " and password: ", password)
    response = requests.post(
        registerPath, json={"username": username, "password": password}
    )
    print(response.text)
    return response


# Posts the username and password to the login endpoint
def login(username: string, password: string):
    print("Logging in with username: ", username, " and password: ", password)
    response = requests.post(
        loginPath, json={"username": username, "password": password}
    )
    print(response.text)
    return response


def test_login():
    response = login(username, "always_same")
    assert response.status_code == 200, "Login failed"
    print("Login successful")
    return response.json()["token"]


def test_create_user():
    response = register(username, "always_same")
    assert response.status_code == 200, "Registration failed"
    print("Registration successful")


def test_add_project():
    loginResponse = login(username, "always_same")
    token = loginResponse.json()["token"]
    response = requests.post(
        addProjectPath,
        json={"name": projectName, "description": "This is a project"},
        headers={"Authorization": "Bearer " + token},
    )
    print(response.text)
    assert response.status_code == 200, "Add project failed"
    print("Add project successful")


def test_submit_report():
    token = login(username, "always_same").json()["token"]
    response = requests.post(
        submitReportPath,
        json={
            "projectName": projectName,
            "week": 1,
            "developmentTime": 10,
            "meetingTime": 5,
            "adminTime": 5,
            "ownWorkTime": 10,
            "studyTime": 10,
            "testingTime": 10,
        },
        headers={"Authorization": "Bearer " + token},
    )
    print(response.text)
    assert response.status_code == 200, "Submit report failed"
    print("Submit report successful")

def test_get_weekly_report():
    token = login(username, "always_same").json()["token"]
    response = requests.get(
        getWeeklyReportPath,
        headers={"Authorization": "Bearer " + token},
        params={"username": username, "projectName": projectName , "week": 1}
    )
    print(response.text)

if __name__ == "__main__":
    test_create_user()
    test_login()
    test_add_project()
    test_submit_report()
    test_get_weekly_report()