async function sha256(text) {
    const encoder = new TextEncoder();
    const data = encoder.encode(text);
    const hashBuffer = await crypto.subtle.digest('SHA-256', data);
    const hashArray = Array.from(new Uint8Array(hashBuffer));
    return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
}

const inputs = Array.from(grilleForm.querySelectorAll('input[type="text"]'));
let largeur = Number(colonnes.value);
let nb_cases = inputs.length;
let index = 0;

inputs.forEach(input => {
    input.index = index++;

    input.onfocus = function (event) {
        input.select();
    };

    input.onkeydown = function (event) {
        next_input = null;
        switch (event.key) {
            case 'ArrowUp':
                next_input = inputs[(input.index - largeur + nb_cases) % nb_cases];
                break;
            case 'ArrowDown':
                next_input = inputs[(input.index + largeur) % nb_cases];
                break;
            case 'ArrowLeft':
                next_input = inputs[(input.index - 1 + nb_cases) % nb_cases];
                break;
            case 'ArrowRight':
                next_input = inputs[(input.index + 1) % nb_cases];
                break;
        }
        if (next_input) {
            next_input.focus();
            next_input.select();
            event.preventDefault();
        }
    };

    input.oninput = function (event) {
        this.value = this.value.toUpperCase();
        if (!input.checkValidity()) {
            input.value = '';
        }
        if (inputs.every(input => input.value.length == 1) && grilleForm.checkValidity()) {
            sha256(inputs.map(input => input.value).join('')).then(hash => {
                if (hash == solution_hashee.value) {
                    if (confirm('Bravo ! \nUne nouvelle partie ?')) {
                        grilleForm.submit();
                    }
                }
            });
        }
    };
});