// WAR
//
// Original conversion from BASIC to Javascript by Oscar Toledo G. (nanochess)
//

function print(str) {
    document.getElementById("output").appendChild(document.createTextNode(str));
}

function tab(space) {
    let str = "";
    while (space-- > 0) {
        str += " ";
    }
    return str;
}

function input() {
    return new Promise(function (resolve) {
        const input_element = document.createElement("INPUT");

        print("? ");
        input_element.setAttribute("type", "text");
        input_element.setAttribute("length", "50");
        document.getElementById("output").appendChild(input_element);
        input_element.focus();
        input_element.addEventListener("keydown", function (event) {
            if (event.keyCode == 13) {
                const input_str = input_element.value;
                document.getElementById("output").removeChild(input_element);
                print(input_str);
                print("\n");
                resolve(input_str);
            }
        });
    });
}

async function askYesOrNo(question) {
    while (1) {
        print(question);
        const str = (await input()).toUpperCase();
        if (str === "YES") {
            return true;
        }
        else if (str === "NO") {
            return false;
        }
        else {
            print("YES OR NO, PLEASE.  ");
        }
    }
}

async function askAboutInstructions() {
    const playerWantsInstructions = await askYesOrNo("DO YOU WANT DIRECTIONS");
    if (playerWantsInstructions) {
        print("THE COMPUTER GIVES YOU AND IT A 'CARD'.  THE HIGHER CARD\n");
        print("(NUMERICALLY) WINS.  THE GAME ENDS WHEN YOU CHOOSE NOT TO\n");
        print("CONTINUE OR WHEN YOU HAVE FINISHED THE PACK.\n");
    }
    print("\n");
    print("\n");
}

function createGameDeck(cards, gameSize) {
    const deck = [];
    const deckSize = cards.length;
    for (let j = 0; j < gameSize; j++) {
        let card;

        // Compute a new card index until we find one that isn't already in the new deck
        do {
            card = Math.floor(deckSize * Math.random());
        } while (deck.includes(card));
        deck.push(card);
    }
    return deck;
}

function computeCardValue(cardIndex) {
    return Math.floor(cardIndex / 4);
}

function printGameOver(playerScore, computerScore) {
    print("\n");
    print("\n");
    print(`WE HAVE RUN OUT OF CARDS.  FINAL SCORE:  YOU: ${playerScore}  THE COMPUTER: ${computerScore}\n`);
    print("\n");
}

function printTitle() {
    print(tab(33) + "WAR\n");
    print(tab(15) + "CREATIVE COMPUTING  MORRISTOWN, NEW JERSEY\n");
    print("\n");
    print("\n");
    print("\n");
    print("THIS IS THE CARD GAME OF WAR.  EACH CARD IS GIVEN BY SUIT-#\n");
    print("AS S-7 FOR SPADE 7.  ");
}

function printCards(playerCard, computerCard) {
    print("\n");
    print(`YOU: ${playerCard}\tCOMPUTER: ${computerCard}\n`);
}

const cards = [
    "S-2", "H-2", "C-2", "D-2",
    "S-3", "H-3", "C-3", "D-3",
    "S-4", "H-4", "C-4", "D-4",
    "S-5", "H-5", "C-5", "D-5",
    "S-6", "H-6", "C-6", "D-6",
    "S-7", "H-7", "C-7", "D-7",
    "S-8", "H-8", "C-8", "D-8",
    "S-9", "H-9", "C-9", "D-9",
    "S-10", "H-10", "C-10", "D-10",
    "S-J", "H-J", "C-J", "D-J",
    "S-Q", "H-Q", "C-Q", "D-Q",
    "S-K", "H-K", "C-K", "D-K",
    "S-A", "H-A", "C-A", "D-A"
];

// Main control section
async function main() {
    printTitle();
    await askAboutInstructions();

    let computerScore = 0;
    let playerScore = 0;

    // Generate a random deck
    const gameSize = cards.length;    // Number of cards to shuffle into the game deck.  Can be <= cards.length.
    const deck = createGameDeck(cards, gameSize);
    let shouldContinuePlaying = true;

    while (deck.length > 0 && shouldContinuePlaying) {
        const playerCard = deck.shift();    // Take a card
        const computerCard = deck.shift();    // Take a card
        printCards(cards[playerCard], cards[computerCard]);

        const playerCardValue = computeCardValue(playerCard);
        const computerCardValue = computeCardValue(computerCard);
        if (playerCardValue < computerCardValue) {
            computerScore++;
            print("THE COMPUTER WINS!!! YOU HAVE " + playerScore + " AND THE COMPUTER HAS " + computerScore + "\n");
        } else if (playerCardValue > computerCardValue) {
            playerScore++;
            print("YOU WIN. YOU HAVE " + playerScore + " AND THE COMPUTER HAS " + computerScore + "\n");
        } else {
            print("TIE.  NO SCORE CHANGE.\n");
        }

        if (deck.length === 0) {
            printGameOver(playerScore, computerScore);
        }
        else {
            shouldContinuePlaying = await askYesOrNo("DO YOU WANT TO CONTINUE");
        }
    }
    print("THANKS FOR PLAYING.  IT WAS FUN.\n");
    print("\n");
}

main();
