--   This file is part of Reno desktop.
--
--  Reno desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
--
--  Reno desktop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
--
--  You should have received a copy of the GNU General Public License along with Reno desktop. If not, see <https://www.gnu.org/licenses/>. 
local gears = require("gears")
local awmtk2 = require("awmtk2")
local wibox = require("wibox")
local awful = require("awful")
local beautiful = require("beautiful")
local builder = require("builder")
local mbarutils = require("menubar").utils
local menugen = require("context_menu")
local json = require("dkjson")

local function read_file(fname)
    local fhandler = io.open(fname,"r")
    if fhandler then
        local data = fhandler:read("*a")
        fhandler:close()
        return data
    end
end

-- {{{ Placeholder Icons
client.connect_signal("request::titlebars",function(c)
    if (not c.icon) and beautiful.icon_default then
        c.icon = beautiful.icon_default._native
    end
end)
-- }}}

do -- {{{ Global widgets 
local config_file = io.open(root_path.."/themes/"..global.theme.."/config/global.json","r")
local config
if config_file then
    config = config_file:read("*a")
    config_file:close()
else
    config = "[]"
end
for k,v in pairs(json.decode(config) or {}) do
    require(k)(v)
end
end -- }}}

do --{{{ Screen
local wibar_config = {}
local style = awmtk2.create_style("wibar",awmtk2.default,{})
for k,v in pairs({"wibar_top","wibar_bottom","wibar_left","wibar_right"}) do
    style[v] = awmtk2.create_delta(v, {}, 
        (beautiful.widgets and beautiful.widgets.wibar) or {}, 
        style.wibar)
    wibar_config[v] = read_file(root_path.."/themes/"..global.theme.."/config/"..v..".json")
end
local templates = awmtk2.create_template_lib("wibar",awmtk2.templates,{})
local t = awmtk2.build_templates(templates,style)

awful.screen.connect_for_each_screen(function(s)
    for k,v in pairs({"wibar_top","wibar_bottom","wibar_left","wibar_right"}) do
        local contents = { widget = wibox.container.background }
        if wibar_config[v] then
            contents = builder(wibar_config[v],{
                client = c,
                style = style[v],
                buttons = buttons,
                screen = s
            })
            s[v] = awful.wibar({
                -- There really isn't a better way to do this. I wish there was.
                position = v:gsub("wibar_",""),
                screen = s,
                visible = true,
                stretch = style[v].stretch,
                ontop = style[v].ontop,
                width = style[v].width,
                height = style[v].height,
                border_width = style[v].border_width,
                border_color = style[v].border_color,
                opacity = style[v].opacity or 1,
                shape = style[v].shape,
                bg = style[v].bg,
                bgimage = style[v].bgimage,
                fg = style[v].fg,
                input_passthrough = style[v].input_passthrough
            })
            s[v]:setup(t.wibar(contents))
        end
    end
end)
end -- }}}

do -- {{{ Titlebars
local titlebar_config = {}
local style = awmtk2.create_style("titlebar",awmtk2.default,{})
for k,v in pairs({"titlebar_top","titlebar_left","titlebar_right","titlebar_bottom"}) do
    -- Create styles for each titlebar
    style[v] = awmtk2.create_delta(v, {}, 
        (beautiful.widgets and beautiful.widgets.titlebar) or {}, 
        style.titlebar)
    -- Load in json layouts for titlebars
    titlebar_config[v] = read_file(root_path.."/themes/"..global.theme.."/config/"..v..".json")
end
local templates = awmtk2.create_template_lib("titlebar",awmtk2.templates,{})
local t = awmtk2.build_templates(templates,style)
-- Add titlebars to normal windows
table.insert(awful.rules.rules,
    { rule_any = {type = { "normal", "dialog" }
      }, properties = { titlebars_enabled = true }
    }
)
client.connect_signal("request::titlebars",function(c)
    local buttons = gears.table.join(
        awful.button({}, 1, function()
            c:emit_signal("request::activate","titlebar",{raise=true})
            awful.mouse.client.move(c)
        end),
        awful.button({}, 3, function()
            c:emit_signal("request::activate","titlebar",{raise=true})
            awful.mouse.client.resize(c)
        end)
    )
    for k,v in pairs({"titlebar_top","titlebar_bottom","titlebar_left","titlebar_right"}) do
        local contents = { widget = wibox.container.background }
        if titlebar_config[v] then
            contents = builder(titlebar_config[v],{
                client = c,
                screen = c.screen,
                style = style[v],
                buttons = buttons
            })
        end
        awful.titlebar(c,{
            size = style[v].size or 0,
            position = v:gsub("titlebar_",""),
            bg_normal = style[v].bg_normal,
            bg_focus = style[v].bg_focus,
            bgimage_normal = style[v].bgimage_normal,
            bgimage_focus = style[v].bgimage_focus,
            fg_normal = style[v].fg_normal,
            fg_focus = style[v].fg_focus,
            font = style[v].font
        }):setup(t.titlebar(contents))
        awful.rules.rules[1].properties.placement(c)
    end
end)
end --}}}
    
