// Fixes priority and listas parameter in WikiProject Biography

private static readonly Regex WPBiography = Tools.NestedTemplateRegex(new List<string>("WPBiography,WikiProject Biography,Wikiproject Biography,WP Biography,WPBIO".Split(',')));
private static readonly Regex WorkGroup = new Regex(@"^([\w&]+)\-work\-group\s*=\s*", RegexOptions.Compiled);
public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
{
	// WPBiography priority fixes
	Skip = true;
	Summary = "Set WPBiography work group priorities: ";

	// process each WPBiography
	foreach(Match m in WPBiography.Matches(ArticleText))
	{
		string WPBiographyCall = m.Value, newValue = m.Value;

		// rename old importance field
		newValue = Tools.RenameTemplateParameter(newValue, "importance", "priority");

		string priority = Tools.GetTemplateParameterValue(newValue, "priority");
		string listas = Tools.GetTemplateParameterValue(newValue, "listas");
		//bool removePriority = false;
		bool addListas = false;


		//if(priority.Length == 0)
		//continue;

		int WPBiographyArgs = Tools.GetTemplateArgumentCount(WPBiographyCall);

		// process each parameter for work groups
		for(int a = 1; a <= WPBiographyArgs; a++)
		{
			string param = Tools.GetTemplateArgument(WPBiographyCall, a);
			param = WikiRegexes.Comments.Replace(param, "").Trim();

			if(WorkGroup.IsMatch(param))
			{
				string GroupName = WorkGroup.Match(param).Groups[1].Value;

				// set work group priority if not already set
				if(Tools.GetTemplateParameterValue(newValue, GroupName + "-work-group").Length > 0 &&
					Tools.GetTemplateParameterValue(newValue, GroupName + @"-priority").Length == 0)
				{
					if(Tools.GetTemplateParameterValue(newValue, "priority").Length > 0)
					{
						newValue = Tools.RenameTemplateParameter(newValue, "priority", GroupName + @"-priority");
					}
					else
					{
						newValue = Tools.SetTemplateParameterValue(newValue, GroupName + @"-priority", priority);
					}

					Skip = false;
					Summary += GroupName + @", ";
				}

				// remove empty work groups
				if(Tools.GetTemplateParameterValue(newValue, GroupName + "-work-group").Length == 0)
				{
					newValue = Tools.RemoveTemplateParameter(newValue, GroupName + "-work-group");
				}

				// remove empty priority
				if(Tools.GetTemplateParameterValue(newValue, "priority").Length == 0)
				{
					newValue = Tools.RemoveTemplateParameter(newValue, "priority");
				}
			}

			// add listas if missing
			if(listas.Length == 0)
			{
				string newListas = Tools.MakeHumanCatKey(ArticleTitle.Replace("Talk:", ""), ArticleText);
				listas = newListas;
				newValue = Tools.SetTemplateParameterValue(newValue, "listas", newListas);
				addListas = true;
				Skip = false;
			}

			// move listas to the bottom
			string ListasValue = Tools.GetTemplateParameterValue(newValue,"listas");
            		newValue =  Tools.RemoveTemplateParameter(newValue,"listas");
			newValue = Tools.SetTemplateParameterValue(newValue,"listas",ListasValue);

			// trim whitespace
			newValue=newValue.Replace(" |","|");
			newValue=newValue.Replace("| ","|");
		}

		// merge changes
		if(!m.Value.Equals(newValue))
		{
			ArticleText = ArticleText.Replace(m.Value, newValue);
			if(addListas)
			{
				Summary += "added listas";
			}
		}
	}
	return ArticleText;
}