local M = {}

local selected = ya.sync(function()
	local urls = {}
	for _, f in pairs(cx.active.selected) do
		urls[#urls + 1] = f.url
	end
	return urls
end)

function M:spot(job)
	local i = 0
	for rows in self:spot_base(job, selected()) do
		i = i + 1
		ya.spot_table(
			job,
			ui.Table(rows)
				:area(ui.Pos { "center", w = 60, h = 20 })
				:row(i == 1 and 1 or nil)
				:col(1)
				:col_style(th.spot.tbl_col)
				:cell_style(th.spot.tbl_cell)
				:widths { ui.Constraint.Length(14), ui.Constraint.Fill(1) }
		)
		self:update_sizes()
	end
end

function M:spot_base(_, selected)
	local function yield(s)
		coroutine.yield {
			ui.Row({ "Multi" }):style(ui.Style():fg("green")),
			ui.Row { "  Size:", s },
			ui.Row { "  Count:", string.format("%d selected", #selected) },
		}
	end

	self.sizes = {}
	return ya.co(function()
		yield("0B (?)")

		local sum, last = 0, 0
		for _, url in ipairs(selected) do
			local it, size = fs.calc_size(url), 0
			while it do
				local next, now = it:recv(), ya.time()
				if not next then
					self.sizes[url] = it.cha.is_dir and size or nil
					break
				elseif now >= last + 0.1 then
					last, size, sum = now, size + next, sum + next
					yield(ya.readable_size(sum) .. " (?)")
				else
					size, sum = size + next, sum + next
				end
			end
		end

		yield(ya.readable_size(sum))
	end)
end

function M:update_sizes()
	local trails = {}
	for url, size in pairs(self.sizes) do
		local t = url.trail
		trails[t] = trails[t] or {}
		trails[t][url.key] = size
	end
	for trail, sizes in pairs(trails) do
		ya.emit("update_files", { op = fs.op("size", { url = trail, sizes = sizes }) })
	end
end

return M
