Game = {}
class("Game").extends(BaseScene)
local scene = Game

local font = Graphics.font.new('assets/fonts/Mini Sans 2X')

function scene:drawBackground()
    local speed = 0.1
    if scene.ground ~= nil then
        speed = scene.ground.moveSpeed * 0.4
    end

    if scene.distance > 0 then
        scene.bgX = scene.bgX - speed
    end

    if scene.bgX <= -400 then
        scene.bgX = 0
    end
    self.bg:draw(scene.bgX or 0, 0)
end

function scene:setValues()
    self.bg = Graphics.image.new("assets/sprites/bg1")
    scene.bgX = 0
    scene.telemLostSound = playdate.sound.fileplayer.new("assets/audio/telemko")
    scene.telemLostSoundPlayed = false

    scene.resultShowed = false

    scene.musicEnabled = Noble.Settings.get("music")
    scene.difficulty = Noble.Settings.get("difficulty")

    scene.balebas = {}

    scene.balebaSpawner = playdate.timer.new(10000)
    scene.balebaSpawner.repeats = true

    scene.levelAudio = playdate.sound.fileplayer.new("assets/audio/game")
    scene.levelAudio:setVolume(0.7)
    scene.helloAudio = playdate.sound.fileplayer.new("assets/audio/hello")

    scene.tank = nil

    scene.distance = DifficultySettings[scene.difficulty].distance
end

function scene:init()
    scene.super.init(self)
    scene:setValues()
end

function scene:start()
    scene.super.start(self)

    self.optionsMenu:addMenuItem("Main Menu", function() Noble.transition(Menu) end)
    Noble.showFPS = false
end

function scene:spawnBaleba()
    local balebaCount = #scene.balebas
    if balebaCount >= 6 then
        scene.balebaSpawner:remove()
        return
    end

    scene.balebas[balebaCount + 1] = Baleba(math.random(410, 900), math.random(10, 210), scene.player, true)
end

function scene:enter()
    scene.super.enter(self)


    scene.player = Player(150, 100)
    scene.ground = Ground(0, 225, scene.player)

    scene.balebaSpawner.timerEndedCallback = function()
        scene:spawnBaleba()
    end

    for i = 1, 3 do
        scene:spawnBaleba()
    end

    scene.helloAudio:play(1)
    if scene.musicEnabled then
        scene.levelAudio:play(0)
    end
end

function scene:update()
    scene.super.update(self)

    if playdate.isCrankDocked() then
        playdate.ui.crankIndicator:draw()
    end

    if scene.player == nil then
        return
    end

    if scene.distance > 0 then
        scene.distance = scene.distance - scene.ground.moveSpeed
    end

    if scene.distance < 0 then -- SHIT
        scene.distance = 0
    end

    if scene.distance < 150 and scene.tank == nil then
        scene.tank = Tank(480, 190, scene.ground)
        scene:addSprite(scene.tank) -- Raw sprite
    end

    if scene.player.isDead() then
        scene.ground:setMoveSpeed(0)
        if scene.resultShowed ~= true then
            Noble.Text.draw("Telemetry Lost", 200, 110, Noble.Text.ALIGN_CENTER, false, font)
        end
    else
        local t = scene.player.getBat() / 10000
        local lerpBat = playdate.math.lerp(12.0, 16.8, t)
        Noble.Text.draw(round(lerpBat) .. "v", 10, 210, Noble.Text.ALIGN_LEFT, false, font)
        Noble.Text.draw(math.round(scene.distance) .. "m", 200, 20, Noble.Text.ALIGN_CENTER, false, font)
    end

    if scene.player.isDead() and not scene.telemLostSoundPlayed then
        scene.telemLostSound:play(1)
        scene.telemLostSoundPlayed = true
        screenShake(1000, 5)

        playdate.timer.performAfterDelay(4000, function()
            scene.resultShowed = true
            local message = "You failed!"
            if scene.player.targetDone then
                message = "You did it!"
            end
            c = notify(message, function()
                Noble.transition(Menu)
                c:remove()
            end)
            c:moveTo(200, 120)
            c:add()
        end)

        return
    end
end

function scene:exit()
    scene.super.exit(self)

    if scene.tank ~= nil then
        scene.tank:remove()
    end
    scene.helloAudio:stop()
    scene.telemLostSound:stop()
    scene.levelAudio:stop()
    scene.balebaSpawner:remove()

    Noble.showFPS = false
end

function scene:finish()
    scene.super.finish(self)
    playdate.display.setScale(1)
end
