Módulo:Testes/Gkiyoshinishimoto/Protected edit request

require('strict')

local yesno = require('Módulo:Testes/Gkiyoshinishimoto/Yesno')
local makeMessageBox = require('Módulo:Testes/Gkiyoshinishimoto/Message box').main
local getArgs

local activeBox -- Inicializado preguiçosamente se recebermos uma solicitação ativa

----------------------------------------------------------------------
-- Definição de classe de caixa
----------------------------------------------------------------------

local box = {}
box.__index = box

function box.new(protectionType, args)
	local obj = {}
	obj.args = args
	setmetatable(obj, box)
	obj.tmboxArgs = {} -- Usado para armazenar argumentos a serem passados para "tmbox" pelo método "box:export".
	-- Define os campos de dados.
	obj.tmboxArgs.attrs = { ['data-origlevel'] = protectionType }
	return obj
end

function box:setArg(key, value)
	-- Isso define um valor a ser passado para "tmbox".
	if key then
		self.tmboxArgs[key] = value
	end
end

function box:export()
	local title = mw.title.getCurrentTitle()
	local skipCheck = yesno(self.args.demo) or yesno(self.args.skiptalk)
	if not title.isTalkPage and not skipCheck then
		return '<span class="error">Erro: Solicitações de edição protegidas só podem ser feitas na página de discussão.</span>[[Categoria:!Páginas que não são de discussão com uma predefinição de solicitação de edição]]'
	end

	-- Sequencia os nomes de páginas fornecidos juntos
	local titles = {}
	for k, v in pairs(self.args) do
		if type(k) == 'number' then
			table.insert(titles, self.args[k])
		end
	end
	local pagesText
	if #titles == 0 then
		pagesText = ''
	elseif #titles == 1 and mw.title.getCurrentTitle().subjectPageTitle.fullText == titles[1] then
		pagesText = ''
	else 
		for i, v in pairs(titles) do
		    if i == 1 then
		        pagesText = ' para [[:' .. v .. ']]'
		    elseif i == #titles then
		        pagesText = pagesText .. ' e [[:' .. v .. ']]'
		    else
		        pagesText = pagesText .. ', [[:' .. v .. ']]'
		    end
		end
	end
	
	self:setArg('smalltext', "Esta solicitação de edição" .. pagesText ..
		" foi respondida. Defina o parâmetro <code style=\"white-space: nowrap;\">&#124;answered&#61;</code> ou <code style=\"white-space: nowrap;\">&#124;ans&#61;</code> como '''no''' para reativar sua solicitação.")
	self:setArg('small', true)
	self:setArg('class', 'editrequest')
	return makeMessageBox('tmbox', self.tmboxArgs)
end

----------------------------------------------------------------------
-- Processa argumentos e inicializa objetos
----------------------------------------------------------------------

local p = {}

function p._main(protectionType, args)
	local boxType = box
	if not yesno(args.answered or args.ans, true) then
		if not activeBox then
			activeBox = require('Módulo:Testes/Gkiyoshinishimoto/Protected edit request/active')(box, yesno, makeMessageBox)
		end
		boxType = activeBox
	end
	local requestBox = boxType.new(protectionType, args)
	return requestBox:export()
end

local mt = {}

function mt.__index(t, k)
	if not getArgs then
		getArgs = require('Módulo:Testes/Gkiyoshinishimoto/Arguments').getArgs
	end
	return function (frame)
		return t._main(k, getArgs(frame, {wrappers = {'Predefinição:Teste/Gkiyoshinishimoto/Edit fully-protected', 'Predefinição:Teste/Gkiyoshinishimoto/Edit semi-protected', 'Predefinição:Teste/Gkiyoshinishimoto/Edit template-protected', 'Predefinição:Teste/Gkiyoshinishimoto/Edit extended-protected', 'Predefinição:Teste/Gkiyoshinishimoto/Edit interface-protected'}}))
	end
end

return setmetatable(p, mt)