local yesno = require('Module:Yesno')

local function is(v)
	return (v or '') ~= ''
end

local function widths
	local width = is(w) and w or d
	if tonumber(width) then width = width .. 'px' end
	return width
end

local p = {}

function p._box(args)
	local width = widths
	
	local class = 'barbox'
	if args.float == 'left' or args.float == 'right' or args.float == 'none' then
		class = 'barbox t' .. args.float
	elseif args.float == 'center' then
		class = 'barbox tnone'
	end
	
	local output = {}
	
	output[1] = mw.getCurrentFrame:extensionTag{ name = 'templatestyles', args = {src='Module:Bar box/styles.css'} }
	
	output[2] = is(args.css) and  or ''
	
	if (args.float == 'left') or (args.float == 'right') then
		output[3], output[15] = '', ''
	else
		output[3] =
			'' .. 
				'' .. 
					'' ..
				'' .. 
			'
	end
	
	output[4] = 
		'\n' ..
		'\n' ..
		'\n'
		output[5] = ( is(args.title) and (
			'' ..
				'\n') or '')
		output[6] =
			'\n'
			output[7] =
				'\n'
			output[8] = ( is(args.left2) and (
				'\n') or '')
			output[9] =
				'\n' ..
				'\n'
			output[10] = ( is(args.right2) and (
				'\n'
		output[12] =
			args.bars or ''
		output[13] = ( is(args.caption) and (
			'\n') or '')
	output[14] =
		'\n'
	-- output[15] defined above
	
	return table.concat(output)
end

function p._percent(args)
	local output = {}
	local background = is(args.bg) and ('background:' .. args.bg .. ';') or '' 
	local percentage = ( is(args[3]) and args[3] or '0' ) .. '%'
	local rowStyle = is(args.rowstyle) and (' style="' .. args.rowstyle .. '"') or ''
	
	output[1] = '\n'
		output[2] = '\n'
		output[3] = ''
			output[4] = '\n'
		output[6] = '\n'
		output[7] = ( is(args.note) and (''
	
	return table.concat(output)
end

function p._pixel(args)
	local output = {}
	local background = ( is(args[2]) and args[2] or 'gray' )
	local width = ( is(args[3]) and args[3] or '0' )
	local note = ( is(args.note) and '1' or '2' )
	local rowStyle = is(args.rowstyle) and (' style="' .. args.rowstyle .. '"') or ''
	
	output[1] =
		'\n'
		output[2] =
			'\n'
		output[3] =
			'' ..
				'' ..
			'\n'
		output[4] =
			'\n'
		output[5] = ( is(args.note) and (
			'\n') or '' )
	output[6] =
		''
	
	return table.concat(output)
end

function p._stacked(args)
	local function _align
		if (args.align or '') ~= '' then
			local a = mw.ustring.sub
			if a == 'l' then
				return 'left'
			elseif a == 'c' then
				return 'center'
			elseif a == 'r' then
				return 'right'
			elseif a == 'd' then
				return default
			end
		end
		
		return default
	end

	local output = {}
	
	local rowStyle = is(args.rowstyle) and (' style="' .. args.rowstyle .. '"') or ''
	output[1] = ( is(args.id) and (
		'<tr class="mw-collapsible' .. ( yesno(args.collapsed) and ' mw-collapsed' or '') ..
		'" id="mw-customcollapsible-' .. args.id .. '"' .. rowStyle .. '>\n') or ('\n') )
		output[2] =
			'<td ' .. (args.note1 and '' or 'colspan="2" ') .. 
			'style="text-align:' .. _align .. '" class="bb-04em">' .. 
				mw.text.trim(args[1] or '') .. 
			'\n'
		output[3] = ( is(args.note1) and (
			'\n') or '')
		output[4] =
			'\n'
			
			local maxn = 4
			for k in pairs(args) do
				local kn = tonumber(k) or 0
				if kn > maxn then maxn = kn end
			end
			
			for i=1,(( maxn - 2 )/2),1 do
				local width = ( mw.text.trim(args[(2*i) + 2] or 0) )
				width = (is(width) and width or 0)
				width = tonumber( mw.ustring.format )
				if width == 0 then
					output[i+4] = ''
				else
					local title = ( (args['title' .. i] or '') ~= '' ) and ( ' title=' .. args['title' .. i] ) or ''
					local background = ( (args[(2*i) + 1] or '') ~= '' ) and args[(2*i) + 1] or 'gray'
					
					output[i+4] =
						'\n'
				end
			end
	
		output[#output+1] =
			'\n'
		output[#output+1] = 
			'<td ' .. (args.note2 and '' or 'colspan="2" ') .. 
			'style="text-align:' .. _align .. '" class="bb-04em">' .. 
				mw.text.trim(args[2] or '') .. 
			'\n'
		output[#output+1] = ( is(args.note2) and (
			'\n') or '')
	output[#output+1] =
		'\n'
	
	return table.concat(output)
end

function p._gap(args)
	local output = {}
	local rowStyle = is(args.rowstyle) and (' style="' .. args.rowstyle .. '"') or ''
	local height = '10px'
	if (args.height or '') ~= '' then
		height = (tonumber(args.height) and (args.height .. 'px') or args.height)
	end
			
	output[1] =
		'\n'
		output[2] = 
			'\n'

	return table.concat(output)
end

function p.box(frame)
	local args = getArgs(frame, {
		valueFunc = function 
			if value then
				value = mw.text.trim(value)
				if (key == 'width') or (key == 'float') then
					value = mw.ustring.lower(value)
				end
				if value ~= '' then
					return value
				end
			end
			return nil
		end
	return p._box(args)
end

function p.percent(frame)
	local args = getArgs(frame, {
		valueFunc = function 
			if value then
				value = mw.text.trim(value)
				if value ~= '' then
					return value
				end
			end
			return nil
		end
	return p._percent(args)
end

function p.pixel(frame)
	local args = getArgs(frame, {
		valueFunc = function 
			if value then
				value = mw.text.trim(value)
				if value ~= '' then
					return value
				end
			end
			return nil
		end
	return p._pixel(args)
end

function p.gap(frame)
	local args = getArgs(frame, {
		valueFunc = function 
			if value then
				value = mw.text.trim(value)
				if value ~= '' then
					return value
				end
			end
			return nil
		end
	return p._gap(args)
end

function p.stacked(frame)
	local args = getArgs(frame, {
		valueFunc = function 
			if value then
				value = mw.text.trim(value)
				if (key == 'collapsed') or (key == 'align') then
					value = mw.ustring.lower(value)
				end
				if value ~= '' then
					return value
				end
			end
			return nil
		end
	return p._stacked(args)
end