/
com/planet_ink/coffee_mud/Abilities/Common/
com/planet_ink/coffee_mud/Abilities/Diseases/
com/planet_ink/coffee_mud/Abilities/Druid/
com/planet_ink/coffee_mud/Abilities/Fighter/
com/planet_ink/coffee_mud/Abilities/Languages/
com/planet_ink/coffee_mud/Abilities/Misc/
com/planet_ink/coffee_mud/Abilities/Prayers/
com/planet_ink/coffee_mud/Abilities/Properties/
com/planet_ink/coffee_mud/Abilities/Skills/
com/planet_ink/coffee_mud/Abilities/Songs/
com/planet_ink/coffee_mud/Abilities/Spells/
com/planet_ink/coffee_mud/Abilities/Thief/
com/planet_ink/coffee_mud/Abilities/Traps/
com/planet_ink/coffee_mud/Behaviors/
com/planet_ink/coffee_mud/CharClasses/interfaces/
com/planet_ink/coffee_mud/Commands/
com/planet_ink/coffee_mud/Commands/interfaces/
com/planet_ink/coffee_mud/Common/
com/planet_ink/coffee_mud/Common/interfaces/
com/planet_ink/coffee_mud/Exits/interfaces/
com/planet_ink/coffee_mud/Items/Armor/
com/planet_ink/coffee_mud/Items/Basic/
com/planet_ink/coffee_mud/Items/CompTech/
com/planet_ink/coffee_mud/Items/MiscMagic/
com/planet_ink/coffee_mud/Items/Weapons/
com/planet_ink/coffee_mud/Items/interfaces/
com/planet_ink/coffee_mud/Libraries/
com/planet_ink/coffee_mud/Libraries/interfaces/
com/planet_ink/coffee_mud/Locales/
com/planet_ink/coffee_mud/MOBS/
com/planet_ink/coffee_mud/Races/
com/planet_ink/coffee_mud/Races/interfaces/
com/planet_ink/coffee_mud/WebMacros/
com/planet_ink/coffee_mud/WebMacros/interfaces/
com/planet_ink/coffee_mud/core/
com/planet_ink/coffee_mud/core/collections/
com/planet_ink/coffee_mud/core/interfaces/
com/planet_ink/coffee_mud/core/intermud/
com/planet_ink/coffee_mud/core/intermud/i3/
com/planet_ink/coffee_web/server/
com/planet_ink/siplet/applet/
lib/
resources/factions/
resources/fakedb/
resources/progs/autoplayer/
resources/quests/holidays/
web/
web/admin.templates/
web/admin/grinder/
web/admin/images/
web/clan.templates/
web/pub.templates/
web/pub/images/mxp/
web/pub/sounds/
web/pub/textedit/
package com.planet_ink.coffee_mud.Libraries;
import com.planet_ink.coffee_mud.core.interfaces.*;
import com.planet_ink.coffee_mud.core.*;
import com.planet_ink.coffee_mud.core.collections.*;
import com.planet_ink.coffee_mud.Libraries.interfaces.*;
import com.planet_ink.coffee_mud.Abilities.interfaces.*;
import com.planet_ink.coffee_mud.Areas.interfaces.*;
import com.planet_ink.coffee_mud.Behaviors.interfaces.*;
import com.planet_ink.coffee_mud.CharClasses.interfaces.*;
import com.planet_ink.coffee_mud.Commands.interfaces.*;
import com.planet_ink.coffee_mud.Common.interfaces.*;
import com.planet_ink.coffee_mud.Exits.interfaces.*;
import com.planet_ink.coffee_mud.Items.interfaces.*;
import com.planet_ink.coffee_mud.Locales.interfaces.*;
import com.planet_ink.coffee_mud.MOBS.interfaces.*;
import com.planet_ink.coffee_mud.Races.interfaces.*;

import java.util.*;

/*
   Copyright 2008-2016 Bo Zimmerman

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

	   http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/
public class AutoTitles extends StdLibrary implements AutoTitlesLibrary
{
	@Override public String ID(){return "AutoTitles";}
	private TriadSVector<String,String,MaskingLibrary.CompiledZapperMask> autoTitles=null;

	private static final String titleFilename = "titles.ini";
	
	private String getTitleFilename()
	{
		CMFile F = new CMFile(Resources.makeFileResourceName(titleFilename),null);
		if(F.exists() && (F.canRead()))
			return titleFilename;
		final String oldFilename = titleFilename.substring(0,titleFilename.length()-4)+".txt"; 
		F = new CMFile(Resources.makeFileResourceName(oldFilename),null);
		if(F.exists() && (F.canRead()))
			return oldFilename;
		return titleFilename;
	}

	@Override
	public String evaluateAutoTitle(String row, boolean addIfPossible)
	{
		if(row.trim().startsWith("#")||row.trim().startsWith(";")||(row.trim().length()==0))
			return null;
		int x=row.indexOf('=');
		while((x>=1)&&(row.charAt(x-1)=='\\'))
			x=row.indexOf('=',x+1);
		if(x<0)
			return "Error: Invalid line! Not comment, whitespace, and does not contain an = sign!";
		final String title=row.substring(0,x).trim();
		final String mask=row.substring(x+1).trim();

		if(title.length()==0)
			return "Error: Blank title: "+title+"="+mask+"!";
		if(mask.length()==0)
			return "Error: Blank mask: "+title+"="+mask+"!";
		if(addIfPossible)
		{
			if(autoTitles==null)
				reloadAutoTitles();
			for(final Triad<String,String,MaskingLibrary.CompiledZapperMask> triad : autoTitles)
				if(triad.first.equalsIgnoreCase(title))
					return "Error: Duplicate title: "+title+"="+mask+"!";
			autoTitles.add(new Triad<String,String,MaskingLibrary.CompiledZapperMask>(title,mask,CMLib.masking().maskCompile(mask)));
		}
		return null;
	}
	@Override
	public boolean isExistingAutoTitle(String title)
	{
		if(autoTitles==null)
			reloadAutoTitles();
		title=title.trim();
		for(final Triad<String,String,MaskingLibrary.CompiledZapperMask> triad : autoTitles)
			if(triad.first.equalsIgnoreCase(title))
				return true;
		return false;
	}

	@Override
	public Enumeration<String> autoTitles()
	{
		if(autoTitles==null)
			reloadAutoTitles();
		return autoTitles.firstElements();
	}

	@Override
	public String getAutoTitleMask(String title)
	{
		if(autoTitles==null)
			reloadAutoTitles();
		for(final Triad<String,String,MaskingLibrary.CompiledZapperMask> triad : autoTitles)
			if(triad.first.equalsIgnoreCase(title))
				return triad.second;
		return "";
	}

	@Override
	public boolean evaluateAutoTitles(MOB mob)
	{
		if(mob==null)
			return false;
		final PlayerStats P=mob.playerStats();
		if(P==null)
			return false;
		if(autoTitles==null)
			reloadAutoTitles();
		String title=null;
		MaskingLibrary.CompiledZapperMask mask=null;
		int pdex=0;
		final List<String> ptV=P.getTitles();
		boolean somethingDone=false;
		synchronized(ptV)
		{
			for(final Triad<String,String,MaskingLibrary.CompiledZapperMask> triad : autoTitles)
			{
				mask=triad.third;
				title=triad.first;
				pdex=ptV.indexOf(title);
				if(pdex<0)
				{
					final String fixedTitle = CMStrings.removeColors(title).replace('\'', '`');
					for(int p=ptV.size()-1;p>=0;p--)
					{
						try
						{
							final String tit=CMStrings.removeColors(ptV.get(p)).replace('\'', '`');
							if(tit.equalsIgnoreCase(fixedTitle))
							{ pdex=p; break;}
						}catch(final java.lang.IndexOutOfBoundsException ioe){}
					}
				}

				if(CMLib.masking().maskCheck(mask,mob,true))
				{
					if(pdex<0)
					{
						if(ptV.size()>0)
							ptV.add(0,title);
						else
							ptV.add(title);
						somethingDone=true;
					}
				}
				else
				if(pdex>=0)
				{
					somethingDone=true;
					ptV.remove(pdex);
				}
			}
		}
		return somethingDone;
	}

	protected void dispossesTitle(String title)
	{
		final List<String> list=CMLib.database().getUserList();
		final String fixedTitle = CMStrings.removeColors(title).replace('\'', '`');
		for(final String playerName : list)
		{
			final MOB M=CMLib.players().getLoadPlayer(playerName);
			if(M.playerStats()!=null)
			{
				final List<String> ptV=M.playerStats().getTitles();
				synchronized(ptV)
				{
					int pdex=ptV.indexOf(title);
					if(pdex<0)
					{
						for(int p=ptV.size()-1;p>=0;p--)
						{
							try
							{
								final String tit=CMStrings.removeColors(ptV.get(p)).replace('\'', '`');
								if(tit.equalsIgnoreCase(fixedTitle))
								{ pdex=p; break;}
							}catch(final java.lang.IndexOutOfBoundsException ioe){}
						}
					}
					if(pdex>=0)
					{
						ptV.remove(pdex);
						if(!CMLib.flags().isInTheGame(M,true))
							CMLib.database().DBUpdatePlayerPlayerStats(M);
					}
				}
			}
		}
	}
	
	@Override
	public void appendAutoTitle(String text)
	{
		Resources.removeResource(this.getTitleFilename());
		final CMFile F=new CMFile(Resources.makeFileResourceName(titleFilename),null,CMFile.FLAG_LOGERRORS);
		F.saveText(text,true);
		reloadAutoTitles();
	}

	@Override
	public String deleteTitleAndResave(String title)
	{
		dispossesTitle(title);
		final CMFile F=new CMFile(Resources.makeFileResourceName(titleFilename),null,CMFile.FLAG_LOGERRORS);
		if(F.exists())
		{
			final boolean removed=Resources.findRemoveProperty(F, title);
			if(removed)
			{
				Resources.removeResource(titleFilename);
				reloadAutoTitles();
				return null;
			}
			return "Unable to delete title!";
		}
		return "Unable to open "+titleFilename+"!";
	}

	@Override
	public void reloadAutoTitles()
	{
		autoTitles=new TriadSVector<String,String,MaskingLibrary.CompiledZapperMask>();
		final List<String> V=Resources.getFileLineVector(Resources.getFileResource(this.getTitleFilename(),true));
		String WKID=null;
		for(int v=0;v<V.size();v++)
		{
			final String row=V.get(v);
			WKID=evaluateAutoTitle(row,true);
			if(WKID==null)
				continue;
			if(WKID.startsWith("Error: "))
				Log.errOut("CharCreation",WKID);
		}
		for(final Enumeration<MOB> e=CMLib.players().players();e.hasMoreElements();)
		{
			final MOB M=e.nextElement();
			if(M.playerStats()!=null)
			{
				if((evaluateAutoTitles(M))&&(!CMLib.flags().isInTheGame(M,true)))
					CMLib.database().DBUpdatePlayerPlayerStats(M);
			}
		}
	}
	
	@Override
	public String getAutoTitleInstructions()
	{
		final StringBuffer buf=new CMFile(Resources.makeFileResourceName(this.getTitleFilename()),null,CMFile.FLAG_LOGERRORS).text();
		final StringBuffer inst=new StringBuffer("");
		List<String> V=new Vector<String>();
		if(buf!=null)
			V=Resources.getFileLineVector(buf);
		for(int v=0;v<V.size();v++)
		{
			if(V.get(v).startsWith("#"))
				inst.append(V.get(v).substring(1)+"\n\r");
			else
			if(V.get(v).length()>0)
				break;
		}
		return inst.toString();
	}

}