local texts = require('texts')

local buttons = {}
local buttonlist = {}

function buttons.new(label, settings)
    label = label or ""
    settings = settings or {}
    
    settings.flags = settings.flags or {}
    settings.flags.draggable = false
    
    local button = {}
    
    button.left_click = settings.left_click 
    button.hover_on = settings.hover_on
    button.hover_off = settings.hover_off
    
    button.text = texts.new(label, settings)
    button.destroy = function() buttons.destroy(button) end
    
    setmetatable(button, {__index = function(t, k) 
            if t.text[k] ~= nil then 
                return function(...)
                    return t.text[k](t.text, ...) 
                end 
            end 
        end })
    
    buttonlist[#buttonlist +1] = button
    return button
end

function buttons.destroy(me) 
    for k, v in pairs(buttonlist) do
        if v == me then
            buttonlist[k] = nil
        end
    end
    me.text.destroy(me.text)
end

local mousemoved = true
local ignorerelease = false

windower.register_event('mouse', function(eventtype, x, y, delta, blocked)
    if blocked then
        return
    end

    -- Mouse drag
    if eventtype == 0 then
        mousemoved = true
        
        for _, button in pairs(buttonlist) do
            if type(button.hover_on) == "function" and type(button.hover_off) == "function" then
                if button.text:hover(x, y) then
                    button:hover_on()
                else
                    button:hover_off()
                end
            end
        end

    -- Mouse left click
    elseif eventtype == 1 then
        mousemoved = false
        for _, button in pairs(buttonlist) do
            if button.text:hover(x, y) then 
                ignorerelease = true
                return true
            end
        end
        ignorerelease = false
        
    -- Mouse left release
    elseif eventtype == 2 then
        for _, button in pairs(buttonlist) do
            if button.text:hover(x, y) and button.text:visible() and not mousemoved and type(button.left_click) == "function" then
                button:left_click()
                return true
            end
        end
        
        if ignorerelease then
            return true
        end
    end

    return false
end)

return buttons

--Copyright  2015, Anissa
--All rights reserved.

--Redistribution and use in source and binary forms, with or without
--modification, are permitted provided that the following conditions are met:

--    * Redistributions of source code must retain the above copyright
--      notice, this list of conditions and the following disclaimer.
--    * Redistributions in binary form must reproduce the above copyright
--      notice, this list of conditions and the following disclaimer in the
--      documentation and/or other materials provided with the distribution.
--    * Neither the name of bluGuide nor the
--      names of its contributors may be used to endorse or promote products
--      derived from this software without specific prior written permission.

--THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
--ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
--WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
--DISCLAIMED. IN NO EVENT SHALL ANISSA BE LIABLE FOR ANY
--DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
--(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
--LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
--ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
--(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
--SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.