Module:SCOTUS-termlist-entry

local p = {}

-- Color palette and wikitext for the opinion arguments. Each group is only mentioned once, e.g. majority stands for majority, 
-- majority1, majority2, majority3, majority4 and majority5
-- The color comes first in the table, then wikitext for numbered values, then wikitext for non-numbered values, 
-- and finally, human-friendly text that is output to screen reading software used by blind and low vision users.
-- Numbers in the wikitext are taken from the values themselves (e.g. majority1 has the wikitext "1" plus whatever wikitext that is
-- mentioned here.
-- Examples: plurality has the wikitext of "*" and the color "#00CD00"
--           plurality1 has the wikitext of "1*" - "1" is taken from the value itself and "*" comes from this table. It has 
--           the color "#00CD00".
--           Both plurality and plurality1 output the text "delivered the court's opinion" to screen readers.
   
local palette = {
	majority = {"#00CD00", "", "", "delivered the court's opinion"},
	plurality = {"#00CD00", "*", "*", "delivered the court's opinion"},
	concurrence = {"#00B2EE", "", "", "filed a concurrence"},
	concurrencewithoutopinion = {"#79CDCD", "", "-", "filed a concurrence"},
	concurrencedissent = {"#B23AEE", "", "", "filed a concurrence dissent"},
	concurrencedissentwithoutopinion = {"#CC99CC", "", "-", "filed a concurrence dissent"},
	dissent = {"red", "", "", "filed a dissent"},
	dissentwithoutopinion = {"#EE9572", "", "-", "filed a dissent without opinion"},
	joinmajority = {"#93DB70", "", "", "joined the court's opinion"},
	partjoinmajority = {"#93DB70", "*", "*", "partially joined the court's opinion"},
	joinplurality = {"#93DB70", "", "", "joined the court's opinion"},
	partjoinplurality = {"#93DB70", "*", "*", "partially joined the court's opinion"},
	joinconcurrence = {"#79CDCD", "", "", "joined a concurrence"},
	partjoinconcurrence = {"#79CDCD", "*", "*", "partially joined a concurrence"},
	joinconcurrencedissent = {"#CC99CC", "", "", "joined a concurrence dissent"},
	partjoinconcurrencedissent = {"#CC99CC", "*", "*", "partially joined a concurrence dissent"},
	joindissent = {"#EE9572", "", "", "joined a dissent"},
	partjoindissent = {"#EE9572", "*", "*", "partially joined a dissent"},
	didnotparticipate = {"white", "", "", "did not participate"},
	statement = {"gray", "", "", "statement"},
	statementwithoutopinion = {"gray", "", "-", "statement without opinion"},
	joinstatement = {"silver", "", "", "joined a statement"},
	partjoinstatement = {"silver", "*", "*", "partially joined a statement"},
	def = "",
}

function p.main(frame)
	local pframe = frame:getParent()
	local args = pframe.args
	
	if args.case then args.case = "''[[" .. args.case .. "]]''" else args.case = nil end
	if args["case1"] then args["case1"] = "''" .. args["case1"] .. "''" else args["case1"] = nil end
	if args["case-article"] then args["case-article"] = "''[[" .. args["case-article"] .. "|" .. args["case-display"] .. "]]''" 
		else args["case-article"] = nil end
	if args.page ~= nil and mw.text.trim(args.page) ~= "" then args.page = args.page else args.page = "___" end
	local entry = mw.html.create("tr")
	entry
		:tag("td")
		:css({
			width = "20px",
			["vertical-align"] = "center"
			})
		:wikitext(args["#"])
		:newline()
		:newline()
		:tag("td")
			:css({
				width = "200px",
				["vertical-align"] = "top"
				})
			:tag("small")
				:wikitext((args.case or "") .. (args["case1"] or "") .. (args["case-article"] or "") .. "," .. (args.note or "") .. 
					' <span class="nowrap">' .. args.volume .. " U.S. " .. (args.page) .. '</span>')
				:done()
			:done()
		:tag("td")
			:css({
				["vertical-align"] = "top",
				["text-align"] = "right"
				})
			:tag("small")
				:wikitext(args["argue-date"] or "")
				:done()
			:done()
		:tag("td")
			:css({
				["vertical-align"] = "top",
				["text-align"] = "right"
				})
			:tag("small")
				:wikitext(args["decision-date"])
	
	local width = {
		[1] = "74px",
		[2] = "36px",
		[3] = "23.33px",
		[4] = "17px",
		[5] = "13.2px",
	}
	local x = 1
	while x < 9 or args["justice" .. x .. "-opinion1"] ~= nil do
		local z = 1
		local entrysupp = mw.html.create("td")
		entrysupp
			:css({
				padding = "0px",
				margin = "0px",
				["vertical-align"] = "top",
				})
			:attr("data-sort-value", args["justice" .. x .. "-sortcode"])
		local entrysuppend = '</td>'
		if args["justice" .. x .. "-opinion1"] ~= nil then
			local subtable = mw.html.create("table")
			subtable
			:css({
				width = "100%",
				height = "3.7em",
				margin = "0px",
				})
			:attr("cellspacing", "0")
			while z < 6 and args["justice" .. x .. "-opinion" .. z] ~= nil and mw.text.trim(args["justice" .. x .. "-opinion" .. z]) ~= "" do
				z = z + 1
			end
			local i = 1
			while i < 6 and args["justice" .. x .. "-opinion" .. i] ~= nil and mw.text.trim(args["justice" .. x .. "-opinion" .. i]) ~= "" do
				if string.find(mw.text.trim(args["justice" .. x .. "-opinion" .. i]), "%d$") then
					opiniontext = string.match(args["justice" .. x .. "-opinion" .. i], "%d") .. (palette[
						string.match(args["justice" .. x .. "-opinion" .. i], "%a+")][2] or "")
				else
					opiniontext = (palette[mw.text.trim(args["justice" .. x .. "-opinion" .. i]) or "def"][3] or "")
				end
				opinion = mw.text.trim(args["justice" .. x .. "-opinion" .. i], "%d$")
				arialabel = 'aria-label="justice ' .. x .. ' ' .. palette[opinion][4] .. '" '
				secuential = '<td ' .. arialabel .. 'style="height: 3.7em; min-width:' .. width[z-1] .. '; text-align:center; outline: solid 0.5px darkgray;' ..  
				'background-color:' .. palette[(string.match(args["justice" .. x .. "-opinion" .. i], "%a+") or "def")][1] .. '">' .. 
				opiniontext .. '</td>'
				subtable:node(secuential)
				i = i + 1
			end
			entrysupp:node(subtable)
		end
		entry:node(entrysupp)
		entry:node(entrysuppend)
		x = x + 1
	end
	return tostring(entry)
end

return p