local p = {}

function p.main(frame)

--Get input arguments
local args = require('Module:Arguments').getArgs(frame,{valueFunc =
  function(key,value)
    if value then
      value = mw.text.trim(value)
      if key=="image" or value~="" then
        return value
      end
    end
    return nil
  end
})

--Call main function
return p.luaMain(frame,args)

end

function p.luaMain(frame,args)

	function emp2nil(x)
	  if x=="" then return nil else return x end
	end
	function space2emp(x)
	  if string.find(x,"^%s*$") then return "" else return x end
	end
	function nopx(x)
	  if x~=nil and (string.find(x,"^%d+$") or string.find(x,"^%d+px$")) then return string.gsub(x,"^(.*)px","%1") else return nil end
	end

	--Country & mode parameters
	local mode = string.lower(args[1] or "usc")
	local mi = string.sub(mode,1,1)
	local ms = string.sub(mode,2,2)
	local mn = string.sub(mode,3,3)
	local me = string.sub(mode,4,-1)

	local find= require('Module:تحويلات بلدان').red ------------------------------------ Just in Arabic
	local country = find( args[2] ) or ""
	local avar = args["avar"] or args["altvar"]
	local clink = args["clink"] or args["link"]

	--Get country data & altvar data
	local data, alink, amap, asuf , apre
	if avar then
	  local age = args["age"] or ""
	  local aalias
	  amap, aalias = require("Module:Flagg/Altvar data").alttable(age)
	  avar = string.gsub(string.lower(avar or ""),"[ \-]","")
	  avar = aalias[avar] or avar
	  if not amap[avar] then error("Unknown avar") end
	  local apar = {altvar=amap[avar].altvar;mw=amap[avar].mw;age=amap[avar].age;variant=args["variant"] or args[3]}
	  data = require("Module:CountryData").gettable(frame,country,apar)
	  asuf = amap[avar].altlink
	  apre = amap[avar].linkpre
	  alink = data["link alias-"..amap[avar].altvar] or (apre or '').." "..(clink or data["shortname alias"] or data.alias or country).." "..asuf
	else
	  data = require("Module:CountryData").gettable(frame,country,{variant=args["variant"] or args[3]})
	  avar = ""
	  amap = {[""]={altvar=""}}
	end

	--Name and link parameters
	clink = clink or data.alias or country

	local pref = args["pref"]
	local suff = args["suff"] or asuf
	if not pref and not suff then --Default prefix
	  pref = "علم"
	end
	local yn_map = {[""]=0; ["0"]=0; ["no"]=0; ["n"]=0; ["1"]=1; ["yes"]=1; ["y"]=1}
	local fthe = (args["pthe"] and yn_map[args["pthe"]]~=0) or (args["the"] and yn_map[args["the"]]~=0)
	local nthe = (args["nthe"] and yn_map[args["nthe"]]~=0) or (args["the"] and yn_map[args["the"]]~=0)
	fthe = fthe and (pref and "ا" or "ا").."ل " or ""
	nthe = nthe and (pref and "ا" or "ا").."ل " or ""
	local flink = args["plink"] or args["flink"] or alink or space2emp((pref or "").." ")..fthe..clink..space2emp(" "..(suff or ""))
	local fsec = args["psection"] or args["section"]
	local csec = args["csection"] or args["section"]
	fsec = fsec and "#"..fsec or ""
	csec = csec and "#"..csec or ""

	local name = args["name"]
	if string.find(me,"e") then
	  local cname = data["name alias-"..amap[avar].altvar] or data["shortname alias"] or data.alias or country
	  if mn == "f" then
		name = name or space2emp((pref or "").." ")..nthe..cname..space2emp(" "..(suff or ""))
	  else
		name = name or cname
	  end
	else
	  if mn == "f" then
		name = name or space2emp((pref or "").." ")..nthe..country..space2emp(" "..(suff or ""))
	  else
		name = name or country
	  end
	end

	--Image parameters
	local pimage = args["image"]
	local placeholder = "Flag placeholder.svg"
	local variant = args["variant"] or args[3] or ""
	local image_map = {[""]=placeholder; ["none"]=placeholder; ["blank"]=placeholder}
	if pimage then --Remove namespace
	  pimage = string.gsub(pimage,"^[Ff][Ii][Ll][Ee]:(.*)$","%1")
	  pimage = string.gsub(pimage,"^[Ii][Mm][Aa][Gg][Ee]:(.*)$","%1")
	end
	local iname = image_map[pimage] or pimage

	local size = args["size"] or args["sz"]
	local size_map = {xs="12x8px"; s="17x11px"; m="23x15px"; l="32x21px"; xl="46x30px"}
	if size==nil or string.find(size,"^%d*x?%d+px$")
	  then --valid EIS size (..px, x..px or ..x..px), or unset
	elseif string.find(size,"^%d*x?%d+$")
	  then size=size.."px" --EIS size without "px" suffix
	  else size = size_map[size] or nil
	end
	local border = frame:getParent().args["border"] or frame.args["border"]

	if iname then
	  size = size or "23x15px"
	  if yn_map[border]==0 then border = "" else border = "|border" end
	else
	  iname = data["flag alias-"..amap[avar].altvar.."-"..variant] or data["flag alias-"..variant] or data["flag alias-"..amap[avar].altvar] or data["flag alias"] or placeholder
	  size = size or emp2nil(data.size) or "23x15px"
	  if border then
		if yn_map[border]==0 then border = "" else border = "|border" end
	  else
		local autoborder = data["border-"..variant] or data["border-"..amap[avar].altvar] or data.border
		if autoborder and autoborder~="border" then border = "" else border = "|border" end
	  end
	end

	local am = ""
	if args["alt"] or string.find(me,"a") then
	  am = args["alt"] or args["name"] or country
	  am = am.."|"..am
	end

	--Build display name
	local naaaa = args["naaaa"] or 'بيانات بلد'
	local text = args["text"]
	if not text then
	  if mn=="x" then --no text
		text = ""
	  elseif mn=="p" or mn=="f" then --prefix/suffix link
		text = "[["..flink..fsec.."|"..name.."]]"
	  elseif mn=="b" then --both prefix/suffix and normal country link
		if pref and suff then
		  text = "[["..flink..fsec.."|"..pref.."]] "..nthe.."[["..clink..csec.."|"..name.."]] [["..flink..fsec.."|"..suff.."]]"
		elseif pref then
		  text = "[["..flink..fsec.."|"..pref.."]] "..nthe.."[["..clink..csec.."|"..name.."]]"
		elseif suff then
		  text = nthe.."[["..clink..csec.."|"..name.."]] [["..flink..fsec.."|"..suff.."]]"
		else
		  text = nthe.."[["..clink..csec.."|"..name.."]]"
		end
	  elseif mn=="d" then --data template
		--check if redirect
		if require('Module:Redirect').luaIsRedirect("Template:" .. naaaa ..  " "..country) then
		  text = "<span class=\"plainlinks\">["..mw.title.new("Template:" .. naaaa ..  " "..country):fullUrl("redirect=no").." "..name.."]</span>"
		else
		  text = "[[Template:" .. naaaa ..  " "..country.."|"..name.."]]"
		end
	  elseif mn=="u" then --unlinked
		text = name
	  else --country link (default)
		text = "[["..clink..csec.."|"..name.."]]"
	  end
	end

	--Build image
	local ilink = args["ilink"]
	if not ilink then
	  if mi=="x" or (iname==placeholder and pimage~=placeholder) then --no image/invisible image
		iname = placeholder
		border = ""
		ilink = "|link="
		am = ""
	  elseif mi=="i" then --image page link
		ilink = ""
	  elseif mi=="c" then --country link
		ilink = "|link="..clink..csec
	  elseif mi=="p" or mi=="f" then --prefix/suffix link
		ilink = "|link="..flink..fsec
	  elseif mi=="d" then --data template
		--check if redirect
			if require('Module:Redirect').luaIsRedirect("Template:" .. naaaa ..  " "..country) then
			  ilink = "|link="..mw.title.new("Template:" .. naaaa .. " "..country):fullUrl("redirect=no")
			else
			  ilink = "|link=Template:" .. naaaa .. " "..country
			end
	  else --unlinked (default)
		ilink = "|link="
	  end
	end
	local image = "[[File:"..iname.."|"..size..border..ilink.."|alt="..am.."]]"

	--Combine image and name with separator
	local align = args["align"] or args["al"]
	local nalign = args["nalign"] or args["nal"]
	local align_map = {left="left", l="left", center="center", centre="center", c="center", middle="center", m="center", right="right", r="right"}
	local out
	if string.find(me,"r") then
	  --image right of name
	  if (ms=="x" and mi=="x") or (string.find(me,"o") and iname==placeholder and pimage~=placeholder) then --name only
		out = text
	  elseif ms=="x" then --no separator
		out = text.."<span class=\"flagicon\">"..image.."</span>"
	  elseif ms=="n" then --non-breaking space
		out = text.."<span class=\"flagicon\">&nbsp;"..image.."</span>"
	  elseif ms=="l" then --line break
		out = text.."<span class=\"flagicon\"><br/>"..image.."</span>"
	  elseif ms=="t" then --table cell
		out = "style=\"text-align:"..(align_map[nalign] or "left").."\"|"..text.."||style=\"text-align:"..(align_map[align] or "center")..";\"|<span class=\"flagicon\">"..image.."</span>"
	  else --fixed-width span box (default)
		local width = args["width"] or args["w"] or require("Module:Flaglist/size").luawidth(size)
		out = text.."<span class=\"flagicon\" style=\"display:inline-block;width:"..width.."px;text-align:"..(align_map[align] or "right")..";\">"..image.."</span>"
	  end
	 else --image left of name
	  if (ms=="x" and mi=="x") or (string.find(me,"o") and iname==placeholder and pimage~=placeholder) then --name only
		out = text
	  elseif ms=="x" then --no separator
		out = "<span class=\"flagicon\">"..image.."</span>"..text
	  elseif ms=="n" then --non-breaking space
		out = "<span class=\"flagicon\">"..image.."&nbsp;</span>"..text
	  elseif ms=="l" then --line break
		out = "<span class=\"flagicon\">"..image.."<br/></span>"..text
	  elseif ms=="t" then --table cell
		out = "style=\"text-align:"..(align_map[align] or "center")..";\"|<span class=\"flagicon\">"..image.."</span>||style=\"text-align:"..(align_map[nalign] or "left").."\"|"..text
	  else --fixed-width span box (default)
		local width = nopx(args["width"] or args["w"]) or require("Module:Flaglist/size").luawidth(size)
		out = "<span class=\"flagicon\" style=\"display:inline-block;width:"..width.."px;text-align:"..(align_map[align] or "left")..";\">"..image.."</span>"..text
	  end
	end
	if string.find(me,"w") then --avoid wrapping
	  out = "<span class=\"nowrap\">"..out.."</span>"
	end

	--Tracking categories
	local cat = ""
	if pimage and not image_map[pimage] and country~="" and data["flag alias"] and not args.demo then
	  cat = "[[Category:Pages using Flagg with specified image instead of data template image]]"
	end

	return out..cat

end

return p