// Compute the edit distance between the two given strings
function getEditDistance(sourceString, targetString) {
    if (sourceString.length === 0) return targetString.length;
    if (targetString.length === 0) return sourceString.length;

    let matrix = [];

    // increment along the first column of each row
    for (let i = 0; i <= targetString.length; i++) {
        matrix[i] = [i];
    }

    // increment each column in the first row
    for (let j = 0; j <= sourceString.length; j++) {
        matrix[0][j] = j;
    }

    // Fill in the rest of the matrix
    for (let i = 1; i <= targetString.length; i++) {
        for (let j = 1; j <= sourceString.length; j++) {
            let cost = 1;
            if (targetString.charAt(i-1) === sourceString.charAt(j-1)) {
                cost = 0;
            }
            matrix[i][j] = Math.min(matrix[i-1][j-1] + cost, // substitution
                matrix[i][j-1] + 1, // insertion
                matrix[i-1][j] + 1  // deletion
            );
        }
    }
    return matrix[targetString.length][sourceString.length];
}

function fetchCommand(input, commands, threshhold){
    let candidates = {};
    let bestDistance = null;
    for(let key in commands){
        let distance = getEditDistance(input, key);
        console.log("new it. key: "+key+" dist:"+distance);
        if(distance >= threshhold) continue;
        if(bestDistance === distance){ //another candidate
            candidates[candidates.length] = key;
            console.log("other candidate");
        }
        else if(bestDistance > distance || bestDistance === null){ //new best candidate
            candidates = [key];
            bestDistance = distance;
            console.log("new best candidate");
        }
    }
    return candidates;
}

/* //Test code
const commands = {};
commands['homeserver'] = {};
commands['homeserver']['register'] = {};
commands['homeserver']['register'].regex = /([a-zA-Z0-9])/;
commands['homeserver']['register'].usage = '<user localpart>';
commands['homeserver']['register'].exec = (args) => {
    //args is a <user input args string>.match with .regex
};

commands['imninja'] = {};
commands['imninja']['register'] = {};
commands['imninja']['register'].regex = /([a-zA-Z0-9])/;
commands['imninja']['register'].usage = '<user localpart>';
commands['imninja']['register'].exec = (args) => {
    //args is a <user input args string>.match with .regex
};
console.log(fetchCommand("inminja", commands)); // -> imninja
console.log(fetchCommand("34C21", commands, 4)); // -> {}*/
//console.log(getEditDistance("saturday", "sunday")); //should be 3