Questo modulo contiene funzioni di appoggio al template {{Infobox nave}}


local p = {}
local getArgs = require('Module:Arguments').getArgs

local function dump(t, ...)
	local args = {...}
	for _, s in ipairs(args) do
		table.insert(t, s)
	end
end

---============================================================
-- Round to precision
---============================================================
function round(num, idp)
	local pow = idp or 0
	if idp then
		local mult = 10^idp
		local adder = (num >= 0 and 0.5) or -0.5
		return math.floor(num * mult + adder) / mult
	end
	return math.floor(num + 0.5)
end

---============================================================
-- Autorounding based on the magnitude of value
---============================================================
local function round_auto(num)
	local  base = math.floor(math.log10(math.abs(num))-1)
	return round(num, base)
end

---============================================================
-- format value using non breaking spaces to separate three digit group
--============================================================
local function sep_thousand(value)
	local formatted = value
	while true do
		formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1 %2')
		if (k==0) then
			break
		end
	end
	return formatted
end

local function get_value(s)
	if s then
		local try_convert = s:gsub(",", ".")
		return tonumber(try_convert)
	end
end


---============================================================
-- Format speed and convert from knots to km/h (or viceversa)
---============================================================
function p.speed(frame)
	
	local args = getArgs(frame)
	local spd_kn = args[1] 
	local spd_kmh = args[2] 
	local spd_type = args[3]
	if spd_kmh == nil and spd_kn == nil then
		return ''
	elseif spd_kmh ==nil and spd_kn ~= nil then
		local kn = tonumber(spd_kn)
		if kn then
			spd_kmh = sep_thousand(tostring(round_auto(1.852*kn)))
		end
	else
		local kmh = tonumber(spd_kmh)
			if kmh then
				spd_kn = sep_thousand(tostring(round_auto(kmh/1.852)))
			end
		end
	local out_kn = spd_kn and (spd_kn ..  " [[Nodo (unità di misura)|nodi]]")
	local out_kmh = spd_kmh and (spd_kmh .. " [[Chilometro orario|km/h]]" )
	local out 
	local out = (spd_type and spd_type .. ": ") or ''
	if out_kn and out_kmh then
		out = out .. out_kn .. " (" .. out_kmh .. ")"
	elseif out_kn then
		out = out .. out_kn
	else
		out = out .. out_kmh or ''
	end
	return out
end

local function format_value(value)
	if value then
		local s = tostring(value)
		s = s:gsub("%.", ",")
		return sep_thousand(s)
	end
end

local function format_m(m1_raw, m2_raw, factor, measure_type, m1_unit, m2_unit, check_error)
	if not (m1_raw or m2_raw) then
		return
	end	
	local m1_value = get_value(m1_raw)
	local m2_value = get_value(m2_raw)
	if m1_value and not m2_raw then
		m2_value = round_auto(m1_value * factor)
	end
	if m2_value and not m1_raw then
		m1_value = round_auto(m2_value / factor)
	end
	local m1_formatted, m2_formatted
	if m1_value then
		m1_formatted = format_value(tostring(m1_value))
	elseif m1_raw then
		m1_formatted = m1_raw --.. (check_error and error_message or '')
	end
	if m2_value then
		m2_formatted = format_value(tostring(m2_value))
	elseif m2_raw then
		m2_formatted = m2_raw --.. (check_error and error_message or '')
	end
	return m1_formatted, m2_formatted 
end


function p.range(frame)
	local args = getArgs(frame)
	local range_nmi = args[1] 
	local range_kn = args[2] 
	local range_type = args[3]
	local range_km = args[4] 
	local range_kmh = args[5]
	local out = {}
	local nmi_formatted, km_formatted = format_m(range_nmi, range_km, 0.539957, "distanza", "miglia marine", "km")
	local kn_formatted, kmh_formatted = format_m(range_kn, range_kmh, 1.852, "velocità", "nodi", "km/h")
	if nmi_formatted then
		dump(out, nmi_formatted, "  [[Miglio nautico|miglia]]" )
		if kn_formatted then
			dump(out, " a ", kn_formatted, " [[nodo (unità di misura)|nodi]]")
		end
	end 
	if km_formatted then
		if kn_formatted then
			dump(out, " (")
		end
		dump(out, km_formatted, "  [[chilometro|km]]" )
		if kmh_formatted then
			dump(out, " a ", kmh_formatted, " [[chilometro orario|km]]")
		end
		if kn_formated then
			dump (out, ")")
		end
	end
	return table.concat(out)
end

return p