Mô đun:Infobox television season name

-- This module requires the use of Module:Arguments.
local getArgs = require('Module:Arguments').getArgs

local pipedLink = ""

local p = {}

-- Local function which is used to create an pipped article link.
local function createArticleTitleWithPipedLink(article)
	if (pipedLink == nil or pipedLink == "") then
		return ""
	else
		return "[[" .. article .. "|" .. pipedLink .. "]]"
	end
end

--[[
Local function which is used to check if the given article exists.
The function returns "true" in the following cases:
	-- A season article exists.
	-- A redirect exists to a season section.

The function returns nil in the following cases:
	-- A season article or redirect do not exist.
	-- A redirect exists, but it is a general redirect and not for any specific season section.
]]--
local function checkArticle(articleName)
	local article = mw.title.new(articleName)
	if (article ~= nil and article.exists) then
		local redirectTarget = article.redirectTarget
		if (redirectTarget) then
			local fullLink = redirectTarget.fullText
			local isSection = fullLink:find("#")
			if (isSection) then
				return "true"								-- Article is a section redirect; Valid link.
			else
				return nil									-- Article is a general redirect; Not a valid link.
			end
		else
			return "true"									-- Article exists and is not a redirect; Valid link.
		end
	else
		return nil											-- Article or redirect do not exist; Not a valid link.
	end
end

--[[
Local function which is used to create a TV season link.

The following are the supported season naming styles:
	-- <showName> (<seasonQualifier> <seasonType>)
		Example: Big Brother 1 (U.S. season).
	-- <showName> (<seasonType> <seasonNumber>)
		Example: Lost (season 3).
	-- <showName> (<seasonQualifier> <seasonType> <seasonNumber>)
		Example: The Flash (2014 season 3).
	-- <showName> <preSeasonQualifier> (<seasonType> <seasonNumber>)
		Example: Dallas (1978 TV series) (season 3).
	-- <showName> <preSeasonQualifier> (<seasonQualifier> <seasonType> <seasonNumber>)
		Example: No current example.
	-- <showName> (<preSeasonQualifier>, <seasonType> <seasonNumber>) - TODO
		Example: Teenage Mutant Ninja Turtles (1987 TV series, season 1)
--]]
local function createLink(args, prevOrNextSeasonNumber)
	local showName = args[1] or args['show_name']
	if (showName == nil) then
		return ""
	end	
	
	showName = showName .. " "

	local preSeasonQualifier = args[2] or args['pre_season_qualifier']
	if (preSeasonQualifier == nil) then
		preSeasonQualifier = ""
	else
		preSeasonQualifier = preSeasonQualifier .. " "
	end
	
	local seasonQualifier = args[3] or args['season_qualifier']
	if (seasonQualifier == nil) then
		seasonQualifier = ""
	else 
		seasonQualifier = seasonQualifier .. " "
	end
	
	local seasonType = args[4] or args['season_type']
	if (seasonType == nil) then
		seasonType = "season"
	end

	local realitySeriesStyle = false
	local showNameModified
	local seasonNumber = args[5] or args['season_number']
	if (seasonNumber == nil) then
		if (string.match(showName , "%s+(%d+)")) then
			_, _, showNameModified, seasonNumber = string.find(showName, "(.*)%s+(%d+)")
			realitySeriesStyle = true
		else
			return "" -- Not a valid next/prev season link
		end
	end

	if (tonumber(seasonNumber) == nil) then
		return ""
	else
		seasonNumber = seasonNumber + prevOrNextSeasonNumber
		pipedLink = seasonType:gsub("^%l", string.upper) .. " " .. seasonNumber
		
		if (realitySeriesStyle) then
			return showNameModified .. " " .. seasonNumber .. " (" .. seasonQualifier .. seasonType .. ")"
		else
			return showName .. preSeasonQualifier .. "(" .. seasonQualifier .. seasonType .. " " .. seasonNumber .. ")"
		end
	end
end

-- Local function which is called to create a TV season link for the next season.
-- Passes the value "1" to increment the current season number.
local function createNextSeasonArticle(args)
	return createLink(args, 1)
end

-- Local function which is called to create a TV season link for the previous season.
-- Passes the value "-1" to decrement the current season number.
local function createPreviousSeasonArticle(args)
	return createLink(args, -1)
end

--[[
Wrapper function which handles the processing of the arguments 
from multiple public invoked functions.

Parameters:
	-- |show_name=				— required; The title of TV program.
	-- |pre_season_qualifier=	— optional; For cases where disambiguation before the season is required
											(e.g. the pre-season qualifier for Dallas (1978 TV series) (season 7) is (1978 TV series)).
	-- |season_qualifier=		— optional; For cases where disambiguation (typically of the show's origin country) before the season type is required
											(e.g. the season qualifier for The Apprentice (U.S. season 2) is U.S.).
	-- |season_type=			— optional; To determine the usage of the word "season" for American-based shows, or "series" for shows using British-English.
	-- |season_number=			— optional; Season number. The N season of this particular show. 
--]]
local function makeInvokeFunc(funcName)
	return function (frame)
		local args = getArgs(frame)
		return p[funcName](args)
	end
end

p.checkNextSeason = makeInvokeFunc('_checkNextSeason')

--[[
Public function which is used to check if the next season has
a created article or redirect.

Parameters: See makeInvokeFunc() for documentation.
--]]
function p._checkNextSeason(args)
	local articleName = createNextSeasonArticle(args)
	return checkArticle(articleName)
end

p.checkPrevSeason = makeInvokeFunc('_checkPrevSeason')

--[[
Public function which is used to check if the previous season has
a created article or redirect.

Parameters: See makeInvokeFunc() for documentation.
--]]
function p._checkPrevSeason(args)
	local articleName = createPreviousSeasonArticle(args)
	return checkArticle(articleName)
end

p.checkAll = makeInvokeFunc('_checkAll')

--[[
Public function which is used to check if the next or previous season have
a created article or redirect.

Parameters: See makeInvokeFunc() for documentation.
--]]
function p._checkAll(args)
	if (p._checkPrevSeason(args) == "true") then
		return "true"
	else
		return p._checkNextSeason(args)
	end
end

p.getNextSeasonArticle = makeInvokeFunc('_getNextSeasonArticle')

--[[
Public function which is used to get the next season article title.

Parameters: See makeInvokeFunc() for documentation.
--]]
function p._getNextSeasonArticle(args)
	local articleTitle = createNextSeasonArticle(args)
	return createArticleTitleWithPipedLink(articleTitle)
end

p.getPrevSeasonArticle = makeInvokeFunc('_getPrevSeasonArticle')

--[[
Public function which is used to get the previous season article title.

Parameters: See makeInvokeFunc() for documentation.
--]]
function p._getPrevSeasonArticle(args)
	local articleTitle = createPreviousSeasonArticle(args)
	return createArticleTitleWithPipedLink(articleTitle)
end

return p