--- Remove a process
-- @module remove_process

local remove_process = {
    name = "Remove process",
    slug = "remove_process",
    desc = "User can remove own processes, approval required for those of others",
    hide = false;
}

remove_process.data = {
}

remove_process.config = {
   approval_module = "consent"
}

--- Initiate function
-- @function remove_process:initiate
-- @param result Callback if this module is embedded in other modules
function remove_process:initiate(result)
   -- prepare process options
   local available_processes = {}
   for k,process in pairs(self.org.processes) do
      if process ~= "deleted" then
         available_processes[process.id] = process
      end
   end
   local process_list = {}
   local process_count = 0
   for k,v in pairs(available_processes) do
      local mine = ""
      if v.initiator == self.initiator then mine = "*" end
      table.insert(process_list,"["..v.id.."] "..v.slug..mine)
      process_count = process_count + 1
   end
   -- abort if no processes to remove
   if process_count == 0 then
      modpol.interactions.message(
         self.initiator, "Org has no modules")
      modpol.interactions.org_dashboard(
         self.initiator, self.org.id)
      if result then result() end
      self.org:delete_process(self.id)
      return
   end
   table.sort(process_list)
   -- now ask which to remove
   modpol.interactions.dropdown_query(
      self.initiator, "Choose a process to remove (* marks yours, no consent required):",
      process_list,
      function(process_choice)
         -- confirm choice
         local process_id = tonumber(
            string.match(process_choice, "%d+"))
         local process_mine = string.match(process_choice,
                                           "%*")
         modpol.interactions.binary_poll_user(
            self.initiator,
            "Confirm: Remove process \""..
            process_choice .. "\"?",
            function(input)
               if input == "Yes" then
                  if process_mine then
                     self.org:delete_process_tree(process_id)
                     modpol.interactions.message(
                        self.initiator,
                        "Removed process: "..process_choice)
                     modpol.interactions.org_dashboard(
                        self.initiator, self.org.id)
                     if result then result() end
                     self.org:delete_process(self.id)
                  else
                     self:call_module(
                        self.config.approval_module,
                        self.initiator,
                        {
                           prompt =
                              "Approve removal of process "
                              ..process_choice.."?"
                        },
                        function(input)
                           modpol.interactions.message_org(
                              self.initiator,
                              self.org.id,
                              "Removing process: "..
                              process_choice)
                           self.org:delete_process_tree(process_id)
                           modpol.interactions.org_dashboard(
                              self.initiator, self.org.id)
                           if result then result() end
                           self.org:delete_process(self.id)
                        end
                     )
                  end
                  modpol.interactions.org_dashboard(
                     self.initiator, self.org.id)
               else
                  modpol.interactions.org_dashboard(
                     self.initiator, self.org.id)
                  if result then result() end
                  self.org:delete_process(self.id)
               end
            end
         )
      end
   )
end

modpol.modules.remove_process = remove_process