local util = require("trouble.util")

local M = {}

M.results = {}

--- Turns a Telescope item into a Trouble item.
local function item_to_result(item)
  local row = (item.lnum or 1) - 1
  local col = (item.col or 1) - 1

  if not item.bufnr then
    local fname = vim.fn.fnamemodify(item.filename, ":p")
    if vim.fn.filereadable(fname) == 0 and item.cwd then
      fname = vim.fn.fnamemodify(item.cwd .. "/" .. item.filename, ":p")
    end
    item.bufnr = vim.fn.bufnr(fname, true)
  end

  local pitem = {
    row = row,
    col = col,
    message = item.text,
    severity = 0,
    range = {
      start = { line = row, character = col },
      ["end"] = { line = row, character = -1 },
    },
  }

  return util.process_item(pitem, item.bufnr)
end

--- Shows all Telescope results in Trouble.
function M.open_with_trouble(prompt_bufnr, _mode)
  local action_state = require("telescope.actions.state")
  local actions = require("telescope.actions")
  local picker = action_state.get_current_picker(prompt_bufnr)
  local manager = picker.manager

  M.results = {}
  for item in manager:iter() do
    table.insert(M.results, item_to_result(item))
  end

  actions.close(prompt_bufnr)
  require("trouble").open("telescope")
end

--- Shows the selected Telescope results in Trouble.
function M.open_selected_with_trouble(prompt_bufnr, _mode)
  local action_state = require("telescope.actions.state")
  local actions = require("telescope.actions")
  local picker = action_state.get_current_picker(prompt_bufnr)

  M.results = {}
  for _, item in ipairs(picker:get_multi_selection()) do
    table.insert(M.results, item_to_result(item))
  end

  actions.close(prompt_bufnr)
  require("trouble").open("telescope")
end

--- Shows the selected Telescope results in Trouble.
--- If no results are currently selected, shows all of them.
function M.smart_open_with_trouble(prompt_bufnr, _mode)
  local action_state = require("telescope.actions.state")
  local picker = action_state.get_current_picker(prompt_bufnr)
  if #picker:get_multi_selection() > 0 then
    M.open_selected_with_trouble(prompt_bufnr, _mode)
  else
    M.open_with_trouble(prompt_bufnr, _mode)
  end
end

function M.telescope(_win, _buf, cb, _options)
  if #M.results == 0 then
    util.warn(
      "No Telescope results found. Open Telescopen and send results to Trouble first. Refer to the documentation for more info."
    )
  end
  cb(M.results)
end

return M