--[[

     Licensed under GNU General Public License v2
      * (c) 2013, Jan Xie

--]]

local helpers = require("lain.helpers")
local markup  = require("lain.util").markup
local awful   = require("awful")
local naughty = require("naughty")
local mouse   = mouse
local string  = string

-- Taskwarrior notification
-- lain.widget.contrib.task
local task = {}

function task.hide()
    if not task.notification then return end
    naughty.destroy(task.notification)
    task.notification = nil
end

function task.show(scr)
    task.notification_preset.screen = task.followtag and awful.screen.focused() or scr or 1

    helpers.async({ awful.util.shell, "-c", task.show_cmd }, function(f)
        local widget_focused = true

        if mouse.current_widgets then
            widget_focused = false
            for _,v in ipairs(mouse.current_widgets) do
                if task.widget == v then
                    widget_focused = true
                    break
                end
            end
        end

        if widget_focused then
            task.hide()
            task.notification = naughty.notify {
                preset = task.notification_preset,
                title  = "task next",
                text   = markup.font(task.notification_preset.font,
                         awful.util.escape(f:gsub("\n*$", "")))
            }
        end
    end)
end

function task.prompt()
    awful.prompt.run {
        prompt       = task.prompt_text,
        textbox      = awful.screen.focused().mypromptbox.widget,
        exe_callback = function(t)
            helpers.async(t, function(f)
                naughty.notify {
                    preset = task.notification_preset,
                    title  = t,
                    text   = markup.font(task.notification_preset.font,
                             awful.util.escape(f:gsub("\n*$", "")))
                }
            end)
        end,
        history_path = awful.util.getdir("cache") .. "/history_task"
    }
end

function task.attach(widget, args)
    local args               = args or {}
    task.show_cmd            = args.show_cmd or "task next"
    task.prompt_text         = args.prompt_text or "Enter task command: "
    task.followtag           = args.followtag or false
    task.notification_preset = args.notification_preset
    task.widget              = widget

    if not task.notification_preset then
        task.notification_preset = {
            font = "Monospace 10",
            icon = helpers.icons_dir .. "/taskwarrior.png"
        }
    end

    if widget then
        widget:connect_signal("mouse::enter", function () task.show() end)
        widget:connect_signal("mouse::leave", function () task.hide() end)
    end
end

return task
