local mWikidata = require('Modulo:Wikidata')

local p = {}

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

-- Converte una stringa di valori numerici separati da "," in una lista
-- Eventuali valori non numerici sono ignorati
local function read_array(args)
    local years = {}
    local populations =  {}
    if args.anni then
        local list = mw.text.split(string.gsub(args.anni, "%s", ""), ",")
        for _,s in ipairs(list) do
            years[#years+1] = tonumber(s) or 0
        end
        if args.popolazione then
            local list = mw.text.split(string.gsub(args.popolazione, "%s", ""), ",")
            for _,s in ipairs(list) do
                populations[#populations+1] = tonumber(s) or 0
            end
        end
    else -- vecchio metodo di inserimento
        for i=1,20 do
            local index = tonumber(i)
            local year = tonumber(args['a' .. index])
            if year then
                years[#years+1] = year
                populations[#populations+1] = tonumber(args['p' .. index]) or 0
            end
        end
    end
    return years, populations
end

local function get_wikidata(from)
    local populations_raw = mWikidata._getProperty({'P1082', from=from, rank='normal'}, true)
    local populations_reverse = {}
    local years = {}
    for i =1, #populations_raw do -- per il momento inserisco come anni una sequenza numerica
        populations_reverse[i] = populations_raw[#populations_raw-i+1]
        years[i] = i
    end
    return years,populations_reverse
end

function p._demografia(args)
    local years,populations = read_array(args)
    if #years == 0 then
        years,populations = get_wikidata(args.from)
    end
    if #years == 0 then return '' end
    local graph = {}
    local popmax = 0
    for _,p in ipairs(populations) do
        if p > popmax then popmax = p end
    end
    local log_p = math.ceil(math.log10(popmax))
    if log_p == 0 then log_p = 1 end
    local first_digit = math.floor(popmax / 10 ^ (log_p - 1))
    local default_pop_max
    if first_digit == 9 then
        default_pop_max = 10 ^ (log_p)
    else
        default_pop_max = (first_digit +1 ) * 10 ^ (log_p-1)
    end
    if log_p < 2 then log_p = 2 end
    local default_passo1 = 10 ^ (log_p-1)
    local default_passo2 = 10 ^ (log_p-2)
    dump(graph, 'Colors=\n id:lightgrey value:gray(0.9)\n id:darkgrey  value:gray(0.7)\n id:sfondo value:rgb(1,1,1)\n id:barra value:rgb(0.6,0.7,0.8)\n\n')
    dump(graph, 'ImageSize = width:', args.dimx or '455', ' height:', args.dmy or '373', '\n')
    dump(graph, 'PlotArea   = left:50 bottom:50 top:30 right:30\nDateFormat = x.y\n')
    dump(graph, 'Period = from:0 till:', args.popmax or tostring(default_pop_max), '\n')
    dump(graph, 'TimeAxis   = orientation:vertical\nAlignBars  = justify\n')
    dump(graph, 'ScaleMajor = gridcolor:darkgrey increment:', args.passo1 or tostring(default_passo1), ' start:0\n' )
    dump(graph, 'ScaleMinor = gridcolor:lightgrey increment:', args.passo2 or tostring(default_passo2), ' start:0\n')
    dump(graph, 'BackgroundColors = canvas:sfondo\n')
    dump(graph, 'BarData=\n')
    for _,year in ipairs(years) do
        dump(graph, string.format(' bar: %d text:%d\n', year, year))
    end
    dump(graph, '\n')
    dump(graph, 'PlotData=\n color:barra width:20 align:left\n\n')
    for i =1,#years do
        dump(graph, string.format(' bar:%d from:0 till:%d\n', years[i], populations[i]))
    end
    dump(graph, '\n')
    local lang = mw.language.new('it')
    dump(graph, 'PlotData=\n')
    for i=1,#years do
        local p_formatted = lang:formatNum(math.floor(tonumber(populations[i]) + 0,5) )
        dump(graph, string.format(' bar: %d at: %d fontsize:S text: %s shift:(-10,5)|n.d. shift:(-8,5)\n',
                                    years[i], populations[i], p_formatted))
    end
    dump(graph, '\n')
    if args.fonte then
        dump(graph, 'TextData=\n fontsize:S pos:(20,20)\n text:fonte ', args.fonte, '\n')
    end
    local draw_graph
    if args.raw then
        draw_graph = '<nowiki>'.. table.concat(graph) .. '</nowiki>'
    else
        draw_graph = mw.getCurrentFrame():extensionTag('timeline', table.concat(graph))
    end
    local titolo = "''Abitanti censiti''\n"
    if args.titolo then
        titolo = "''" .. args.titolo .. "''\n"
    end
    return titolo .. draw_graph
end

function p.demografia(frame)
    local args = require('Modulo:Arguments').getArgs(frame)
    return p._demografia(args)
end

return p