local client=client
local awful=awful
local pairs=pairs
local table=table

module("ext")

-- Returns true if all pairs in table1 are present in table2
function match(table1, table2)
   for k, v in pairs(table1) do
      if table[k] ~= v and not table2[k]:find(v) then
         return false
      end
   end

   return true
end

--- Spawns cmd if no client can be found matching properties
-- If such a client can be found, pop to first tag where it is
-- visible, and give it focus
function run_or_raise(cmd, properties)
   local clients = client.get()
   local focused = awful.client.next(0)
   local findex = 0
   local matched_clients = { }
   local n = 0

   for i, c in pairs(clients) do
      -- make an array of matched clients
      if match(properties, c) then
         n = n + 1
         matched_clients[n] = c

         if n == focused then
            findex = n
         end
      end
   end

   if n > 0 then
      local c = matched_clients[1]

      -- if the focused window matched switch focus to next in list
      if 0 < findex and findex < n then
         c = matched_clients[findex + 1]
      end

      local ctags = c:tags()

      if table.getn(ctags) == 0 then
         -- ctags is empty, show client on current tag
         local curtag = awful.tag.selected()
         awful.client.movetotag(curtag, c)
      else
         -- Otherwise, pop to first tag client is visible on
         awful.tag.viewonly(ctags[1])
      end

      -- And then focus the client
      client.focus = c
      c:raise()
      awful.screen.focus(c.screen)
      return
   end
   awful.util.spawn(cmd)
end

function prev_client()
   awful.client.focus.history.previous()
   if client.focus then
      client.focus:raise()
   end
end

function next_client()
   awful.client.focus.byidx(1)
   if client.focus then
      client.focus:raise()
   end
end
