-- lx-bundle:true

local search = {}

local default_opt = {}

-- Lowercases pattern fragments unless they are escaped character classes
local function pattern_lower(str)
	if str:sub(1, 1) == "%" then
		return str
	end
	return str:lower()
end

-- Normalizes search args and applies optional case-folding behavior
local function init_args(doc, line, col, text, opt)
	opt = opt or default_opt
	line, col = doc:sanitize_position(line, col)

	if opt.no_case then
		if opt.pattern then
			text = text:gsub("%%?.", pattern_lower)
		else
			text = text:lower()
		end
	end

	return doc, line, col, text, opt
end

-- Finds the next match in the document, with optional pattern and wrap support
function search.find(doc, line, col, text, opt)
	doc, line, col, text, opt = init_args(doc, line, col, text, opt)

	for line = line, #doc.lines do
		local line_text = doc.lines[line]
		if opt.no_case then
			line_text = line_text:lower()
		end
		local s, e = line_text:find(text, col, not opt.pattern)
		if s then
			return line, s, line, e + 1
		end
		col = 1
	end

	if opt.wrap then
		opt = { no_case = opt.no_case, pattern = opt.pattern }
		return search.find(doc, 1, 1, text, opt)
	end
end

return search
