Module documentation
local p = {}

local getArgs = require('Module:Arguments').getArgs
local isIpOrRange = require('Module:IPAddress').isIpOrRange

local middot = ' • '
local reason = 'per [[:m:Special:Redirect/page/' .. mw.title.getCurrentTitle().id .. '|request]]';

local extlink = function(url, text, title)
	return '<span title="' ..  title .. '">[' .. tostring(url) .. (text and ' ' .. text or '') .. ']</span>'
end
local link = function(page, param, text, title)
	return extlink(mw.uri.fullUrl(page, param), text, title)
end

function p.multi_lock(frame)
	local args = getArgs(frame)
	local text = ''
	local users = {}
	local params = {}
	local wpTarget = ''
	
	for k, v in pairs(args) do
		if v and (v ~= '') then
			if type(k) == 'number' then
				users[k] = mw.text.trim(v)
			else
				params[k] = mw.text.trim(v)
			end
		end
	end
	
	if #users == 0 then
		error('You must specify at least one user', 0)
	end
	
	for k, v in pairs(users) do
		wpTarget = wpTarget .. v .. '\n'
		params[1] = v
		text = text .. '<li>' .. p._lock_hide(params) .. '</li>'
	end
	
	wpTarget = mw.text.trim(wpTarget)
	
	local link = tostring(mw.uri.fullUrl('Special:MultiLock', {wpReason=reason, wpTarget=wpTarget}));  -- reason for scripts that support it
	
	text = '<b class="plainlinks tpl-permalink-reason" data-linktype="MultiLock">[' .. link .. ' Lock all]:</b><ul>' .. text .. '</ul>'
	
	return text
end

function p.lock_hide(frame)
	local args = getArgs(frame, {
		trim = true,
		removeBlanks = true
	})
	return p._lock_hide({
		[1] = args[1],
		[2] = args[2],
		hidename = args['hidename']
	})
end

-- For attribution: [[Template:LockHide]]
function p._lock_hide(args)
	local username = args[1] or 'Example user'
	local interwiki = args[2] or ''
	local hidename = not not args['hidename'] or false
	local hide = function(text, fallback)
		return hidename and '<abbr title="name hidden">' .. (
			fallback and '<i>' .. text .. '</i>' or text
		) .. '</abbr>' or (fallback or text)
	end
	
	local srga = mw.title.getCurrentTitle():isSubpageOf(
		mw.title.new('Steward requests/Global')
	)
	if srga then
		return '[[Special:CentralAuth/' .. username .. '|' .. (
			hide('name hidden', username)
		) .. ']]'
	end
	
	local IpOrRange = isIpOrRange({args = {username}});
	
	local text = {
		'<span class="plainlinks tpl-permalink-reason">',
		extlink(
			mw.title.new(interwiki .. 'User:' .. username):fullUrl(),
			hidename and '<i>name hidden</i>' or username,
			hidename and 'name hidden' or interwiki .. 'User:' .. username
		),
		'&nbsp;',
		'(',
		'[[' .. interwiki .. 'User talk:' .. username .. '|' ..  hide('talk') .. ']]',
		middot,
		'[[' .. interwiki .. 'Special:Contributions/' .. username .. '|' .. hide('contribs') .. ']]',
		middot,
		'[[' .. interwiki .. 'Special:Block/' .. username .. '|' .. hide('block') .. ']]',
		middot,
		(
			IpOrRange == 'range' and
			link(
				'xtools:globalcontribs/ipr-' .. username,
				nil,
				'xwiki-contribs',
				'XTools'
			) or
			link(
				'toolforge:guc',
				{
					user = username,
					blocks = true
				},
				'xwiki-contribs',
				'GUC by wiki'
			) ..
			middot ..
			link(
				'toolforge:guc',
				{
					user = username,
					by = 'date',
					blocks = true
				},
				'xwiki-date',
				'GUC by date'
			) ..
			'&nbsp;' ..
			'<sup>(' ..
				link('xtools:globalcontribs/' .. username, nil, 'alt', 'XTools') ..
			')</sup>'
		),
		middot,
		link(
			'Special:CentralAuth',
			{
				target = username,
				wpReason = 'other',
				['wpReason-other'] = reason,  -- reason for scripts that support it
			},
			'CA',
			'CentralAuth'
		),
		middot,
		link(
			'Special:GlobalBlock',
			{
				wpAddress = username,
				wpExpiry = IpOrRange == '' and 'infinite' or 'other',
				wpReason = 'other',
				['wpReason-other'] = reason,
			},
			'gblock',
			'global block'
		),
		middot,
		link('toolforge:meta/stalktoy/' .. username, nil, 'ST', 'Stalk toy'),
		middot,
		extlink(
			tostring(mw.uri.new('//login.wikimedia.org/w/index.php'):extend({
				title = 'Special:CheckUser',
				user = username,
				uselang = 'en',
				reason = reason,
			})),
			'<b>lwcheckuser</b>',
			'Login Wiki CheckUser'
		),
		')',
		'</span>',
		'__NOINDEX__'
	}
	return table.concat(text, '')
end

return p