package basics.collections.index;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import basics.filesystem.serializer.Serializer;
import basics.utl.SUtl;

public class MultiLang extends Indexable
{
private static final String TOSTRING   = "{% % %}";
List<String>                languages  = new ArrayList<String>();
public String               scriptType = "";

/**
 * This is basically an example of a descriptor.
 * Note: it is necessary to implement a create Method, because of
 * limitation with the generics a template object has to be used which
 * then creates a new empty object.
 */
private MultiLang()
{
   super(null);
}

public MultiLang create()
{
   return new MultiLang();
}

public MultiLang(String key, String [] languages, String scriptType)
{
   super(key);
   if(languages != null)
      for(String lang : languages)
         add(lang);
   if(scriptType != null)
      this.scriptType = scriptType;
}

public MultiLang(String key, String [] languages)
{
   super(key);
   if(languages != null)
      for(String lang : languages)
         add(lang);
}

public static MultiLang loadInstance(Serializer serializer)
{
   MultiLang t = new MultiLang();
   if(!t.load(serializer))
      return null;
   try
   {
      t.languages = serializer.readStringList();
      return t;
   }
   catch(IOException e)
   {
      return null;
   }
}

public boolean save(Serializer serializer)
{
   if(!super.save(serializer))
      return false;
   try
   {
      serializer.writeListOfStrings(languages);
      return true;
   }
   catch(IOException e)
   {
      return false;
   }
}

public void merge(Indexable t)
{
   for(String a : ((MultiLang)t).languages)
      add(a);
}

/**
 * Add a language. Does nothing if the language is in the buffer.
 * Does not allow adding the same language twice. 
 * Languages are regarded case insensitive.
 * @param lang
 */
public void add(String lang)
{
   for(String a : languages)
      if(a.equalsIgnoreCase(lang))
         return;
   languages.add(lang);
}

/**
 * Remove a language. Does nothing it language is not in the buffer.
 * Languages are regarded case insensitive and must not exist twice.
 * @param lang
 */
public void removeLang(String lang)
{
   for(int i = languages.size() - 1; i >= 0; i--)
   {
      if(!languages.get(i).equalsIgnoreCase(lang))
         continue;
      languages.remove(i);
      return;
   }
}

public String toString()
{
   return SUtl.sprint(TOSTRING, super.toString(), SUtl.join(languages), scriptType);
}
}
