package basics.dictionaries;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import basics.filesystem.file.LineReader;
import basics.filesystem.file.LineWriter;
import basics.testing.Test;
import basics.unexpected.Problem;
import basics.utl.SysUtl;

public class Termset
{
Set<String> terms = new HashSet<String>();

public void add(String term)
{
   terms.add(term);
}

public void remove(String term)
{
   terms.remove(term);
}

public boolean contains(String term)
{
   if(terms.contains(term))
   {
      return true;
   }
   else
      return false;
}

public Iterator<String> iterator()
{
   return terms.iterator();
}

public Iterator<String> sortedIterator()
{
   List<String> list = new ArrayList<String>();
   list.addAll(terms);
   Collections.sort(list);
   return Collections.unmodifiableList(list).iterator();
}

public int size()
{
   return terms.size();
}

public String toString()
{
   return size() + " terms in dictionary.";
}

public static Termset loadFromFile(String file)
{
   Termset termset = new Termset();
   LineReader reader = new LineReader(file);
   if(reader.open())
   {
      while(reader.hasLine())
         termset.add(reader.nextLineTrimNotNull());
      reader.close();
      SysUtl.trace(termset.size() + " entries from " + file);
   }
   else
      SysUtl.trace("File not found: " + file);
   return termset;
}

public void saveToFile(String file) throws Problem
{
   LineWriter w = new LineWriter(file);
   if(!w.open(false))
      throw new Problem("Can't open stop file for writing: " + file);
   for(Iterator<String> iterator = sortedIterator(); iterator.hasNext();)
      w.write(iterator.next());
   w.close();
}

public static void unittest()
{
   Termset t = new Termset();
   t.add("a");
   t.add("c");
   t.add("b");
   Test.assertTrue(t.size() == 3, "size not 3");
   Iterator<String> i = t.sortedIterator();
   Test.assertTrue(i.hasNext(), "next/1 failed");
   Test.assertEqualsTrue(i.next(), "a", "1 not a");
   Test.assertTrue(i.hasNext(), "next/2 failed");
   Test.assertEqualsTrue(i.next(), "b", "2 not b");
   Test.assertTrue(i.hasNext(), "next/3 failed");
   Test.assertEqualsTrue(i.next(), "c", "3 not c");
   t.remove("b");
   t.remove("");
   Test.assertTrue(t.size() == 2, "size not 2");
}
}
