import { injectNavbar } from '../modules/Navbar.js';
import { toast } from '../modules/Toast.js';
import { XHRUtility } from '../modules/XHRUtility.js';
import { UserUtility } from '../modules/UserUtility.js';
import { globals } from '../config/globals.js';

const join = () => {
    injectNavbar();
    const splitUrl = window.location.pathname.split('/join/');
    const accessCode = splitUrl[1];
    if (/^[a-zA-Z0-9]+$/.test(accessCode) && accessCode.length === globals.ACCESS_CODE_LENGTH) {
        document.getElementById('game-code').innerText = accessCode;
        document.getElementById('game-time').innerText =
            decodeURIComponent((new URL(document.location)).searchParams.get('timer'));
        document.getElementById('game-player-count').innerText =
            decodeURIComponent((new URL(document.location)).searchParams.get('playerCount')) + ' Players';
        const form = document.getElementById('join-game-form');
        form.onsubmit = joinHandler;
    } else {
        window.location = '/not-found?reason=' + encodeURIComponent('invalid-access-code');
    }
};

const joinHandler = (e) => {
    const splitUrl = window.location.pathname.split('/join/');
    const accessCode = splitUrl[1];
    e.preventDefault();
    const name = document.getElementById('player-new-name').value;
    if (validateName(name)) {
        document.getElementById('join-game-form').onsubmit = null;
        document.getElementById('submit-new-name').classList.add('submitted');
        document.getElementById('submit-new-name').setAttribute('value', 'Joining...');
        XHRUtility.xhr(
            '/api/games/' + accessCode + '/players',
            'PATCH',
            null,
            JSON.stringify({
                playerName: name,
                accessCode: accessCode,
                sessionCookie: UserUtility.validateAnonUserSignature(globals.ENVIRONMENT.LOCAL),
                localCookie: UserUtility.validateAnonUserSignature(globals.ENVIRONMENT.PRODUCTION)
            })
        )
            .then((res) => {
                const json = JSON.parse(res.content);
                UserUtility.setAnonymousUserId(json.cookie, json.environment);
                window.location = '/game/' + accessCode;
            }).catch((res) => {
                document.getElementById('join-game-form').onsubmit = joinHandler;
                document.getElementById('submit-new-name').classList.remove('submitted');
                document.getElementById('submit-new-name').setAttribute('value', 'Join Game');
                if (res.status === 404) {
                    toast('This game was not found.', 'error', true, true, 'long');
                } else if (res.status === 400) {
                    toast('This name is already taken.', 'error', true, true, 'long');
                } else if (res.status >= 500) {
                    toast(
                        'The server is experiencing problems. Please try again later',
                        'error',
                        true
                    );
                }
            });
    } else {
        toast('Name must be between 1 and 30 characters.', 'error', true, true, 'long');
    }
};

function validateName (name) {
    return typeof name === 'string' && name.length > 0 && name.length <= 30;
}

if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
    module.exports = join;
} else {
    join();
}
