let correctBall: number
let ballRevealing: boolean
let cupSelect: string
let index: number
let score: number
let level: number
let swapSpeed: number

initializeGame()
input.onButtonEvent(Button.A, ButtonEvent.Click, () => {
    if (ballRevealing) {
        index = index + 1
        if (index > 2) {
            index = 0
        }
        basic.showString(cupSelect[index], 150)
    }
})
input.onButtonEvent(Button.B, ButtonEvent.Click, () => {
    if (ballRevealing) {
        ballRevealing = false
        if (correctBall == index) {
            score = score + level
            images.createImage(`
                . . . . .
                . . . . #
                . . . # .
                # . # . .
                . # . . .
                `).showImage(0)
            basic.pause(1000)
            basic.showString("+".concat(level.toString()), 150)
            basic.pause(1000)
        } else {
            images.createImage(`
                # . . . #
                . # . # .
                . . # . .
                . # . # .
                # . . . #
                `).showImage(0)
            basic.pause(1000)
            basic.clearScreen()
            revealBall(correctBall)
            basic.pause(1000)
        }
    }
    level = level + 1
    if (level == 4) {
        basic.showString("FINAL SCORE:", 75)
        basic.showNumber(score, 150)
    } else {
        playLevel(level)
    }
})
playLevel(1)

function revealBall(p: number) {
    let xCoordinate = 2 * p
    for (let j = 0; j < 3; j++) {
        led.plot(j * 2, 2)
    }
    for (let i = 0; i < 3; i++) {
        led.unplot(xCoordinate, 2)
        led.plot(xCoordinate, 1)
        basic.pause(100)
        led.unplot(xCoordinate, 1)
        led.plot(xCoordinate, 0)
        basic.pause(200)
        led.unplot(xCoordinate, 0)
        led.plot(xCoordinate, 1)
        basic.pause(100)
        led.unplot(xCoordinate, 1)
        led.plot(xCoordinate, 2)
        basic.pause(75)
    }
    basic.pause(1000)
}

function initializeGame() {
    ballRevealing = false
    level = 1
    score = 0
    cupSelect = "LMR"
}

function swapCups(cup_1: number, cup_2: number, pauseDifficulty: number) {
    let cup_1X = 2 * cup_1
    let cup_2X = 2 * cup_2
    let cupXAverage = (cup_1X + cup_2X) / 2
    led.unplot(cup_1X, 2)
    led.unplot(cup_2X, 2)
    led.plot(cup_1X, 3)
    led.plot(cup_2X, 1)
    basic.pause(pauseDifficulty)
    led.unplot(cup_1X, 3)
    led.unplot(cup_2X, 1)
    led.plot(cup_1X, 4)
    led.plot(cup_2X, 0)
    basic.pause(pauseDifficulty)
    led.unplot(cup_1X, 4)
    led.unplot(cup_2X, 0)
    if (cupXAverage == 2) {
        led.plot((cupXAverage + cup_1X) / 2, 4)
        led.plot((cupXAverage + cup_2X) / 2, 0)
        basic.pause(pauseDifficulty)
        led.unplot((cupXAverage + cup_1X) / 2, 4)
        led.unplot((cupXAverage + cup_2X) / 2, 0)
    }
    led.plot(cupXAverage, 4)
    led.plot(cupXAverage, 0)
    basic.pause(pauseDifficulty)
    led.unplot(cupXAverage, 4)
    led.unplot(cupXAverage, 0)
    if (cupXAverage == 2) {
        led.plot((cupXAverage + cup_2X) / 2, 4)
        led.plot((cupXAverage + cup_1X) / 2, 0)
        basic.pause(pauseDifficulty)
        led.unplot((cupXAverage + cup_2X) / 2, 4)
        led.unplot((cupXAverage + cup_1X) / 2, 0)
    }
    led.plot(cup_2X, 4)
    led.plot(cup_1X, 0)
    basic.pause(pauseDifficulty)
    led.unplot(cup_2X, 4)
    led.unplot(cup_1X, 0)
    led.plot(cup_2X, 3)
    led.plot(cup_1X, 1)
    basic.pause(pauseDifficulty)
    led.unplot(cup_2X, 3)
    led.unplot(cup_1X, 1)
    led.plot(cup_2X, 2)
    led.plot(cup_1X, 2)
    basic.pause(pauseDifficulty)
    if (correctBall == cup_1) {
        correctBall = cup_2
    } else if (correctBall == cup_2) {
        correctBall = cup_1
    }
}

function swapFake(cup_1: number, cup_2: number, pauseDifficulty: number) {
    let cup_1X = 2 * cup_1
    let cup_2X = 2 * cup_2
    let cupXAverage = (cup_1X + cup_2X) / 2
    led.unplot(cup_1X, 2)
    led.unplot(cup_2X, 2)
    led.plot(cup_1X, 3)
    led.plot(cup_2X, 1)
    basic.pause(pauseDifficulty)
    led.unplot(cup_1X, 3)
    led.unplot(cup_2X, 1)
    led.plot(cup_1X, 4)
    led.plot(cup_2X, 0)
    basic.pause(pauseDifficulty)
    led.unplot(cup_1X, 4)
    led.unplot(cup_2X, 0)
    if (cupXAverage == 2) {
        led.plot((cupXAverage + cup_1X) / 2, 4)
        led.plot((cupXAverage + cup_2X) / 2, 0)
        basic.pause(pauseDifficulty)
        led.unplot((cupXAverage + cup_1X) / 2, 4)
        led.unplot((cupXAverage + cup_2X) / 2, 0)
    }
    led.plot(cupXAverage, 4)
    led.plot(cupXAverage, 0)
    basic.pause(pauseDifficulty)
    led.unplot(cupXAverage, 4)
    led.unplot(cupXAverage, 0)
    if (cupXAverage == 2) {
        led.plot((cupXAverage + cup_1X) / 2, 4)
        led.plot((cupXAverage + cup_2X) / 2, 0)
        basic.pause(pauseDifficulty)
        led.unplot((cupXAverage + cup_1X) / 2, 4)
        led.unplot((cupXAverage + cup_2X) / 2, 0)
    }
    led.plot(cup_1X, 4)
    led.plot(cup_2X, 0)
    basic.pause(pauseDifficulty)
    led.unplot(cup_1X, 4)
    led.unplot(cup_2X, 0)
    led.plot(cup_1X, 3)
    led.plot(cup_2X, 1)
    basic.pause(pauseDifficulty)
    led.unplot(cup_1X, 3)
    led.unplot(cup_2X, 1)
    led.plot(cup_1X, 2)
    led.plot(cup_2X, 2)
    basic.pause(pauseDifficulty)
}

function playLevel(level1: number) {
    basic.showNumber(level, 150)
    basic.pause(3000)
    basic.clearScreen()
    for (let i = 0; i < 3; i++) {
        led.plot(2 * i, 2)
    }
    basic.pause(1000)
    correctBall = Math.randomInt(3)
    revealBall(correctBall)
    basic.pause(1000)
    let swaps = 5 + 10 * level1
    if (level1 == 1) {
        swapSpeed = 80
    } else if (level1 == 2) {
        swapSpeed = 40
    } else {
        swapSpeed = 20
    }
    for (let i1 = 0; i1 < swaps; i1++) {
        let swapType = Math.randomInt(3)
        let not = Math.randomInt(3)
        if (swapType < 2) {
            let swapOrientation = Math.randomInt(2)
            if (swapOrientation == 0) {
                swapCups((not + 1) % 3, (not + 2) % 3, swapSpeed)
            } else {
                swapCups((not + 2) % 3, (not + 1) % 3, swapSpeed)
            }
        } else {
            let swapOrientation1 = Math.randomInt(2)
            if (swapOrientation1 == 0) {
                swapFake((not + 1) % 3, (not + 2) % 3, swapSpeed)
            } else {
                swapFake((not + 2) % 3, (not + 1) % 3, swapSpeed)
            }
        }
    }
    index = -1
    ballRevealing = true
}