/**
* This file acts as an abstraction layer to the server.
*/

async function performRegisterPlayerRequest(name, password){
    return fetch("/player/register/" + name, { method: 'POST',  body: password })
    .then(convertServerResponse)
}

async function performDeletePlayerRequest(name, password){
    return fetch("/player/delete/" + name, { method: 'POST',  body: password })
    .then(convertServerResponse)
    .then(function(value) {})
}

async function performLoginPlayerRequest(name, password) {
    return fetch("/player/login/" + name, { method: 'POST',  body: password })
    .then(convertServerResponse)
}

async function performLogoutRequest(token) {
    return fetch("/player/logout", { method: 'POST',  body: token })
    .then(convertServerResponse)
    .then(function(value) {})
}

async function resumeSessionRequest(token) {
    return fetch("/player/resume", { method: 'POST',  body: token })
    .then(convertServerResponse)
}

async function performGetCurrentTableRequest(token) {
    return fetch("player/table", { method: 'POST',  body: token })
    .then(convertServerResponse)
    .then(convertJsonResponse)
}

async function performCreateTableRequest(token, name, visibility) {
    const vis = visibility ? "public" : "private";
    return fetch("/table/create/" + vis + "/" + name, { method: 'POST',  body: token })
    .then(convertServerResponse)
    .then(convertJsonResponse)
}

async function performJoinTableRequest(tableId, token) {
    return fetch("/table/join/" + tableId, { method: 'POST',  body: token })
    .then(convertServerResponse)
    .then(convertJsonResponse)
}

async function performGetPublicTablesRequest(token) {
    return fetch("/tables/public", { method: 'POST',  body: token })
    .then(convertServerResponse)
    .then(convertJsonResponse)
}

async function performLeaveTableRequest(token) {
    return fetch("/table/leave", { method: 'POST',  body: token })
    .then(convertServerResponse)
    .then(function(value) {})
}

async function performPlayerActionRequest(token, action) {
    return fetch("/player/action/" + action, { method: 'POST',  body: token })
    .then(convertServerResponse)
}

async function performPlayCardRequest(token, card) {
    return fetch("/player/card/" + card, { method: 'POST',  body: token })
    .then(convertServerResponse)
    .then(function(value) {})
}

function convertServerResponse(response) {
    switch (response.status) {
        case 200: // Success
        return response.text()
        case 400: // Bad request
        throw Error("The request was malformed")
        case 401: // Unauthorized (Invalid session token)
        throw Error("Please log in again")
        case 403: // Forbidden
        throw Error("Invalid username or password")
        case 410: // Gone
        throw Error("The table could not be found")
        case 406: // notAcceptable
        throw Error("The password or name is too long")
        case 409: // Conflict
        throw Error("A user with the same name is already registered")
        case 417: // Expectation failed
        throw Error("The table is already full and can't be joined")
        case 424: // Failed dependency
        throw Error("The request couldn't be completed")
        default: 
        throw Error("Unexpected response: " + response.statusText)
    }
}

function convertJsonResponse(text) {
    if (text == "") {
        return null;
    }
    console.log(text)
    return JSON.parse(text);
}