local dap = require('dap')

local codelldb_bin = "/usr/bin/codelldb"

-- Rust, C++, C
dap.adapters.codelldb = {
	type = 'server',
	port = "${port}",
	executable = {
		command = codelldb_bin,
		args = { "--port", "${port}" },
	}
}

local function get_default_rust_program_path()
	local workspace = vim.fn.getcwd()
	local program_name = vim.fn.fnamemodify(workspace, ":t")
	return workspace .. '/target/debug/' .. program_name
end

dap.configurations.cpp = {
	{
		port = 1234,
		host = '127.0.0.1',
		name = "Attach to name",
		type = "codelldb",
		request = "attach",
		pid = function()
			-- Lets user enter the name of a running process instead of looking up the pid themselves
			local name = vim.fn.input('Enter pidof name: ')
			local handle = io.popen("pidof " .. name)
			local pid = handle:read("*a")
			handle:close()

			-- Trim the result
			pid = pid:match("^%s*(.-)%s*$")
			return pid
		end,
		stopOnEntry = true,
	},
	{
		port = 1234,
		host = '127.0.0.1',
		name = "Attach to PID",
		type = "codelldb",
		request = "attach",
		pid = function()
			return tonumber(vim.fn.input('Enter PID: '))
		end,
		stopOnEntry = true,
	},
	{
		port = 1234,
		host = '127.0.0.1',
		name = "Manually launch file",
		type = "codelldb",
		request = "launch",
		program = function()
			return vim.fn.input('Path to executable: ', vim.fn.getcwd() .. '/', 'file')
		end,
		cwd = '${workspaceFolder}',
		stopOnEntry = true,
	},
	{
		-- To debug programs that need to run as root you can run a remote lldb-server as root
		-- sudo lldb-server platform --server --listen '*:1234'
		name = "Remote attach to name",
		type = "codelldb",
		request = "attach",
		pid = function()
			-- Lets user enter the name of a running process instead of looking up the pid themselves
			local name = vim.fn.input('Enter pidof name: ')
			local handle = io.popen("pidof " .. name)
			local pid = handle:read("*a")
			handle:close()

			-- Trim the result
			pid = pid:match("^%s*(.-)%s*$")
			return pid
		end,
		initCommands = {
			"platform select remote-linux",
			"platform connect connect://127.0.0.1:1234",
			"settings set target.inherit-env false",
		},
	},
	{
		-- To debug programs that need to run as root you can run a remote lldb-server as root
		-- sudo lldb-server platform --server --listen '*:1234'
		name = "Remote launch",
		type = "codelldb",
		request = "launch",
		program = function()
			return vim.fn.input('Path to executable: ', vim.fn.getcwd() .. '/', 'file')
		end,
		initCommands = {
			"platform select remote-linux",
			"platform connect connect://127.0.0.1:1234",
			"settings set target.inherit-env false",
		},
	},
}
dap.configurations.c = dap.configurations.cpp
dap.configurations.rust = dap.configurations.cpp

-- Insert this config as a rust specific one before the C++ configs
table.insert(dap.configurations.rust, 1, {
	port = 1234,
	host = '127.0.0.1',
	name = "Launch Default Rust Program",
	type = "codelldb",
	request = "launch",
	program = get_default_rust_program_path,
	cwd = '${workspaceFolder}',
	stopOnEntry = true,
})

-- Python
--dap.adapters.python = function(cb, config)
--  if config.request == 'attach' then
--    ---@diagnostic disable-next-line: undefined-field
--    local port = (config.connect or config).port
--    ---@diagnostic disable-next-line: undefined-field
--    local host = (config.connect or config).host or '127.0.0.1'
--    cb({
--      type = 'server',
--      port = assert(port, '`connect.port` is required for a python `attach` configuration'),
--      host = host,
--      options = {
--        source_filetype = 'python',
--      },
--    })
--  else
--    local home = os.getenv("HOME")
--    cb({
--      type = 'executable',
--      -- You need to install debugpy in $HOME/.virtualenvs/
--      -- Like this:
--      -- $ mkdir .virtualenvs
--      -- $ cd .virtualenvs
--      -- $ python -m venv debugpy
--      -- $ debugpy/bin/python -m pip install debugpy
--      command = home .. '/.virtualenvs/debugpy/bin/python',
--      args = { '-m', 'debugpy.adapter' },
--      options = {
--        source_filetype = 'python',
--      },
--    })
--  end
--end

--dap.configurations.python = {
--  {
--    -- The first three options are required by nvim-dap
--    type = 'python'; -- the type here established the link to the adapter definition: `dap.adapters.python`
--    request = 'launch';
--    name = "Launch file";
--
--    -- Options below are for debugpy, see https://github.com/microsoft/debugpy/wiki/Debug-configuration-settings for supported options
--
--    program = "${file}"; -- This configuration will launch the current file if used.
--    pythonPath = function()
--      -- debugpy supports launching an application with a different interpreter then the one used to launch debugpy itself.
--      -- The code below looks for a `venv` or `.venv` folder in the current directly and uses the python within.
--      -- You could adapt this - to for example use the `VIRTUAL_ENV` environment variable.
--      local cwd = vim.fn.getcwd()
--      if vim.fn.executable(cwd .. '/venv/bin/python') == 1 then
--        return cwd .. '/venv/bin/python'
--      elseif vim.fn.executable(cwd .. '/.venv/bin/python') == 1 then
--        return cwd .. '/.venv/bin/python'
--      else
--        return '/usr/bin/python'
--      end
--    end;
--  },
--}
