import requests
import string
import random
import json

# Helper function for the TTime API testing suite

# For style guide, see:
# https://peps.python.org/pep-0008/#function-and-variable-names
# https://google.github.io/styleguide/pyguide.html#316-naming

##################
## Static Paths ##
##################

base_url = "http://localhost:8080"

registerPath = base_url + "/api/register"
loginPath = base_url + "/api/login"
addProjectPath = base_url + "/api/project"
submitReportPath = base_url + "/api/submitWeeklyReport"
getWeeklyReportPath = base_url + "/api/getWeeklyReport"
getProjectPath = base_url + "/api/project"
signReportPath = base_url + "/api/signReport"
addUserToProjectPath = base_url + "/api/addUserToProject"
promoteToAdminPath = base_url + "/api/promoteToAdmin"
getUserProjectsPath = base_url + "/api/getUserProjects"
getWeeklyReportsUserPath = base_url + "/api/getWeeklyReportsUser"
checkIfProjectManagerPath = base_url + "/api/checkIfProjectManager"
ProjectRoleChangePath = base_url + "/api/ProjectRoleChange"
getUsersProjectPath = base_url + "/api/getUsersProject"
getUnsignedReportsPath = base_url + "/api/getUnsignedReports"
getChangeUserNamePath = base_url + "/api/changeUserName"
getUpdateWeeklyReportPath = base_url + "/api/updateWeeklyReport"
removeProjectPath = base_url + "/api/removeProject"
promoteToPmPath = base_url + "/api/promoteToPm"

debug_output = True


def gprint(*args, **kwargs):
    print("\033[92m", *args, "\033[00m", **kwargs)


def dprint(*args, **kwargs):
    if debug_output:
        print(*args, **kwargs)


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))


############ ############ ############ ############ ############


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


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


# Register a user and return the token
def register_and_login(username: string, password: string) -> string:
    register(username, password)
    response = login(username, password)
    return response.json()["token"]


def create_project(
    token: string, project_name: string, description: string = "Test description"
):
    dprint("Creating project with name: ", project_name)
    response = requests.post(
        addProjectPath,
        headers={"Authorization": "Bearer " + token},
        json={"name": project_name, "description": description},
    )
    dprint(response.text)
    return response


# Add a user to a project, requires the user withing the token to be a project manager of said project
def addToProject(token: string, username: string, project_name: string):
    dprint("Adding user with username: ", username, " to project: ", project_name)
    response = requests.put(
        addUserToProjectPath + "/" + project_name,
        headers={"Authorization": "Bearer " + token},
        params={"userName": username},
    )
    dprint(response.text)
    return response


def promoteToManager(token: string, username: string, project_name: string):
    dprint(
        "Promoting user with username: ",
        username,
        " to project manager of project: ",
        project_name,
    )
    response = requests.put(
        promoteToPmPath + "/" + project_name,
        headers={"Authorization": "Bearer " + token},
        params={"userName": username},
    )
    dprint(response.text)
    return response


def submitReport(token: string, report):
    dprint("Submitting report: ", report)
    response = requests.post(
        submitReportPath,
        json=report,
        headers={"Authorization": "Bearer " + token},
    )
    return response


def getReport(token: string, username: string, projectName: string):
    # Retrieve the report ID
    response = requests.get(
        getWeeklyReportPath,
        headers={"Authorization": "Bearer " + token},
        params={"username": username, "projectName": projectName, "week": 1},
    )
    return response.json()


def signReport(project_manager_token: string, report_id: int):
    return requests.put(
        signReportPath + "/" + str(report_id),
        headers={"Authorization": "Bearer " + project_manager_token},
    )