# Module:ChartColors

local p = {}  

local ARG = require "Module:Arguments"  
local CFCM = require "Module:ComplForColorModules"  
local TNTT = require "Module:TNTTools"  
local SD = require "Module:SimpleDebug"  

local I18n = 'ChartColors'  

local function I18nStr (S, ...)  
return TNTT.GetMsgP (I18n, S, {...})  
end  

--local RS_ColorNameInvalid = 'El nom del color (%s) no és vàlid (ha de ser Categ20 o Plotter)'  
--local RS_ColorNumInvalid = 'El nombre de colors hauria d’estar entre 1 i %d (ara és %d)'  
--local RS_StartNumInvalid = 'El número del primer color hauria d’estar entre 1 i %d (ara és %d)'  

local category20 = {  
'#1f77b4', '#aec7e8', '#ff7f0e', '#ffbb78', '#2ca02c', '#98df8a', '#d62728', '#ff9896', '#9467bd', '#c5b0d5',  
'#8c564b', '#c49c94', '#e377c2', '#f7b6d2', '#7f7f7f', '#c7c7c7', '#bcbd22', '#dbdb8d', '#17becf', '#9edae5',  
}  
local plotter = {--from Module:Plotter/DefaultColors  
'red', 'blue', 'green', 'yellow', 'fuchsia', 'aqua', 'brown', 'orange', 'purple', 'sienna',  
'#F0A3FF', '#191919', '#005C31', 'honeydew', '#808080', 'khaki', 'lime', 'navy', 'pink', '#426600',  
'#5EF1F2', 'turquoise', '#E0FF66', 'violet', '#FFFF80', '#FF5005',  
}  

function p.GetColors (ColorName, IsInv, StartN, N, CallError)  
local SelColors = {}  
local ColorNameL = string.lower(ColorName)  
local Palet0 = {}  
if ColorNameL == 'categ20' then  
Palet0 = category20  
elseif ColorNameL == 'plotter' then  
Palet0 = plotter  
elseif CallError then  
error (I18nStr ('ColorNameInvalid',ColorName))  
end  
MaxN = table.getn(Palet0)  
if (N < 0) or (N > MaxN) then  
error (I18nStr ('ColorNumInvalid',tostring(MaxN),tostring(N)))  
else  
Palet = {}  
if IsInv then  
for i=MaxN, 1, -1 do  
table.insert(Palet, Palet0[i])  
end  
else  
Palet = Palet0  
end  
if StartN > MaxN then  
error (I18nStr ('StartNumInvalid',tostring(MaxN),tostring(StartN)))  
end  
local Step = 1  
local NEnd = N  
if (ColorNameL == 'categ20') and (N<=10) then  
Step = 2  
if StartN == 1 then  
NEnd = N*2  
end  
end  
if StartN == 1 then  
for i=1, NEnd, Step do  
table.insert(SelColors, Palet[i])  
end  
else  
Count = 0  
for i=StartN, MaxN, Step do  
table.insert(SelColors, Palet[i])  
Count = Count + 1  
if Count == NEnd then  
break  
end  
end  
if Count < NEnd then  
for i=1, MaxN, Step do  
table.insert(SelColors, Palet[i])  
Count = Count + 1  
if Count == NEnd then  
break  
end  
end  
end  
end  
return SelColors  
end  
end --GetColors  

function p.ColorNameInvStartFromS (S)  
local StartN = 1  
local ParamsA = {}  
local ColorName, IsInv  
ColorName, IsInv, ParamsA = CFCM.ColorNameInvFromS0 (S)  
local PN = table.getn(ParamsA)  
if PN > 1 then  
if ParamsA[2]=='i' then  
IsInv = true  
else  
StartN = tonumber (ParamsA[2])  
end  
if PN == 3 then  
StartN = tonumber (ParamsA[3])  
end  
end  
return ColorName, IsInv, StartN  
end --ColorNameInvStartFromS  

function ColorNameInv (args)  
local S = args[1] or ''  
local ColorName, IsInv, ParamsA = CFCM.ColorNameInvFromS0 (S)  
local StartN = 1  
ColorName, IsInv, StartN = p.ColorNameInvStartFromS (S)  
return ColorName, IsInv, StartN  
end --ColorNameInv  

function p.ShowColors  
local args = ARG.getArgs(,{  
removeBlanks = false  
});  
local ColorName, IsInv, StartN = ColorNameInv (args)  
local N = tonumber(args[2])  
local WriteColor = args[3] or ""  
local ColorFound = {}  
ColorFound = p.GetColors (ColorName, IsInv, StartN, N, true)  
local boxes = {}  
for i=1, table.getn(ColorFound) do  
table.insert(boxes, CFCM.Box(ColorFound[i],WriteColor))  
end  
return table.concat(boxes, " ")  
end --ShowColors  

function p.Legends  
local args = ARG.getArgs(,{  
removeBlanks = false  
})  
local Nargs = require("Module:TableTools").length(args)  
local ColorName, IsInv, StartN = ColorNameInv (args)  
local N = tonumber(args[2])  
local ColWidth = args[3]  
local ColorFound = {}  
local Labels = {}  
local NLabels = 0  
local IsTemplate = true  
ColorFound = p.GetColors (ColorName, IsInv, StartN, N, true)  
Labels, NLabels, OutlineColor = CFCM.GetLabels (args, N, 4)  
return CFCM.LegendText (ColorFound, Labels, NLabels, ColWidth, IsTemplate, OutlineColor)  
end  

return p