local window = require("window")
local room = require("room")
local edge = require("edge")
local button = require("button")

local m = room:from{
    code = 45100,
    key_size = 25,
    key_gap = 10,
}

local oldfrom = m.from
function m:from(t)
    local kp = oldfrom(self, t)

    local ks = kp.key_size
    local kg = kp.key_gap

    local kd = ks + kg
    local kw = kd*3 - kg
    local kh = kd*5 - kg
    local sx, sy = room.calc_align(kw, kh)

    kp.number = 0
    kp.keys = {}
    kp.pad_width = kw
    kp.pad_height = kh
    kp.pad_x = sx
    kp.pad_y = sy
    kp.state = 'normal'
    kp.timer = 0

    for i = 1, 9 do
        local x = sx + kd * ((i-1)%3)
        local y = sy + kd * math.floor(1 + (i-1) / 3)

        kp.keys[i] = button.new(tostring(i),
            function () kp:input(i) end,
            x, y, ks, ks)
    end

    local br = sy + kd*4

    kp.keys['C'] = button.new('C',
        function () kp:clear() end,
        sx, br, ks, ks)

    kp.keys[0] = button.new('0',
        function () kp:input(0) end,
        sx + kd, br, ks, ks)

    kp.keys['A'] = button.new('A',
        function () kp:accept() end,
        sx + kd*2, br, ks, ks)

    edge.set(kp, "down", kp.room)

    return kp
end

function m:clear()
    self.number = 0
end

function m:input(n)
    if self.number < 100000 then
        self.number = self.number * 10 + n
    end
end

function m:oncorrect()
    log:log("Correct!")
end

function m:onwrong()
    log:log("it seeems that the number does not match.")
end

function m:accept()
    if self.number == self.code then
        self.state = 'correct'
        self:oncorrect()
    else
        self.state = 'wrong'
        self:onwrong()
    end
end

m.update = function(self, dt)
    if self.state == 'wrong' then
        self.timer = self.timer + dt

        if self.timer > 1 then
            self.state = 'normal'
            self.timer = 0
            self:clear()
        end
    end
end

m.draw = window.draw(function (self)
    love.graphics.setLineWidth(3)

    -- start drawing keypad

    -- draw indicator box
    love.graphics.rectangle('line', self.pad_x, self.pad_y, self.pad_width, self.key_size)

    local function display(str)
        love.graphics.printf(str, self.pad_x + 5, self.pad_y + 5, self.pad_width - 8, 'right')
    end

    if self.state == 'normal' then
        display(tostring(self.number))
    elseif self.state == 'correct' then
        display("correct")
    elseif self.state == 'wrong' then
        display("wrong")
    else
        error("keypad is not in a defined state")
    end

    for i, v in pairs(self.keys) do
        v:draw()
    end

    self.edges[1]:draw()
end)

m.mousepressed = function (self, x, y, button)
    local x, y = x - self.x, y - self.y

    if self.state == 'normal' then
        for i, v in pairs(self.keys) do
            if v:mousepressed(x, y, button) then
                return true
            end
        end
    end

    return self.edges[1]:mousepressed(x, y, button)
end

return m